You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
8.9 KiB
273 lines
8.9 KiB
/*globals rabbitmq_test_bindings : false, |
|
rabbitmq_bindings_to_remove : false, |
|
rabbitmq_expected_results_before_remove: false, |
|
rabbitmq_expected_results_after_remove : false, |
|
rabbitmq_expected_results_after_remove_all : false, |
|
rabbitmq_expected_results_after_clear : false, |
|
describe: false, |
|
beforeEach: false, |
|
it: false */ |
|
/*jslint node: true */ |
|
"use strict"; |
|
|
|
var expect = require('chai').expect, |
|
qlobber = require('..'); |
|
|
|
describe('qlobber-dedup', function () |
|
{ |
|
var matcher; |
|
|
|
beforeEach(function (done) |
|
{ |
|
matcher = new qlobber.QlobberDedup(); |
|
done(); |
|
}); |
|
|
|
if (Array.from === undefined) |
|
{ |
|
Array.from = function (s) |
|
{ |
|
var a = []; |
|
s.forEach(function (v) |
|
{ |
|
a[a.length] = v; |
|
}); |
|
return a; |
|
}; |
|
} |
|
|
|
function add_bindings(bindings, mapper) |
|
{ |
|
mapper = mapper || function (topic) { return topic; }; |
|
|
|
bindings.forEach(function (topic_val) |
|
{ |
|
matcher.add(topic_val[0], mapper(topic_val[1])); |
|
}); |
|
} |
|
|
|
function get_trie(matcher, t) |
|
{ |
|
t = t || matcher.get_trie(); |
|
var k, r = {}; |
|
for (k of t.keys()) |
|
{ |
|
if (k === '.') |
|
{ |
|
r[k] = Array.from(t.get(k)); |
|
} |
|
else |
|
{ |
|
r[k] = get_trie(matcher, t.get(k)); |
|
} |
|
} |
|
return r; |
|
} |
|
|
|
it('should support adding bindings', function () |
|
{ |
|
add_bindings(rabbitmq_test_bindings); |
|
|
|
expect(get_trie(matcher)).to.eql({"a":{"b":{"c":{".":["t1","t20"]},"b":{"c":{".":["t4"]},".":["t14"]},".":["t15"]},"*":{"c":{".":["t2"]},".":["t9"]},"#":{"b":{".":["t3"]},".":["t11"],"#":{".":["t12"]}}},"#":{".":["t5"],"#":{".":["t6"],"#":{".":["t24"]}},"b":{".":["t7"],"#":{".":["t26"]}},"*":{"#":{".":["t22"]}}},"*":{"*":{".":["t8"],"*":{".":["t18"]}},"b":{"c":{".":["t10"]}},"#":{".":["t21"],"#":{".":["t23"]}},".":["t25"]},"b":{"b":{"c":{".":["t13"]}},"c":{".":["t16"]}},"":{".":["t17"]},"vodka":{"martini":{".":["t19"]}}}); |
|
}); |
|
|
|
it('should pass rabbitmq test', function () |
|
{ |
|
add_bindings(rabbitmq_test_bindings); |
|
|
|
rabbitmq_expected_results_before_remove.forEach(function (test) |
|
{ |
|
expect(Array.from(matcher.match(test[0])).sort(), test[0]).to.eql( |
|
test[1].sort()); |
|
}); |
|
}); |
|
|
|
it('should support removing bindings', function () |
|
{ |
|
add_bindings(rabbitmq_test_bindings); |
|
|
|
rabbitmq_bindings_to_remove.forEach(function (i) |
|
{ |
|
matcher.remove(rabbitmq_test_bindings[i-1][0], |
|
rabbitmq_test_bindings[i-1][1]); |
|
}); |
|
|
|
expect(get_trie(matcher)).to.eql({"a":{"b":{"c":{".":["t20"]},"b":{"c":{".":["t4"]},".":["t14"]},".":["t15"]},"*":{"c":{".":["t2"]},".":["t9"]},"#":{"b":{".":["t3"]},"#":{".":["t12"]}}},"#":{"#":{".":["t6"],"#":{".":["t24"]}},"b":{".":["t7"],"#":{".":["t26"]}},"*":{"#":{".":["t22"]}}},"*":{"*":{".":["t8"],"*":{".":["t18"]}},"b":{"c":{".":["t10"]}},"#":{"#":{".":["t23"]}},".":["t25"]},"b":{"b":{"c":{".":["t13"]}},"c":{".":["t16"]}},"":{".":["t17"]}}); |
|
|
|
rabbitmq_expected_results_after_remove.forEach(function (test) |
|
{ |
|
expect(Array.from(matcher.match(test[0])).sort(), test[0]).to.eql( |
|
test[1].sort()); |
|
}); |
|
|
|
/*jslint unparam: true */ |
|
var remaining = rabbitmq_test_bindings.filter(function (topic_val, i) |
|
{ |
|
return rabbitmq_bindings_to_remove.indexOf(i + 1) < 0; |
|
}); |
|
/*jslint unparam: false */ |
|
|
|
remaining.forEach(function (topic_val) |
|
{ |
|
matcher.remove(topic_val[0], topic_val[1]); |
|
}); |
|
|
|
expect(matcher.get_trie()).to.eql({}); |
|
|
|
rabbitmq_expected_results_after_clear.forEach(function (test) |
|
{ |
|
expect(Array.from(matcher.match(test[0])).sort(), test[0]).to.eql( |
|
test[1].sort()); |
|
}); |
|
}); |
|
|
|
it('should support clearing the bindings', function () |
|
{ |
|
add_bindings(rabbitmq_test_bindings); |
|
|
|
matcher.clear(); |
|
|
|
rabbitmq_expected_results_after_clear.forEach(function (test) |
|
{ |
|
expect(Array.from(matcher.match(test[0])), test[0]).to.eql( |
|
test[1].sort()); |
|
}); |
|
}); |
|
|
|
it('should support removing all values for a topic', function () |
|
{ |
|
add_bindings(rabbitmq_test_bindings); |
|
|
|
rabbitmq_bindings_to_remove.forEach(function (i) |
|
{ |
|
matcher.remove(rabbitmq_test_bindings[i-1][0]); |
|
}); |
|
|
|
expect(get_trie(matcher)).to.eql({"a":{"b":{"b":{"c":{".":["t4"]},".":["t14"]},".":["t15"]},"*":{"c":{".":["t2"]},".":["t9"]},"#":{"b":{".":["t3"]},"#":{".":["t12"]}}},"#":{"#":{".":["t6"],"#":{".":["t24"]}},"b":{".":["t7"],"#":{".":["t26"]}},"*":{"#":{".":["t22"]}}},"*":{"*":{".":["t8"],"*":{".":["t18"]}},"b":{"c":{".":["t10"]}},"#":{"#":{".":["t23"]}},".":["t25"]},"b":{"b":{"c":{".":["t13"]}},"c":{".":["t16"]}},"":{".":["t17"]}}); |
|
|
|
rabbitmq_expected_results_after_remove_all.forEach(function (test) |
|
{ |
|
expect(Array.from(matcher.match(test[0])).sort(), test[0]).to.eql( |
|
test[1].sort()); |
|
}); |
|
}); |
|
|
|
it('should support functions as values', function () |
|
{ |
|
add_bindings(rabbitmq_test_bindings, function (topic) |
|
{ |
|
return function () |
|
{ |
|
return topic; |
|
}; |
|
}); |
|
|
|
rabbitmq_expected_results_before_remove.forEach(function (test) |
|
{ |
|
expect(Array.from(matcher.match(test[0], test[0])).map(function (f) |
|
{ |
|
return f(); |
|
}).sort()).to.eql(test[1].sort()); |
|
}); |
|
}); |
|
|
|
it('should pass example in README', function () |
|
{ |
|
matcher.add('foo.*', 'it matched!'); |
|
expect(Array.from(matcher.match('foo.bar'))).to.eql(['it matched!']); |
|
}); |
|
|
|
it('should pass example in rabbitmq topic tutorial', function () |
|
{ |
|
matcher.add('*.orange.*', 'Q1'); |
|
matcher.add('*.*.rabbit', 'Q2'); |
|
matcher.add('lazy.#', 'Q2'); |
|
expect(['quick.orange.rabbit', |
|
'lazy.orange.elephant', |
|
'quick.orange.fox', |
|
'lazy.brown.fox', |
|
'lazy.pink.rabbit', |
|
'quick.brown.fox', |
|
'orange', |
|
'quick.orange.male.rabbit', |
|
'lazy.orange.male.rabbit'].map(function (topic) |
|
{ |
|
return Array.from(matcher.match(topic)).sort(); |
|
})).to.eql( |
|
[['Q1', 'Q2'], |
|
['Q1', 'Q2'], |
|
['Q1'], |
|
['Q2'], |
|
['Q2'], |
|
[], |
|
[], |
|
[], |
|
['Q2']]); |
|
}); |
|
|
|
it('should not remove anything if not previously added', function () |
|
{ |
|
matcher.add('foo.*', 'it matched!'); |
|
matcher.remove('foo'); |
|
matcher.remove('foo.*', 'something'); |
|
matcher.remove('bar.*'); |
|
expect(Array.from(matcher.match('foo.bar'))).to.eql(['it matched!']); |
|
}); |
|
|
|
it('should accept wildcards in match topics', function () |
|
{ |
|
matcher.add('foo.*', 'it matched!'); |
|
matcher.add('foo.#', 'it matched too!'); |
|
expect(Array.from(matcher.match('foo.*')).sort()).to.eql( |
|
['it matched too!', 'it matched!']); |
|
expect(Array.from(matcher.match('foo.#')).sort()).to.eql( |
|
['it matched too!', 'it matched!']); |
|
}); |
|
|
|
it('should be configurable', function () |
|
{ |
|
matcher = new qlobber.QlobberDedup({ |
|
separator: '/', |
|
wildcard_one: '+', |
|
wildcard_some: 'M' |
|
}); |
|
|
|
matcher.add('foo/+', 'it matched!'); |
|
matcher.add('foo/M', 'it matched too!'); |
|
expect(Array.from(matcher.match('foo/bar')).sort()).to.eql( |
|
['it matched too!', 'it matched!']); |
|
expect(Array.from(matcher.match('foo/bar/end')).sort()).to.eql( |
|
['it matched too!']); |
|
}); |
|
|
|
it('should de-duplicate', function () |
|
{ |
|
matcher.add('a.b', 'foo'); |
|
matcher.add('a.b', 'foo'); |
|
matcher.add('a.*', 'foo'); |
|
expect(get_trie(matcher)).to.eql({ a: { b: { '.': ['foo'] }, '*': { '.': ['foo'] } } }); |
|
expect(Array.from(matcher.match('a.b'))).to.eql(['foo']); |
|
}); |
|
|
|
it('should match expected number of topics', function () |
|
{ |
|
// under coverage this takes longer |
|
this.timeout(60000); |
|
|
|
var i, j, vals; |
|
|
|
for (i = 0; i < 60000; i += 1) |
|
{ |
|
for (j = 0; j < 5; j += 1) |
|
{ |
|
matcher.add('app.test.user.behrad.testTopic-' + j, i); |
|
} |
|
matcher.add('app.test.user.behrad.*', i); |
|
} |
|
|
|
vals = matcher.match('app.test.user.behrad.testTopic-0'); |
|
|
|
expect(vals.size).to.equal(60000); |
|
}); |
|
}); |
|
|
|
|