Welcome to mirror list, hosted at ThFree Co, Russian Federation.

rewire.test.js « test - github.com/twbs/rewire.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1f8ebf94ad18fea867f54fd953a3e9bd95ec43ec (plain)
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
124
125
126
127
128
129
130
131
132
133
134
135
"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 with both exports-styles (exports.bla = bla and module.exports = bla)", function () {
        var rewired,
            leaks = ["myPrivateVar"];

        rewired = rewire("./testModules/privateModules/privateModuleA.js", null, null, leaks);
        expect(rewired.__.myPrivateVar).to.be("Hello I'm very private");
        rewired = rewire("./testModules/privateModules/privateModuleB.js", null, null, leaks);
        expect(rewired.__.myPrivateVar).to.be("Hello I'm very private");
    });
    it("should leak private functions with both exports-styles (exports.bla = bla and module.exports = bla)", function () {
        var rewired,
            leaks = ["myPrivateFunction"];

        rewired = rewire("./testModules/privateModules/privateModuleA.js", null, null, leaks);
        expect(rewired.__.myPrivateFunction()).to.be("Hello I'm very private");
        rewired = rewire("./testModules/privateModules/privateModuleB.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);
    });
    describe("#reset", function () {
        it("should remove all rewired modules from cache", function () {
            var rewired = rewire("./testModules/B/moduleB.js");

            expect(require("./testModules/B/moduleB.js")).to.be(rewired);
            rewire.reset();
            expect(require("./testModules/B/moduleB.js")).not.to.be(rewired);
        });
    });
});