UNPKG

5.49 kBJavaScriptView Raw
1'use strict';
2
3module.exports = function (dbType, context) {
4 describe(dbType + ': $mod', function () {
5
6 beforeEach(function () {
7 return context.db.bulkDocs([
8 { name: 'Mario', _id: 'mario', rank: 5, series: 'Mario', debut: 1981, awesome: true },
9 { name: 'Jigglypuff', _id: 'puff', rank: 8, series: 'Pokemon', debut: 1996,
10 awesome: false },
11 { name: 'Link', rank: 10, _id: 'link', series: 'Zelda', debut: 1986, awesome: true },
12 { name: 'Donkey Kong', rank: 7, _id: 'dk', series: 'Mario', debut: 1981, awesome: false },
13 { name: 'Pikachu', series: 'Pokemon', _id: 'pikachu', rank: 1, debut: 1996, awesome: true },
14 { name: 'Captain Falcon', _id: 'falcon', rank: 4, series: 'F-Zero', debut: 1990,
15 awesome: true },
16 { name: 'Luigi', rank: 11, _id: 'luigi', series: 'Mario', debut: 1983, awesome: false },
17 { name: 'Fox', _id: 'fox', rank: 3, series: 'Star Fox', debut: 1993, awesome: true },
18 { name: 'Ness', rank: 9, _id: 'ness', series: 'Earthbound', debut: 1994, awesome: true },
19 { name: 'Samus', rank: 12, _id: 'samus', series: 'Metroid', debut: 1986, awesome: true },
20 { name: 'Yoshi', _id: 'yoshi', rank: 6, series: 'Mario', debut: 1990, awesome: true },
21 { name: 'Kirby', _id: 'kirby', series: 'Kirby', rank: 2, debut: 1992, awesome: true },
22 { name: 'Master Hand', _id: 'master_hand', series: 'Smash Bros', rank: 0, debut: 1999,
23 awesome: false }
24 ]);
25 });
26
27 it('should get all even values', function () {
28 var db = context.db;
29 var index = {
30 "index": {
31 "fields": ["name"]
32 }
33 };
34 return db.createIndex(index).then(function () {
35 return db.find({
36 selector: {
37 name: {$gte: null},
38 rank: {$mod: [2, 0]}
39 },
40 sort: ['name']
41 }).then(function (resp) {
42 var docs = resp.docs.map(function (doc) {
43 delete doc._rev;
44 return doc;
45 });
46
47 docs.should.deep.equal([
48 { name: 'Captain Falcon', _id: 'falcon', rank: 4, series: 'F-Zero', debut: 1990,
49 awesome: true },
50 { name: 'Jigglypuff', _id: 'puff', rank: 8, series: 'Pokemon', debut: 1996,
51 awesome: false },
52 { name: 'Kirby', _id: 'kirby', series: 'Kirby', rank: 2, debut: 1992, awesome: true },
53 { name: 'Link', rank: 10, _id: 'link', series: 'Zelda', debut: 1986, awesome: true },
54 { name: 'Master Hand', _id: 'master_hand', series: 'Smash Bros', rank: 0, debut: 1999,
55 awesome: false },
56 { name: 'Samus', rank: 12, _id: 'samus', series: 'Metroid', debut: 1986,
57 awesome: true },
58 { name: 'Yoshi', _id: 'yoshi', rank: 6, series: 'Mario', debut: 1990, awesome: true },
59 ]);
60 });
61 });
62 });
63
64 it('should return error for zero divisor', function () {
65 var db = context.db;
66 var index = {
67 "index": {
68 "fields": ["name"]
69 }
70 };
71 return db.createIndex(index).then(function () {
72 return db.find({
73 selector: {
74 name: {$gte: null},
75 rank: {$mod: [0, 0]}
76 },
77 sort: ['name']
78 })
79 .catch(function (err) {
80 if (dbType === 'http') {
81 err.message.should.match(/Database encountered an unknown error/);
82 return;
83 }
84
85 err.message.should.match(/Bad divisor/);
86 });
87 });
88 });
89
90 it('should return error for non-integer divisor', function () {
91 var db = context.db;
92 var index = {
93 "index": {
94 "fields": ["name"]
95 }
96 };
97 return db.createIndex(index).then(function () {
98 return db.find({
99 selector: {
100 name: {$gte: null},
101 rank: {$mod: ['a', 0]}
102 },
103 sort: ['name']
104 })
105 .catch(function (err) {
106 if (dbType === 'http') {
107 err.reason.should.match(/Bad argument for operator/);
108 return;
109 }
110
111 err.message.should.match(/Divisor is not an integer/);
112 });
113 });
114 });
115
116 it('should return error for non-integer modulus', function () {
117 var db = context.db;
118 var index = {
119 "index": {
120 "fields": ["name"]
121 }
122 };
123 return db.createIndex(index).then(function () {
124 return db.find({
125 selector: {
126 name: {$gte: null},
127 rank: {$mod: [1, 'a']}
128 },
129 sort: ['name']
130 })
131 .catch(function (err) {
132 if (dbType === 'http') {
133 err.reason.should.match(/Bad argument for operator/);
134 return;
135 }
136
137 err.message.should.match(/Modulus is not an integer/);
138 });
139 });
140 });
141
142 it('should return empty docs for non-integer field', function () {
143 var db = context.db;
144 var index = {
145 "index": {
146 "fields": ["name"]
147 }
148 };
149 return db.createIndex(index).then(function () {
150 return db.find({
151 selector: {
152 name: {$gte: null},
153 awesome: {$mod: [2, 0]}
154 },
155 sort: ['name']
156 }).then(function (resp) {
157 var docs = resp.docs.map(function (doc) {
158 delete doc._rev;
159 return doc;
160 });
161
162 docs.should.deep.equal([]);
163 });
164 });
165 });
166 });
167};