1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
"use strict"; // run code in ES5 strict mode
var path = require("path"),
expect = require("expect.js"),
rewire = require("../lib/index.js");
var testModules = [
path.resolve(__dirname, "./testModules/index.js"),
path.resolve(__dirname, "./testModules/A/moduleA.js"),
path.resolve(__dirname, "./testModules/B/moduleB.js"),
path.resolve(__dirname, "./testModules/C/moduleC.js")
];
function cleanRequireCache() {
var i;
for (i = 0; i < testModules.length; i++) {
delete require.cache[testModules[i]];
}
}
describe("#rewire", function () {
beforeEach(cleanRequireCache); // ensuring a clean test environment
it("should work like require() when omitting all other params", function () {
expect(rewire("./testModules/A/moduleA.js")).to.be(require("./testModules/A/moduleA.js"));
});
it("should require all mocks", function () {
var rewired,
fsMock = {},
mocks = {},
moduleBMock = {},
moduleCMock = {},
toSrcMock = {},
indexMock = {};
mocks["fs"] = fsMock;
mocks[path.resolve(__dirname, "./testModules/B/moduleB.js")] = moduleBMock;
mocks["../C/moduleC.js"] = moduleCMock;
mocks["toSrc"] = toSrcMock;
mocks["../"] = indexMock;
rewired = rewire("./testModules/A/moduleA.js", mocks);
expect(rewired.fs).to.be(fsMock);
expect(rewired.b).to.be(moduleBMock);
expect(rewired.c).to.be(moduleCMock);
expect(rewired.toSrc).to.be(toSrcMock);
expect(rewired.index).to.be(indexMock);
});
it("should inject object modifications", function () {
var rewired,
injections = {
process: {
argv: ["arg1", "arg2", "arg3"]
},
console: 123
};
rewired = rewire("./testModules/A/moduleA.js", null, injections);
rewired.exportAll();
expect(rewired.process).not.to.be(process);
expect(process.argv).not.to.eql(injections.process.argv);
expect(rewired.process).to.eql(injections.process);
expect(rewired.console).to.be(123);
});
it("should inject custom scripts", function () {
var rewired,
script = "var console = 456;";
rewired = rewire("./testModules/A/moduleA.js", null, script);
rewired.exportAll();
expect(rewired.console).to.be(456);
});
it("should leak private variables", function () {
var rewired,
leaks = ["myPrivateVar"];
rewired = rewire("./testModules/A/moduleA.js", null, null, leaks);
expect(rewired.__.myPrivateVar).to.be("Hello I'm very private");
});
it("should leak private functions", function () {
var rewired,
leaks = ["myPrivateFunction"];
rewired = rewire("./testModules/A/moduleA.js", null, null, leaks);
expect(rewired.__.myPrivateFunction()).to.be("Hello I'm very private");
});
it("should leak nothing on demand", function () {
var rewired;
rewired = rewire("./testModules/A/moduleA.js");
expect(rewired.__).to.be(undefined);
});
it("should cache the rewired module", function () {
var rewired;
rewired = rewire("./testModules/B/moduleB.js");
rewired.requireIndex();
expect(rewired.index.b).to.be(rewired);
cleanRequireCache();
rewired = rewire("./testModules/B/moduleB.js", null, null, null, true);
rewired.requireIndex();
expect(rewired.index.b).to.be(rewired);
});
it("should not cache the rewired module on demand", function () {
var rewired;
rewired = rewire("./testModules/B/moduleB.js", null, null, null, false);
rewired.requireIndex();
expect(rewired.index.b).not.to.be(rewired);
});
it("should not influence the original node require if nothing has been required within the rewired module", function () {
var moduleCMock = {},
moduleB,
mocks = {
"../C/moduleC.js": moduleCMock
};
rewire("./testModules/C/moduleC.js", mocks); // nothing happens here because moduleC doesn't require anything
moduleB = require("./testModules/A/moduleA.js"); // if restoring the original node require didn't worked, the mock would be applied now
expect(moduleB.c).not.to.be(moduleCMock);
});
});
|