Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Core: Test all factory use cases from intro.js
There is a lot of logic in intro.js; now we test four cases: 1. (implicitly, via QUnit tests) A real browser with window being the global 2. Browserify where there are both global & window variables. 3. Node with jsdom where window is passed manually to the jQuery factory. 4. Pure Node with incorrect window passed; jQuery should throw then. Previously the second & fourth case was not tested and the third was tested in a way that interfered with the main test environment. We now also test if in the Browserify case we're not creating a jQuery global by default. Fixes gh-2181 Closes gh-2234
- Loading branch information
Showing
with
152 additions
and 44 deletions.
- +2 −2 Gruntfile.js
- +16 −0 build/tasks/lib/spawn_test.js
- +0 −16 build/tasks/node_smoke_test.js
- +31 −0 build/tasks/node_smoke_tests.js
- +0 −20 build/tasks/promises-aplus-tests.js
- +13 −0 build/tasks/promises_aplus_tests.js
- +2 −1 package.json
- +19 −0 test/node_smoke_tests/document_missing.js
- +17 −0 test/node_smoke_tests/document_passed.js
- +20 −0 test/node_smoke_tests/document_present_originally.js
- +17 −0 test/node_smoke_tests/lib/ensure_global_not_created.js
- +11 −0 test/node_smoke_tests/lib/ensure_jquery.js
- +4 −5 test/{promises-aplus-adapter.js → promises_aplus_adapter.js}
| @@ -0,0 +1,16 @@ | ||
| /* jshint node: true */ | ||
|
|
||
| "use strict"; | ||
|
|
||
| // Run Node with provided parameters: the first one being the Grunt | ||
| // done function and latter ones being files to be tested. | ||
| // See the comment in ../node_smoke_tests.js for more information. | ||
| module.exports = function spawnTest( done ) { | ||
| var testPaths = [].slice.call( arguments, 1 ), | ||
| spawn = require( "win-spawn" ); | ||
|
|
||
| spawn( "node", testPaths, { stdio: "inherit" } ) | ||
| .on( "close", function( code ) { | ||
| done( code === 0 ); | ||
| } ); | ||
| } ; |
| @@ -0,0 +1,31 @@ | ||
| module.exports = function( grunt ) { | ||
|
|
||
| "use strict"; | ||
|
|
||
| var fs = require( "fs" ), | ||
| spawnTest = require( "./lib/spawn_test.js" ), | ||
| testsDir = "./test/node_smoke_tests/", | ||
| nodeSmokeTests = []; | ||
|
|
||
| // Fire up all tests defined in test/node_smoke_tests/*.js in spawned sub-processes. | ||
| // All the files under test/node_smoke_tests/*.js are supposed to exit with 0 code | ||
| // on success or another one on failure. Spawning in sub-processes is | ||
| // important so that the tests & the main process don't interfere with | ||
| // each other, e.g. so that they don't share the require cache. | ||
|
|
||
| fs.readdirSync( testsDir ) | ||
| .filter( function( testFilePath ) { | ||
| return fs.statSync( testsDir + testFilePath ).isFile(); | ||
| } ) | ||
| .forEach( function( testFilePath ) { | ||
| var taskName = "node_" + testFilePath.replace( /\.js$/, "" ); | ||
|
|
||
| grunt.registerTask( taskName, function() { | ||
| spawnTest( this.async(), "test/node_smoke_tests/" + testFilePath ); | ||
| } ); | ||
|
|
||
| nodeSmokeTests.push( taskName ); | ||
| } ); | ||
|
|
||
| grunt.registerTask( "node_smoke_tests", nodeSmokeTests ); | ||
| }; |
| @@ -0,0 +1,13 @@ | ||
| module.exports = function( grunt ) { | ||
|
|
||
| "use strict"; | ||
|
|
||
| var spawnTest = require( "./lib/spawn_test.js" ); | ||
|
|
||
| grunt.registerTask( "promises_aplus_tests", function() { | ||
| spawnTest( this.async(), | ||
| "./node_modules/.bin/promises-aplus-tests", | ||
| "test/promises_aplus_adapter.js" | ||
| ); | ||
| } ); | ||
| }; |
| @@ -0,0 +1,19 @@ | ||
| /* jshint node: true */ | ||
|
|
||
| "use strict"; | ||
|
|
||
| var ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ), | ||
| jQueryFactory = require( "../../dist/jquery.js" ); | ||
|
|
||
| try { | ||
| jQueryFactory( {} ); | ||
| console.error( "The jQuery factory should reject window without a document" ); | ||
| process.exit( 1 ); | ||
| } catch ( e ) { | ||
| if ( e.message === "jQuery requires a window with a document" ) { | ||
| ensureGlobalNotCreated( module.exports ); | ||
| process.exit( 0 ); | ||
| } | ||
| console.error( "An unexpected error thrown; message: ", e.message ); | ||
| process.exit( 1 ); | ||
| } |
| @@ -0,0 +1,17 @@ | ||
| /* jshint node: true */ | ||
|
|
||
| "use strict"; | ||
|
|
||
| require( "jsdom" ).env( "", function( errors, window ) { | ||
| if ( errors ) { | ||
| console.error( errors ); | ||
| process.exit( 1 ); | ||
| } | ||
|
|
||
| var ensureJQuery = require( "./lib/ensure_jquery" ), | ||
| ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ), | ||
| jQuery = require( "../../dist/jquery.js" )( window ); | ||
|
|
||
| ensureJQuery( jQuery ); | ||
| ensureGlobalNotCreated( module.exports ); | ||
| } ); |
| @@ -0,0 +1,20 @@ | ||
| /* jshint node: true */ | ||
|
|
||
| "use strict"; | ||
|
|
||
| require( "jsdom" ).env( "", function( errors, window ) { | ||
| if ( errors ) { | ||
| console.error( errors ); | ||
| process.exit( 1 ); | ||
| } | ||
|
|
||
| // Pretend the window is a global. | ||
| global.window = window; | ||
|
|
||
| var ensureJQuery = require( "./lib/ensure_jquery" ), | ||
| ensureGlobalNotCreated = require( "./lib/ensure_global_not_created" ), | ||
| jQuery = require( "../../dist/jquery.js" ); | ||
|
|
||
| ensureJQuery( jQuery ); | ||
| ensureGlobalNotCreated( module.exports, window ); | ||
| } ); |
| @@ -0,0 +1,17 @@ | ||
| /* jshint node: true */ | ||
|
|
||
| "use strict"; | ||
|
|
||
| // Ensure the jQuery property on global/window/module.exports/etc. was not | ||
| // created in a CommonJS environment. | ||
| // `global` is always checked in addition to passed parameters. | ||
| module.exports = function ensureGlobalNotCreated() { | ||
| var args = [].slice.call( arguments ).concat( global ); | ||
|
|
||
| args.forEach( function( object ) { | ||
| if ( object.jQuery ) { | ||
| console.error( "A jQuery global was created in a CommonJS environment." ); | ||
| process.exit( 1 ); | ||
| } | ||
| } ); | ||
| }; |
| @@ -0,0 +1,11 @@ | ||
| /* jshint node: true */ | ||
|
|
||
| "use strict"; | ||
|
|
||
| // Check if the object we got is the jQuery object by invoking a basic API. | ||
| module.exports = function ensureJQuery( jQuery ) { | ||
| if ( !/^jQuery/.test( jQuery.expando ) ) { | ||
| console.error( "jQuery.expando was not detected, the jQuery bootstrap process has failed" ); | ||
| process.exit( 1 ); | ||
| } | ||
| }; |