'use strict'; var assert = require('chai').assert; var Ruler = require('../lib/ruler'); describe('Ruler', function () { it('should replace rule (.at)', function () { var ruler = new Ruler(); var res = 0; ruler.push('test', function foo() { res = 1; }); ruler.at('test', function bar() { res = 2; }); var rules = ruler.getRules(''); assert.strictEqual(rules.length, 1); rules[0](); assert.strictEqual(res, 2); }); it('should inject before/after rule', function () { var ruler = new Ruler(); var res = 0; ruler.push('test', function foo() { res = 1; }); ruler.before('test', 'before_test', function fooBefore() { res = -10; }); ruler.after('test', 'after_test', function fooAfter() { res = 10; }); var rules = ruler.getRules(''); assert.strictEqual(rules.length, 3); rules[0](); assert.strictEqual(res, -10); rules[1](); assert.strictEqual(res, 1); rules[2](); assert.strictEqual(res, 10); }); it('should enable/disable rule', function () { var rules, ruler = new Ruler(); ruler.push('test', function foo() {}); ruler.push('test2', function bar() {}); rules = ruler.getRules(''); assert.strictEqual(rules.length, 2); ruler.disable('test'); rules = ruler.getRules(''); assert.strictEqual(rules.length, 1); ruler.disable('test2'); rules = ruler.getRules(''); assert.strictEqual(rules.length, 0); ruler.enable('test'); rules = ruler.getRules(''); assert.strictEqual(rules.length, 1); ruler.enable('test2'); rules = ruler.getRules(''); assert.strictEqual(rules.length, 2); }); it('should enable/disable multiple rule', function () { var rules, ruler = new Ruler(); ruler.push('test', function foo() {}); ruler.push('test2', function bar() {}); ruler.disable([ 'test', 'test2' ]); rules = ruler.getRules(''); assert.strictEqual(rules.length, 0); ruler.enable([ 'test', 'test2' ]); rules = ruler.getRules(''); assert.strictEqual(rules.length, 2); }); it('should enable rules by whitelist', function () { var rules, ruler = new Ruler(); ruler.push('test', function foo() {}); ruler.push('test2', function bar() {}); ruler.enableOnly('test'); rules = ruler.getRules(''); assert.strictEqual(rules.length, 1); }); it('should support multiple chains', function () { var rules, ruler = new Ruler(); ruler.push('test', function foo() {}); ruler.push('test2', function bar() {}, { alt: [ 'alt1' ] }); ruler.push('test2', function bar() {}, { alt: [ 'alt1', 'alt2' ] }); rules = ruler.getRules(''); assert.strictEqual(rules.length, 3); rules = ruler.getRules('alt1'); assert.strictEqual(rules.length, 2); rules = ruler.getRules('alt2'); assert.strictEqual(rules.length, 1); }); it('should fail on invalid rule name', function () { var ruler = new Ruler(); ruler.push('test', function foo() {}); assert.throws(function () { ruler.at('invalid name', function bar() {}); }); assert.throws(function () { ruler.before('invalid name', function bar() {}); }); assert.throws(function () { ruler.after('invalid name', function bar() {}); }); assert.throws(function () { ruler.enable('invalid name'); }); assert.throws(function () { ruler.disable('invalid name'); }); }); it('should not fail on invalid rule name in silent mode', function () { var ruler = new Ruler(); ruler.push('test', function foo() {}); assert.doesNotThrow(function () { ruler.enable('invalid name', true); }); assert.doesNotThrow(function () { ruler.enableOnly('invalid name', true); }); assert.doesNotThrow(function () { ruler.disable('invalid name', true); }); }); });