node/test/sequential/test-module-loading.js
James M Snell 1fdbaed2f2
test: begin normalizing fixtures use
Adds a new `../common/fixtures' module to begin normalizing
`test/fixtures` use. Our test code is a bit inconsistent with
regards to use of the fixtures directory. Some code uses
`path.join()`, some code uses string concats, some other
code uses template strings, etc. In mnay cases, significant
duplication of code is seen when accessing fixture files, etc.

This updates many (but by no means all) of the tests in the
test suite to use the new consistent API. There are still
many more to update, which would make an excelent Code-n-Learn
exercise.

Backport-PR-URL: https://github.com/nodejs/node/pull/16265
PR-URL: https://github.com/nodejs/node/pull/14332
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
2017-10-26 00:21:30 -04:00

302 lines
9.7 KiB
JavaScript

'use strict';
require('../common');
const assert = require('assert');
const path = require('path');
const fs = require('fs');
const backslash = /\\/g;
console.error('load test-module-loading.js');
// assert that this is the main module.
assert.strictEqual(require.main.id, '.', 'main module should have id of \'.\'');
assert.strictEqual(require.main, module, 'require.main should === module');
assert.strictEqual(process.mainModule, module,
'process.mainModule should === module');
// assert that it's *not* the main module in the required module.
require('../fixtures/not-main-module.js');
// require a file with a request that includes the extension
const a_js = require('../fixtures/a.js');
assert.strictEqual(42, a_js.number);
// require a file without any extensions
const foo_no_ext = require('../fixtures/foo');
assert.strictEqual('ok', foo_no_ext.foo);
const a = require('../fixtures/a');
const c = require('../fixtures/b/c');
const d = require('../fixtures/b/d');
const d2 = require('../fixtures/b/d');
// Absolute
const d3 = require(path.join(__dirname, '../fixtures/b/d'));
// Relative
const d4 = require('../fixtures/b/d');
assert.strictEqual(false, false, 'testing the test program.');
assert.ok(a.A instanceof Function);
assert.strictEqual('A', a.A());
assert.ok(a.C instanceof Function);
assert.strictEqual('C', a.C());
assert.ok(a.D instanceof Function);
assert.strictEqual('D', a.D());
assert.ok(d.D instanceof Function);
assert.strictEqual('D', d.D());
assert.ok(d2.D instanceof Function);
assert.strictEqual('D', d2.D());
assert.ok(d3.D instanceof Function);
assert.strictEqual('D', d3.D());
assert.ok(d4.D instanceof Function);
assert.strictEqual('D', d4.D());
assert.ok((new a.SomeClass()) instanceof c.SomeClass);
console.error('test index.js modules ids and relative loading');
const one = require('../fixtures/nested-index/one');
const two = require('../fixtures/nested-index/two');
assert.notStrictEqual(one.hello, two.hello);
console.error('test index.js in a folder with a trailing slash');
const three = require('../fixtures/nested-index/three');
const threeFolder = require('../fixtures/nested-index/three/');
const threeIndex = require('../fixtures/nested-index/three/index.js');
assert.strictEqual(threeFolder, threeIndex);
assert.notStrictEqual(threeFolder, three);
console.error('test package.json require() loading');
assert.throws(
function() {
require('../fixtures/packages/invalid');
},
/^SyntaxError: Error parsing .+: Unexpected token , in JSON at position 1$/
);
assert.strictEqual(require('../fixtures/packages/main').ok, 'ok',
'Failed loading package');
assert.strictEqual(require('../fixtures/packages/main-index').ok, 'ok',
'Failed loading package with index.js in main subdir');
console.error('test cycles containing a .. path');
const root = require('../fixtures/cycles/root');
const foo = require('../fixtures/cycles/folder/foo');
assert.strictEqual(root.foo, foo);
assert.strictEqual(root.sayHello(), root.hello);
console.error('test node_modules folders');
// asserts are in the fixtures files themselves,
// since they depend on the folder structure.
require('../fixtures/node_modules/foo');
console.error('test name clashes');
// this one exists and should import the local module
const my_path = require('../fixtures/path');
assert.ok(my_path.path_func instanceof Function);
// this one does not exist and should throw
assert.throws(function() { require('./utils'); },
/^Error: Cannot find module '.\/utils'$/);
let errorThrown = false;
try {
require('../fixtures/throws_error');
} catch (e) {
errorThrown = true;
assert.strictEqual('blah', e.message);
}
assert.strictEqual(path.dirname(__filename), __dirname);
console.error('load custom file types with extensions');
require.extensions['.test'] = function(module, filename) {
let content = fs.readFileSync(filename).toString();
assert.strictEqual('this is custom source\n', content);
content = content.replace('this is custom source',
'exports.test = \'passed\'');
module._compile(content, filename);
};
assert.strictEqual(require('../fixtures/registerExt').test, 'passed');
// unknown extension, load as .js
assert.strictEqual(require('../fixtures/registerExt.hello.world').test,
'passed');
console.error('load custom file types that return non-strings');
require.extensions['.test'] = function(module) {
module.exports = {
custom: 'passed'
};
};
assert.strictEqual(require('../fixtures/registerExt2').custom, 'passed');
assert.strictEqual(require('../fixtures/foo').foo, 'ok',
'require module with no extension');
// Should not attempt to load a directory
try {
require('../fixtures/empty');
} catch (err) {
assert.strictEqual(err.message, 'Cannot find module \'../fixtures/empty\'');
}
// Check load order is as expected
console.error('load order');
const loadOrder = '../fixtures/module-load-order/';
const msg = 'Load order incorrect.';
require.extensions['.reg'] = require.extensions['.js'];
require.extensions['.reg2'] = require.extensions['.js'];
assert.strictEqual(require(`${loadOrder}file1`).file1, 'file1', msg);
assert.strictEqual(require(`${loadOrder}file2`).file2, 'file2.js', msg);
try {
require(`${loadOrder}file3`);
} catch (e) {
// Not a real .node module, but we know we require'd the right thing.
assert.ok(/file3\.node/.test(e.message.replace(backslash, '/')));
}
assert.strictEqual(require(`${loadOrder}file4`).file4, 'file4.reg', msg);
assert.strictEqual(require(`${loadOrder}file5`).file5, 'file5.reg2', msg);
assert.strictEqual(require(`${loadOrder}file6`).file6, 'file6/index.js', msg);
try {
require(`${loadOrder}file7`);
} catch (e) {
assert.ok(/file7\/index\.node/.test(e.message.replace(backslash, '/')));
}
assert.strictEqual(require(`${loadOrder}file8`).file8, 'file8/index.reg', msg);
assert.strictEqual(require(`${loadOrder}file9`).file9, 'file9/index.reg2', msg);
// make sure that module.require() is the same as
// doing require() inside of that module.
const parent = require('../fixtures/module-require/parent/');
const child = require('../fixtures/module-require/child/');
assert.strictEqual(child.loaded, parent.loaded);
// #1357 Loading JSON files with require()
const json = require('../fixtures/packages/main/package.json');
assert.deepStrictEqual(json, {
name: 'package-name',
version: '1.2.3',
main: 'package-main-module'
});
// now verify that module.children contains all the different
// modules that we've required, and that all of them contain
// the appropriate children, and so on.
const children = module.children.reduce(function red(set, child) {
let id = path.relative(path.dirname(__dirname), child.id);
id = id.replace(backslash, '/');
set[id] = child.children.reduce(red, {});
return set;
}, {});
assert.deepStrictEqual(children, {
'common/index.js': {
'common/fixtures.js': {}
},
'fixtures/not-main-module.js': {},
'fixtures/a.js': {
'fixtures/b/c.js': {
'fixtures/b/d.js': {},
'fixtures/b/package/index.js': {}
}
},
'fixtures/foo': {},
'fixtures/nested-index/one/index.js': {
'fixtures/nested-index/one/hello.js': {}
},
'fixtures/nested-index/two/index.js': {
'fixtures/nested-index/two/hello.js': {}
},
'fixtures/nested-index/three.js': {},
'fixtures/nested-index/three/index.js': {},
'fixtures/packages/main/package-main-module.js': {},
'fixtures/packages/main-index/package-main-module/index.js': {},
'fixtures/cycles/root.js': {
'fixtures/cycles/folder/foo.js': {}
},
'fixtures/node_modules/foo.js': {
'fixtures/node_modules/baz/index.js': {
'fixtures/node_modules/bar.js': {},
'fixtures/node_modules/baz/node_modules/asdf.js': {}
}
},
'fixtures/path.js': {},
'fixtures/throws_error.js': {},
'fixtures/registerExt.test': {},
'fixtures/registerExt.hello.world': {},
'fixtures/registerExt2.test': {},
'fixtures/empty.js': {},
'fixtures/module-load-order/file1': {},
'fixtures/module-load-order/file2.js': {},
'fixtures/module-load-order/file3.node': {},
'fixtures/module-load-order/file4.reg': {},
'fixtures/module-load-order/file5.reg2': {},
'fixtures/module-load-order/file6/index.js': {},
'fixtures/module-load-order/file7/index.node': {},
'fixtures/module-load-order/file8/index.reg': {},
'fixtures/module-load-order/file9/index.reg2': {},
'fixtures/module-require/parent/index.js': {
'fixtures/module-require/child/index.js': {
'fixtures/module-require/child/node_modules/target.js': {}
}
},
'fixtures/packages/main/package.json': {}
});
// require() must take string, and must be truthy
assert.throws(function() {
console.error('require non-string');
require({ foo: 'bar' });
}, /path must be a string/);
assert.throws(function() {
console.error('require empty string');
require('');
}, /missing path/);
process.on('exit', function() {
assert.ok(a.A instanceof Function);
assert.strictEqual('A done', a.A());
assert.ok(a.C instanceof Function);
assert.strictEqual('C done', a.C());
assert.ok(a.D instanceof Function);
assert.strictEqual('D done', a.D());
assert.ok(d.D instanceof Function);
assert.strictEqual('D done', d.D());
assert.ok(d2.D instanceof Function);
assert.strictEqual('D done', d2.D());
assert.strictEqual(true, errorThrown);
console.log('exit');
});
// #1440 Loading files with a byte order marker.
assert.strictEqual(42, require('../fixtures/utf8-bom.js'));
assert.strictEqual(42, require('../fixtures/utf8-bom.json'));
// Error on the first line of a module should
// have the correct line number
assert.throws(function() {
require('../fixtures/test-error-first-line-offset.js');
}, function(err) {
return /test-error-first-line-offset.js:1:/.test(err.stack);
}, 'Expected appearance of proper offset in Error stack');