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: 2df19e0ed77f416fafb8974507616e794dafb39b (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
"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);
    });
});