103 lines
2.9 KiB
JavaScript
103 lines
2.9 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
var tap = require('tap')
|
||
|
|
, test = tap.test
|
||
|
|
, sinon = require('sinon')
|
||
|
|
, shimmer = require('../index.js')
|
||
|
|
;
|
||
|
|
|
||
|
|
var outsider = 0;
|
||
|
|
function counter() { return ++outsider; }
|
||
|
|
|
||
|
|
var generator = {
|
||
|
|
inc : counter
|
||
|
|
};
|
||
|
|
|
||
|
|
test("should unwrap safely", function (t) {
|
||
|
|
t.plan(9);
|
||
|
|
|
||
|
|
t.equal(counter, generator.inc, "basic function equality testing should work");
|
||
|
|
t.doesNotThrow(function () { generator.inc(); });
|
||
|
|
t.equal(1, outsider, "calls have side effects");
|
||
|
|
|
||
|
|
function wrapper(original) {
|
||
|
|
return function () {
|
||
|
|
return original.apply(this, arguments);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
shimmer.wrap(generator, 'inc', wrapper);
|
||
|
|
|
||
|
|
t.doesNotEqual(counter, generator.inc, "function should be wrapped");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () { generator.inc(); });
|
||
|
|
t.equal(2, outsider, "original function has still been called");
|
||
|
|
|
||
|
|
shimmer.unwrap(generator, 'inc');
|
||
|
|
t.equal(counter, generator.inc, "basic function equality testing should work");
|
||
|
|
t.doesNotThrow(function () { generator.inc(); });
|
||
|
|
t.equal(3, outsider, "original function has still been called");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("shouldn't throw on double unwrapping", function (t) {
|
||
|
|
t.plan(6);
|
||
|
|
|
||
|
|
t.equal(counter, generator.inc, "basic function equality testing should work");
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.withArgs("no original to unwrap to -- " +
|
||
|
|
"has inc already been unwrapped?")
|
||
|
|
.once();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
function wrapper(original) {
|
||
|
|
return function () {
|
||
|
|
return original.apply(this, arguments);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
shimmer.wrap(generator, 'inc', wrapper);
|
||
|
|
|
||
|
|
t.doesNotEqual(counter, generator.inc, "function should be wrapped");
|
||
|
|
|
||
|
|
shimmer.unwrap(generator, 'inc');
|
||
|
|
t.equal(counter, generator.inc, "basic function equality testing should work");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () { shimmer.unwrap(generator, 'inc'); },
|
||
|
|
"should double unwrap without issue");
|
||
|
|
t.equal(counter, generator.inc, "function is unchanged after unwrapping");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("unwrap called with no arguments", function (t) {
|
||
|
|
t.plan(2);
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.twice();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
t.doesNotThrow(function () { shimmer.unwrap(); }, "should log instead of throwing");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("unwrap called with module but no name", function (t) {
|
||
|
|
t.plan(2);
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.twice();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
t.doesNotThrow(function () { shimmer.unwrap({}); }, "should log instead of throwing");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|