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 | ||
|  | 	} | ||
|  | }; |