mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			244 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
"use strict";
 | 
						|
 | 
						|
const should = require("should");
 | 
						|
const sinon = require("sinon");
 | 
						|
const ContextReplacementPlugin = require("../lib/ContextReplacementPlugin");
 | 
						|
const applyPluginWithOptions = require("./helpers/applyPluginWithOptions");
 | 
						|
const PluginEnvironment = require("./helpers/PluginEnvironment");
 | 
						|
 | 
						|
describe("ContextReplacementPlugin", () => {
 | 
						|
	it("has apply function", () => (new ContextReplacementPlugin()).apply.should.be.a.Function());
 | 
						|
 | 
						|
	it("should consume resourceRegExp as regular expression", () => {
 | 
						|
		let instance = new ContextReplacementPlugin(/selector/, "mock", "mock", "mock");
 | 
						|
		should(instance.resourceRegExp instanceof RegExp).be.exactly(true);
 | 
						|
	});
 | 
						|
 | 
						|
	it("should consume newContentResource as function", () => {
 | 
						|
		let instance = new ContextReplacementPlugin(/selector/, () => {}, "mock", "mock");
 | 
						|
		should(instance.newContentCallback).be.a.Function();
 | 
						|
	});
 | 
						|
 | 
						|
	it("should consume newContentResource as not an string or function", () => {
 | 
						|
		let instance = new ContextReplacementPlugin(/selector/, 42, "newContentRecursive", "newContentRegExp");
 | 
						|
 | 
						|
		should(instance.resourceRegExp instanceof RegExp).be.exactly(true);
 | 
						|
		should(instance.newContentResource).be.exactly(undefined);
 | 
						|
		should(instance.newContentRecursive).be.exactly(undefined);
 | 
						|
		should(instance.newContentRegExp).be.exactly(42);
 | 
						|
	});
 | 
						|
 | 
						|
	it("should consume newContentResource as an object", () => {
 | 
						|
		let instance = new ContextReplacementPlugin(/selector/, "newResource", {
 | 
						|
			test: "obj"
 | 
						|
		}, /selector/);
 | 
						|
 | 
						|
		should(instance.resourceRegExp instanceof RegExp).be.exactly(true);
 | 
						|
		should(instance.newContentResource).be.exactly("newResource");
 | 
						|
		should(instance.newContentRecursive).be.exactly(undefined);
 | 
						|
		should(instance.newContentRegExp).be.exactly(undefined);
 | 
						|
		should(instance.newContentCreateContextMap).be.a.Function();
 | 
						|
 | 
						|
		let x = (nothing, obj) => {
 | 
						|
			should(obj.test).be.exactly("obj")
 | 
						|
		};
 | 
						|
 | 
						|
		let spy = sinon.spy(x);
 | 
						|
 | 
						|
		instance.newContentCreateContextMap(undefined, spy);
 | 
						|
 | 
						|
		should(spy.called).be.exactly(true)
 | 
						|
 | 
						|
	});
 | 
						|
 | 
						|
	it("should consume newContentResource as an object", () => {
 | 
						|
		let instance = new ContextReplacementPlugin(/selector/, "newResource", () => {}, /selector/);
 | 
						|
 | 
						|
		should(instance.resourceRegExp instanceof RegExp).be.exactly(true);
 | 
						|
		should(instance.newContentResource).be.exactly("newResource");
 | 
						|
		should(instance.newContentRecursive).be.exactly(undefined);
 | 
						|
		should(instance.newContentRegExp).be.exactly(undefined);
 | 
						|
		should(instance.newContentCreateContextMap).be.a.Function();
 | 
						|
	});
 | 
						|
 | 
						|
	describe("when applied", () => {
 | 
						|
 | 
						|
		describe("when before resolve is called", () => {
 | 
						|
			it("default call", () => {
 | 
						|
				let obj = buildPluginWithParams(/selector/, "./folder", true, /filter/);
 | 
						|
 | 
						|
				let x = (nothing, result) => {
 | 
						|
					should(result.request).be.exactly('./folder')
 | 
						|
					should(result.dependencies[0].critical).be.exactly(false)
 | 
						|
					should(result.recursive).be.exactly(true)
 | 
						|
					should(result.regExp instanceof RegExp).be.exactly(true)
 | 
						|
				};
 | 
						|
 | 
						|
				let spy = sinon.spy(x);
 | 
						|
 | 
						|
				obj.beforeResolve.handler({
 | 
						|
					request: "selector",
 | 
						|
					dependencies: [{
 | 
						|
						critical: true
 | 
						|
					}]
 | 
						|
				}, spy)
 | 
						|
 | 
						|
				should(spy.called).be.exactly(true)
 | 
						|
			});
 | 
						|
 | 
						|
			it("default call with newContentCallback as a function", () => {
 | 
						|
				let obj = buildPluginWithParams(/selector/, (result) => {
 | 
						|
					should(result.request).be.exactly('selector')
 | 
						|
					should(result.dependencies[0].critical).be.exactly(false)
 | 
						|
					should(result.recursive).be.exactly(undefined)
 | 
						|
					should(result.regExp).be.exactly(undefined)
 | 
						|
				}, true, /filter/);
 | 
						|
 | 
						|
				let x = (nothing, result) => {
 | 
						|
					should(result.request).be.exactly('selector')
 | 
						|
					should(result.dependencies[0].critical).be.exactly(false)
 | 
						|
					should(result.recursive).be.exactly(undefined)
 | 
						|
					should(result.regExp).be.exactly(undefined)
 | 
						|
				};
 | 
						|
 | 
						|
				let spy = sinon.spy(x);
 | 
						|
 | 
						|
				obj.beforeResolve.handler({
 | 
						|
					request: "selector",
 | 
						|
					dependencies: [{
 | 
						|
						critical: false
 | 
						|
					}]
 | 
						|
				}, spy)
 | 
						|
 | 
						|
				should(spy.called).be.exactly(true)
 | 
						|
			});
 | 
						|
 | 
						|
			it("call when result is false", () => {
 | 
						|
				let obj = buildPluginWithParams(/selector/, "./folder", true, /filter/);
 | 
						|
 | 
						|
				let x = (nothing, result) => {
 | 
						|
					should(result).be.Undefined();
 | 
						|
				};
 | 
						|
 | 
						|
				let spy = sinon.spy(x);
 | 
						|
 | 
						|
				obj.beforeResolve.handler(false, spy);
 | 
						|
 | 
						|
				should(spy.called).be.exactly(true)
 | 
						|
			});
 | 
						|
		});
 | 
						|
 | 
						|
		describe("when after resolve is called", () => {
 | 
						|
			it("default call where regex is correct", () => {
 | 
						|
				let obj = buildPluginWithParams(/selector/, "./folder", true, /filter/);
 | 
						|
 | 
						|
				let x = (nothing, result) => {
 | 
						|
					result.resource.should.containEql('selector')
 | 
						|
					result.resource.should.containEql('folder')
 | 
						|
				};
 | 
						|
 | 
						|
				let spy = sinon.spy(x);
 | 
						|
 | 
						|
				obj.afterResolve.handler({
 | 
						|
					resource: "selector",
 | 
						|
					dependencies: [{
 | 
						|
						critical: true
 | 
						|
					}]
 | 
						|
				}, spy);
 | 
						|
 | 
						|
				should(spy.called).be.exactly(true)
 | 
						|
			});
 | 
						|
 | 
						|
			it("default call where regex is incorrect", () => {
 | 
						|
				let obj = buildPluginWithParams(/selector/, "./folder", true, /filter/);
 | 
						|
 | 
						|
				let x = (nothing, result) => {
 | 
						|
					result.resource.should.containEql('importwontwork')
 | 
						|
				};
 | 
						|
 | 
						|
				let spy = sinon.spy(x);
 | 
						|
 | 
						|
				obj.afterResolve.handler({
 | 
						|
					resource: "importwontwork",
 | 
						|
					dependencies: [{
 | 
						|
						critical: true
 | 
						|
					}]
 | 
						|
				}, spy);
 | 
						|
 | 
						|
				should(spy.called).be.exactly(true)
 | 
						|
			});
 | 
						|
 | 
						|
			it("default call where regex is correct", () => {
 | 
						|
				let obj = buildPluginWithParams(/selector/, (result) => {
 | 
						|
					//noop
 | 
						|
				}, true, /filter/);
 | 
						|
 | 
						|
				let x = (nothing, result) => {
 | 
						|
					result.resource.should.equal('selector')
 | 
						|
				};
 | 
						|
 | 
						|
				let spy = sinon.spy(x);
 | 
						|
 | 
						|
				obj.afterResolve.handler({
 | 
						|
					resource: "selector",
 | 
						|
					dependencies: [{
 | 
						|
						critical: true
 | 
						|
					}]
 | 
						|
				}, spy);
 | 
						|
 | 
						|
				should(spy.called).be.exactly(true)
 | 
						|
			});
 | 
						|
 | 
						|
			it("default call where regex is correct and using function as newContent Resource", () => {
 | 
						|
				let obj = buildPluginWithParams(/selector/, (result) => {
 | 
						|
					result.resource = "imadifferentselector"
 | 
						|
				}, true, /filter/);
 | 
						|
 | 
						|
				let x = (nothing, result) => {
 | 
						|
					result.resource.should.containEql('selector')
 | 
						|
					result.resource.should.containEql('imadifferentselector')
 | 
						|
				};
 | 
						|
 | 
						|
				let spy = sinon.spy(x);
 | 
						|
 | 
						|
				obj.afterResolve.handler({
 | 
						|
					resource: "selector",
 | 
						|
					dependencies: [{
 | 
						|
						critical: true
 | 
						|
					}]
 | 
						|
				}, spy);
 | 
						|
 | 
						|
				should(spy.called).be.exactly(true)
 | 
						|
			});
 | 
						|
 | 
						|
		})
 | 
						|
 | 
						|
	});
 | 
						|
});
 | 
						|
 | 
						|
let buildPluginWithParams = (resourceRegExp, newContentResource, newContentRecursive, newContentRegExp) => {
 | 
						|
	let instance = new ContextReplacementPlugin(resourceRegExp, newContentResource, newContentRecursive, newContentRegExp);
 | 
						|
 | 
						|
	let pluginEnvironment = new PluginEnvironment();
 | 
						|
	instance.apply(pluginEnvironment.getEnvironmentStub());
 | 
						|
 | 
						|
	let contextModuleFactory = pluginEnvironment.getEventBindings()[0];
 | 
						|
	pluginEnvironment.getEventBindings().length.should.be.exactly(1)
 | 
						|
 | 
						|
	let contextModuleFactoryPluginEnv = new PluginEnvironment();
 | 
						|
 | 
						|
	contextModuleFactory.handler(contextModuleFactoryPluginEnv.getEnvironmentStub());
 | 
						|
 | 
						|
	let contextModuleFactoryEventBindings = contextModuleFactoryPluginEnv.getEventBindings();
 | 
						|
	contextModuleFactoryPluginEnv.getEventBindings().length.should.be.exactly(2);
 | 
						|
 | 
						|
	let beforeResolve = contextModuleFactoryEventBindings[0];
 | 
						|
	let afterResolve = contextModuleFactoryEventBindings[1];
 | 
						|
 | 
						|
	return {
 | 
						|
		contextModuleFactory,
 | 
						|
		beforeResolve,
 | 
						|
		afterResolve
 | 
						|
	}
 | 
						|
};
 |