1 | 'use strict';
|
2 |
|
3 | module.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 | };
|