UNPKG

9.63 kBJavaScriptView Raw
1'use strict'
2
3var test = require('tape')
4var bloomrun = require('./')
5
6test('null is returned if pattern is not found', function (t) {
7 t.plan(3)
8
9 var instance = bloomrun()
10 var pattern = { cmd: 'set-policy' }
11
12 t.equal(instance.lookup(pattern), null)
13 t.equal(instance.lookup([]), null)
14 t.equal(instance.lookup(new Date()), null)
15})
16
17test('pattern is returned on match', function (t) {
18 t.plan(1)
19
20 var instance = bloomrun()
21 var pattern = { cmd: 'set-policy' }
22
23 instance.add(pattern)
24
25 t.deepEqual(instance.lookup(pattern), pattern)
26})
27
28test('default match is supported', function (t) {
29 t.plan(1)
30
31 var instance = bloomrun()
32 var payload = { cmd: 'set-policy' }
33
34 instance.default(payload)
35
36 t.deepEqual(instance.lookup({foo: 'bar'}), payload)
37})
38
39test('payload is returned instead of pattern if it exists', function (t) {
40 t.plan(1)
41
42 var instance = bloomrun()
43 var pattern = { prefs: 'userId' }
44 var payload = '1234'
45
46 instance.add(pattern, payload)
47
48 t.deepEqual(instance.lookup(pattern), payload)
49})
50
51test('regexp support in the lookup', function (t) {
52 t.plan(1)
53
54 var instance = bloomrun()
55 var pattern = { prefs: 'userId' }
56 var payload = '1234'
57
58 instance.add(pattern, payload)
59
60 t.deepEqual(instance.lookup({ prefs: /user.*/ }), payload)
61})
62
63test('regexp plus props support in the lookup', function (t) {
64 t.plan(1)
65
66 var instance = bloomrun()
67 var pattern = { cmd: 'save', prefs: 'userId' }
68 var payload = '1234'
69
70 instance.add(pattern, payload)
71
72 t.deepEqual(instance.lookup({ cmd: 'save', prefs: /user.*/ }), payload)
73})
74
75test('regexp support in the pattern', function (t) {
76 t.plan(1)
77
78 var instance = bloomrun()
79 var pattern = { prefs: /user.*/ }
80 var payload = '1234'
81
82 instance.add(pattern, payload)
83
84 t.deepEqual(instance.lookup({ prefs: 'userId' }), payload)
85})
86
87test('regexp plus props support in the pattern', function (t) {
88 t.plan(1)
89
90 var instance = bloomrun()
91 var pattern = { cmd: 'save', prefs: /user.*/ }
92 var payload = '1234'
93
94 instance.add(pattern, payload)
95
96 t.deepEqual(instance.lookup({ cmd: 'save', prefs: 'userId' }), payload)
97})
98
99test('deep pattern matching', function (t) {
100 t.plan(1)
101
102 var instance = bloomrun()
103 var pattern = { role: 'sum', tnx: { side: 'buy' } }
104 var payload = '1234'
105
106 instance.add(pattern, payload)
107
108 t.deepEqual(instance.lookup({
109 role: 'sum',
110 tnx: {
111 side: 'buy',
112 amount: 100
113 }
114 }), payload)
115})
116
117test('functions are supported as payloads', function (t) {
118 t.plan(1)
119
120 var instance = bloomrun()
121 var pattern = { prefs: 'userId' }
122 var payload = function () { return '1234' }
123
124 instance.add(pattern, payload)
125
126 t.deepEqual(instance.lookup(pattern)(), payload())
127})
128
129test('partial matching should not be supported', function (t) {
130 t.plan(2)
131
132 var instance = bloomrun()
133 var pattern = {
134 cmd: 'add-user',
135 username: 'mcollina'
136 }
137
138 instance.add(pattern)
139
140 t.notOk(instance.lookup({ cmd: 'add-user' }))
141 t.notOk(instance.lookup({ username: 'mcollina' }))
142})
143
144// see https://github.com/mcollina/bloomrun/issues/18
145test('do not match if not fully matching - #18', function (t) {
146 t.plan(1)
147
148 var instance = bloomrun()
149
150 instance.add({ role: 'auth', cmd: 'login' }, 42)
151
152 instance.add({ role: 'auth', query: 'isAuthenticated' }, 24)
153
154 t.equal(instance.lookup({
155 role: 'auth', query: 'isAuthenticated'
156 }), 24)
157})
158
159test('multiple matches are supported', function (t) {
160 t.plan(1)
161
162 var instance = bloomrun()
163 var firstPattern = {
164 group: '123',
165 userId: 'ABC'
166 }
167 var secondPattern = {
168 group: '123',
169 userId: 'ABC'
170 }
171
172 instance.add(firstPattern)
173 instance.add(secondPattern)
174
175 t.deepEqual(instance.list({ group: '123', userId: 'ABC' }), [firstPattern, secondPattern])
176})
177
178test('iterator based retrieval is supported', function (t) {
179 t.plan(3)
180
181 var instance = bloomrun()
182 var pattern1 = { hello: 'world' }
183 var pattern2 = { hello: 'world' }
184
185 instance.add(pattern1)
186 instance.add(pattern2)
187
188 var iterator = instance.iterator({ hello: 'world' })
189
190 t.equal(iterator.next(), pattern1)
191 t.equal(iterator.next(), pattern2)
192
193 t.notOk(iterator.next())
194})
195
196test('removing patterns is supported', function (t) {
197 t.plan(2)
198
199 var instance = bloomrun()
200 var pattern = { group: '123' }
201
202 instance.add(pattern)
203
204 t.deepEqual(instance.lookup({ group: '123' }), pattern)
205
206 instance.remove(pattern)
207
208 t.equal(instance.lookup({ group: '123' }), null)
209})
210
211test('remove deletes all matches', function (t) {
212 t.plan(2)
213
214 var instance = bloomrun()
215 var pattern = { group: '123' }
216
217 instance.add(pattern)
218 instance.add(pattern, 'TEST')
219
220 t.deepEqual(instance.list({ group: '123' }), [pattern, 'TEST'])
221
222 instance.remove(pattern)
223
224 t.equal(instance.lookup({ group: '123' }), null)
225})
226
227test('payload is considered when removing', function (t) {
228 t.plan(2)
229
230 var instance = bloomrun()
231 var pattern = { group: '123' }
232
233 instance.add(pattern, 'XYZ')
234 instance.add(pattern, '567')
235
236 t.deepEqual(instance.list({ group: '123' }), ['XYZ', '567'])
237
238 instance.remove(pattern, '567')
239
240 t.equal(instance.lookup({ group: '123' }), 'XYZ')
241})
242
243test('complex payloads are matched correctly', function (t) {
244 t.plan(2)
245
246 var instance = bloomrun()
247 var pattern = { group: '123' }
248
249 function payloadOne () { }
250 function payloadTwo () { }
251
252 instance.add(pattern, payloadOne)
253 instance.add(pattern, payloadTwo)
254 instance.add(pattern, '567')
255
256 t.deepEqual(instance.list({ group: '123' }), [payloadOne, payloadTwo, '567'])
257
258 instance.remove(pattern, payloadOne)
259 instance.remove(pattern, payloadTwo)
260
261 t.equal(instance.lookup({ group: '123' }), '567')
262})
263
264test('removing causes filters to be rebuilt', function (t) {
265 t.plan(2)
266
267 var instance = bloomrun()
268 var firstPattern = { group: '123' }
269 var secondPattern = { group: '123' }
270
271 instance.add(firstPattern, 42)
272 instance.add(secondPattern, 24)
273
274 t.equal(instance.lookup({ group: '123' }), 42)
275
276 instance.remove(firstPattern, 42)
277
278 t.equal(instance.lookup({ group: '123' }), 24)
279})
280
281test('patterns can be listed while using payloads', function (t) {
282 t.plan(1)
283
284 var instance = bloomrun()
285 var pattern = { group: '123' }
286
287 function payloadOne () { }
288 function payloadTwo () { }
289
290 instance.add(pattern, payloadOne)
291 instance.add(pattern, payloadTwo)
292
293 t.deepEqual(instance.list({ group: '123' }, { patterns: true }), [pattern, pattern])
294})
295
296test('patterns can be looked up while using payloads', function (t) {
297 t.plan(1)
298
299 var instance = bloomrun()
300 var pattern1 = { group: '123' }
301 var pattern2 = { group: '123' }
302
303 function payloadOne () { }
304 function payloadTwo () { }
305
306 instance.add(pattern1, payloadOne)
307 instance.add(pattern2, payloadTwo)
308
309 t.equal(instance.lookup({ group: '123' }, { patterns: true }), pattern1)
310})
311
312test('iterators can be used to fetch only patterns', function (t) {
313 t.plan(3)
314
315 var instance = bloomrun()
316 var pattern1 = { group: '123' }
317 var pattern2 = { group: '123' }
318
319 function payloadOne () { }
320 function payloadTwo () { }
321
322 instance.add(pattern1, payloadOne)
323 instance.add(pattern2, payloadTwo)
324
325 var iterator = instance.iterator({ group: '123' }, { patterns: true })
326
327 t.equal(iterator.next(), pattern1)
328 t.equal(iterator.next(), pattern2)
329 t.equal(iterator.next(), null)
330})
331
332test('listing all payloads', function (t) {
333 t.plan(1)
334
335 var instance = bloomrun()
336 var pattern1 = { group: '123', userId: 'ABC' }
337 var pattern2 = { group: '123', userId: 'DEF' }
338
339 function payloadOne () { }
340 function payloadTwo () { }
341
342 instance.add(pattern1, payloadOne)
343 instance.add(pattern2, payloadTwo)
344
345 t.deepEqual(instance.list(), [payloadOne, payloadTwo])
346})
347
348test('listing all patterns', function (t) {
349 t.plan(1)
350
351 var instance = bloomrun()
352 var pattern1 = { group: '123', userId: 'ABC' }
353 var pattern2 = { group: '123', userId: 'DEF' }
354
355 function payloadOne () { }
356 function payloadTwo () { }
357
358 instance.add(pattern1, payloadOne)
359 instance.add(pattern2, payloadTwo)
360
361 t.deepEqual(instance.list(null, { patterns: true }), [pattern1, pattern2])
362})
363
364test('matching numbers', function (t) {
365 t.plan(2)
366
367 var instance = bloomrun()
368 var pattern = {
369 something: 'else',
370 answer: 42
371 }
372
373 instance.add(pattern)
374
375 t.deepEqual(instance.lookup(pattern), pattern)
376 t.deepEqual(instance.list(pattern), [pattern])
377})
378
379test('order support', function (t) {
380 t.plan(1)
381
382 var instance = bloomrun()
383 var pattern1 = { group: '123' }
384 var pattern2 = { group: '123', another: 'value' }
385
386 function payloadOne () { }
387 function payloadTwo () { }
388
389 instance.add(pattern1, payloadOne)
390 instance.add(pattern2, payloadTwo)
391
392 t.equal(instance.lookup({ group: '123', another: 'value' }), payloadOne)
393})
394
395test('depth support', function (t) {
396 t.plan(1)
397
398 var instance = bloomrun({ indexing: 'depth' })
399 var pattern1 = { group: '123' }
400 var pattern2 = { group: '123', another: 'value' }
401
402 function payloadOne () { }
403 function payloadTwo () { }
404
405 instance.add(pattern1, payloadOne)
406 instance.add(pattern2, payloadTwo)
407
408 t.equal(instance.lookup({ group: '123', another: 'value' }), payloadTwo)
409})
410
411test('recursive depth support', function (t) {
412 t.plan(1)
413
414 var instance = bloomrun({ indexing: 'depth' })
415 var pattern1 = { group: '123', some: { key: 'value' } }
416 var pattern2 = {
417 group: '123',
418 some: {
419 key: 'value',
420 a: 'b'
421 }
422 }
423
424 function payloadOne () { }
425 function payloadTwo () { }
426
427 instance.add(pattern1, payloadOne)
428 instance.add(pattern2, payloadTwo)
429
430 t.equal(instance.lookup({
431 group: '123',
432 some: {
433 key: 'value',
434 a: 'b',
435 c: 'd'
436 }
437 }), payloadTwo)
438})