Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80679 views
1
/**
2
* Copyright (c) 2014, Facebook, Inc. All rights reserved.
3
*
4
* This source code is licensed under the BSD-style license found in the
5
* LICENSE file in the root directory of this source tree. An additional grant
6
* of patent rights can be found in the PATENTS file in the same directory.
7
*/
8
'use strict';
9
10
jest.autoMockOff();
11
12
var path = require('path');
13
var q = require('q');
14
var utils = require('../../lib/utils');
15
16
describe('HasteModuleLoader', function() {
17
var HasteModuleLoader;
18
var mockEnvironment;
19
var resourceMap;
20
21
var CONFIG = utils.normalizeConfig({
22
name: 'HasteModuleLoader-tests',
23
rootDir: path.resolve(__dirname, 'test_root')
24
});
25
26
function buildLoader() {
27
if (!resourceMap) {
28
return HasteModuleLoader.loadResourceMap(CONFIG).then(function(map) {
29
resourceMap = map;
30
return buildLoader();
31
});
32
} else {
33
return q(new HasteModuleLoader(CONFIG, mockEnvironment, resourceMap));
34
}
35
}
36
37
beforeEach(function() {
38
HasteModuleLoader = require('../HasteModuleLoader');
39
40
mockEnvironment = {
41
global: {
42
console: {},
43
mockClearTimers: jest.genMockFn()
44
},
45
runSourceText: jest.genMockFn().mockImplementation(function(codeStr) {
46
/* jshint evil:true */
47
return (new Function('return ' + codeStr))();
48
})
49
};
50
});
51
52
describe('requireMock', function() {
53
pit('uses manual mocks before attempting to automock', function() {
54
return buildLoader().then(function(loader) {
55
var exports = loader.requireMock(null, 'ManuallyMocked');
56
expect(exports.isManualMockModule).toBe(true);
57
});
58
});
59
60
pit('stores and re-uses manual mock exports', function() {
61
return buildLoader().then(function(loader) {
62
var exports = loader.requireMock(null, 'ManuallyMocked');
63
exports.setModuleStateValue('test value');
64
exports = loader.requireMock(null, 'ManuallyMocked');
65
expect(exports.getModuleStateValue()).toBe('test value');
66
});
67
});
68
69
pit('automocks @providesModule modules without a manual mock', function() {
70
return buildLoader().then(function(loader) {
71
var exports = loader.requireMock(null, 'RegularModule');
72
expect(exports.getModuleStateValue._isMockFunction).toBe(true);
73
});
74
});
75
76
pit('automocks relative-path modules without a file extension', function() {
77
return buildLoader().then(function(loader) {
78
var exports = loader.requireMock(
79
__filename,
80
'./test_root/RegularModule'
81
);
82
expect(exports.getModuleStateValue._isMockFunction).toBe(true);
83
});
84
});
85
86
pit('automocks relative-path modules with a file extension', function() {
87
return buildLoader().then(function(loader) {
88
var exports = loader.requireMock(
89
__filename,
90
'./test_root/RegularModule.js'
91
);
92
expect(exports.getModuleStateValue._isMockFunction).toBe(true);
93
});
94
});
95
96
pit('just falls back when loading a native module', function() {
97
return buildLoader().then(function(loader) {
98
var error;
99
// Okay so this is a really WAT way to test this, but we
100
// are going to require an empty .node file which should
101
// throw an error letting us know that the file is too
102
// short. If it does not (it gives another error) then we
103
// are not correctly falling back to 'native' require.
104
try {
105
loader.requireMock(
106
__filename,
107
'./test_root/NativeModule.node'
108
);
109
} catch (e) {
110
error = e;
111
} finally {
112
expect(error.message).toContain('NativeModule.node: file too short');
113
}
114
});
115
});
116
117
pit('stores and re-uses automocked @providesModule exports', function() {
118
return buildLoader().then(function(loader) {
119
var exports = loader.requireMock(null, 'RegularModule');
120
exports.externalMutation = 'test value';
121
exports = loader.requireMock(null, 'RegularModule');
122
expect(exports.externalMutation).toBe('test value');
123
});
124
});
125
126
pit('stores and re-uses automocked relative-path modules', function() {
127
return buildLoader().then(function(loader) {
128
var exports = loader.requireMock(
129
__filename,
130
'./test_root/RegularModule'
131
);
132
exports.externalMutation = 'test value';
133
exports = loader.requireMock(
134
__filename,
135
'./test_root/RegularModule'
136
);
137
expect(exports.externalMutation).toBe('test value');
138
});
139
});
140
141
pit('multiple node core modules returns correct module', function() {
142
return buildLoader().then(function(loader) {
143
loader.requireMock(null, 'fs');
144
expect(loader.requireMock(null, 'events').EventEmitter).toBeDefined();
145
});
146
});
147
148
pit('throws on non-existant @providesModule modules', function() {
149
return buildLoader().then(function(loader) {
150
expect(function() {
151
loader.requireMock(null, 'DoesntExist');
152
}).toThrow();
153
});
154
});
155
156
pit('uses the closest manual mock when duplicates exist', function() {
157
return buildLoader().then(function(loader) {
158
var exports1 = loader.requireMock(
159
__dirname,
160
path.resolve(__dirname, './test_root/subdir1/MyModule')
161
);
162
expect(exports1.modulePath).toEqual(
163
'subdir1/__mocks__/MyModule.js'
164
);
165
166
var exports2 = loader.requireMock(
167
__dirname,
168
path.resolve(__dirname, './test_root/subdir2/MyModule')
169
);
170
expect(exports2.modulePath).toEqual(
171
'subdir2/__mocks__/MyModule.js'
172
);
173
});
174
});
175
});
176
});
177
178