From b4ed4d6df908723476291aee3b0d4c6120da8bdf Mon Sep 17 00:00:00 2001 From: Ben Holloway Date: Wed, 22 Aug 2018 21:51:11 +1000 Subject: [PATCH] added test for nested selectors, generalised some test filters --- package.json | 3 +- .../webpack.config.js | 3 +- test/cases/absolute-asset.js | 6 +- test/cases/adjacent-asset.js | 6 +- test/cases/common/partials.js | 10 +- test/cases/common/tests.js | 4 +- test/cases/deep-asset.js | 6 +- test/cases/http-asset.js | 6 +- test/cases/immediate-asset.js | 6 +- test/cases/misconfiguration.js | 18 +- test/cases/module-relative-asset.js | 6 +- test/cases/nested-import-mixed-quotes.js | 6 +- test/cases/root-relative-asset.js | 6 +- test/cases/selector-in-directive.postcss.js | 579 ++++++++++++++++++ test/cases/shallow-asset.js | 6 +- test/index.js | 8 +- test/lib/assert.js | 10 +- 17 files changed, 640 insertions(+), 49 deletions(-) create mode 100644 test/cases/selector-in-directive.postcss.js diff --git a/package.json b/package.json index 860b8f6..ef8845f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "scripts": { "lint": "jshint packages --exclude **/node_modules", "test:unit": "tape **/*.spec.js | tap-diff", - "test:e2e": "tape test | tap-diff" + "test:e2e": "tape test | tap-diff", + "debug:e2e": "node $NODE_DEBUG_OPTION $(npm bin)/tape test | tap-diff" }, "devDependencies": { "blue-tape": "^1.0.0", diff --git a/packages/resolve-url-loader/test/webpack4-sassloader7-sass4/webpack.config.js b/packages/resolve-url-loader/test/webpack4-sassloader7-sass4/webpack.config.js index b220b67..4682c31 100644 --- a/packages/resolve-url-loader/test/webpack4-sassloader7-sass4/webpack.config.js +++ b/packages/resolve-url-loader/test/webpack4-sassloader7-sass4/webpack.config.js @@ -70,7 +70,8 @@ module.exports = { map: !!JSON.parse(process.env.DEVTOOL), // the following optimisations are fine but e2e assertions are easier without them cssDeclarationSorter: false, - normalizeUrl: false + normalizeUrl: false, + discardUnused: false } }) ] diff --git a/test/cases/absolute-asset.js b/test/cases/absolute-asset.js index 8b17b55..7483fa0 100644 --- a/test/cases/absolute-asset.js +++ b/test/cases/absolute-asset.js @@ -12,7 +12,7 @@ const {all, testDefault, testAbsolute, testDebug, testKeepQuery, testRoot, testW const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const {moduleNotFound} = require('./common/partials'); const { - onlyVersion, onlyOS, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, + onlyMeta, onlyOS, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles, assertStdout } = require('../lib/assert'); @@ -88,10 +88,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({cwd, meta: {engine, asset, version: {webpack}}}) => { diff --git a/test/cases/adjacent-asset.js b/test/cases/adjacent-asset.js index 9bfb0dd..71fa602 100644 --- a/test/cases/adjacent-asset.js +++ b/test/cases/adjacent-asset.js @@ -12,7 +12,7 @@ const {testDefault, testAbsolute, testDebug, testKeepQuery, testWithLabel} = req const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const {moduleNotFound} = require('./common/partials'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles, assertStdout } = require('../lib/assert'); @@ -78,10 +78,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/cases/common/partials.js b/test/cases/common/partials.js index 61b9739..7985602 100644 --- a/test/cases/common/partials.js +++ b/test/cases/common/partials.js @@ -2,18 +2,18 @@ const {all, testDefault, testSilent} = require('./tests'); const {buildDevNormal, buildDevBail, buildProdNormal, buildProdBail} = require('./builds'); -const {onlyVersion, assertWebpackOk, assertWebpackNotOk, assertStdout} = require('../../lib/assert'); +const {onlyMeta, assertWebpackOk, assertWebpackNotOk, assertStdout} = require('../../lib/assert'); -// Allow 1-2 errors +// Allow 1-N errors // - webpack may repeat errors with a header line taken from the parent loader -const assertModuleNotFoundError = assertStdout('"Module not found" error')([1, 2])` +const assertModuleNotFoundError = assertStdout('"Module not found" error')([1, 100])` ^[ ]*ERROR[^\n]* [ ]*Module build failed(:|[^\n]*\n)[ ]*ModuleNotFoundError: Module not found: `; exports.moduleNotFound = all(testDefault, testSilent)( - onlyVersion('webpack=1')( + onlyMeta('meta.version.webpack ==1')( buildDevBail( assertWebpackNotOk ), @@ -29,7 +29,7 @@ exports.moduleNotFound = assertModuleNotFoundError ) ), - onlyVersion('webpack>1')( + onlyMeta('meta.version.webpack > 1')( buildDevNormal( assertWebpackNotOk, assertModuleNotFoundError diff --git a/test/cases/common/tests.js b/test/cases/common/tests.js index 88eaa61..025320c 100644 --- a/test/cases/common/tests.js +++ b/test/cases/common/tests.js @@ -4,7 +4,7 @@ const {join} = require('path'); const sequence = require('promise-compose'); const {test, layer, meta, env} = require('test-my-cli'); -const {onlyVersion, assertStderr} = require('../../lib/assert'); +const {onlyMeta, assertStderr} = require('../../lib/assert'); exports.all = (...tests) => (...rest) => sequence(...tests.map((test) => test(...rest))); @@ -56,7 +56,7 @@ exports.testDefault = (...rest) => // css-loader deprecated options.root around the time of webpack@4 exports.testAbsolute = (...rest) => - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( test( 'absolute=true', layer()( diff --git a/test/cases/deep-asset.js b/test/cases/deep-asset.js index 93a7298..bacb144 100644 --- a/test/cases/deep-asset.js +++ b/test/cases/deep-asset.js @@ -12,7 +12,7 @@ const {testDefault, testAbsolute, testDebug, testKeepQuery, testWithLabel} = req const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const {moduleNotFound} = require('./common/partials'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles, assertStdout } = require('../lib/assert'); @@ -78,10 +78,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/cases/http-asset.js b/test/cases/http-asset.js index 6ca5b85..fc39c49 100644 --- a/test/cases/http-asset.js +++ b/test/cases/http-asset.js @@ -11,7 +11,7 @@ const {withCacheBase} = require('../lib/higher-order'); const {testDefault, testAbsolute, testDebug, testKeepQuery} = require('./common/tests'); const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles } = require('../lib/assert'); @@ -77,10 +77,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/cases/immediate-asset.js b/test/cases/immediate-asset.js index 678326b..8be7931 100644 --- a/test/cases/immediate-asset.js +++ b/test/cases/immediate-asset.js @@ -12,7 +12,7 @@ const {testDefault, testAbsolute, testDebug, testKeepQuery, testWithLabel} = req const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const {moduleNotFound} = require('./common/partials'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles, assertStdout } = require('../lib/assert'); @@ -78,10 +78,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/cases/misconfiguration.js b/test/cases/misconfiguration.js index a1c34c3..dfbcc07 100644 --- a/test/cases/misconfiguration.js +++ b/test/cases/misconfiguration.js @@ -13,7 +13,7 @@ const { } = require('./common/tests'); const {buildDevNormal, buildDevBail, buildProdNormal, buildProdBail} = require('./common/builds'); const { - onlyVersion, assertWebpackOk, assertWebpackNotOk, assertNoErrors, assertNoMessages, assertContent, assertStdout + onlyMeta, assertWebpackOk, assertWebpackNotOk, assertNoErrors, assertNoMessages, assertContent, assertStdout } = require('../lib/assert'); const assertContentDev = compose(assertContent(/;\s*}/g, ';\n}'), outdent)` @@ -81,7 +81,7 @@ module.exports = test( }), testEngineFail( all(testDefault, testSilent)( - onlyVersion('webpack=1')( + onlyMeta('meta.version.webpack == 1')( buildDevBail( assertWebpackNotOk ), @@ -97,7 +97,7 @@ module.exports = test( assertCssError ) ), - onlyVersion('webpack>1')( + onlyMeta('meta.version.webpack > 1')( buildDevNormal( assertWebpackNotOk, assertCssError @@ -201,7 +201,7 @@ module.exports = test( ), testNonFunctionJoin( all(testDefault, testSilent)( - onlyVersion('webpack=1')( + onlyMeta('meta.version.webpack == 1')( buildDevBail( assertWebpackNotOk ), @@ -217,7 +217,7 @@ module.exports = test( assertNonFunctionJoinError ) ), - onlyVersion('webpack>1')( + onlyMeta('meta.version.webpack > 1')( buildDevNormal( assertWebpackNotOk, assertNonFunctionJoinError @@ -231,7 +231,7 @@ module.exports = test( ), testWrongArityJoin( all(testDefault, testSilent)( - onlyVersion('webpack=1')( + onlyMeta('meta.version.webpack == 1')( buildDevBail( assertWebpackNotOk ), @@ -247,7 +247,7 @@ module.exports = test( assertWrongArityJoinError ) ), - onlyVersion('webpack>1')( + onlyMeta('meta.version.webpack > 1')( buildDevNormal( assertWebpackNotOk, assertWrongArityJoinError @@ -291,7 +291,7 @@ module.exports = test( ), testNonExistentRoot( all(testDefault, testSilent)( - onlyVersion('webpack=1')( + onlyMeta('meta.version.webpack == 1')( buildDevBail( assertWebpackNotOk ), @@ -307,7 +307,7 @@ module.exports = test( assertNonExistentRootError ) ), - onlyVersion('webpack>1')( + onlyMeta('meta.version.webpack > 1')( buildDevNormal( assertWebpackNotOk, assertNonExistentRootError diff --git a/test/cases/module-relative-asset.js b/test/cases/module-relative-asset.js index 25d670f..c63b817 100644 --- a/test/cases/module-relative-asset.js +++ b/test/cases/module-relative-asset.js @@ -12,7 +12,7 @@ const {testDefault, testAbsolute, testDebug, testKeepQuery, testWithLabel} = req const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const {moduleNotFound} = require('./common/partials'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles } = require('../lib/assert'); @@ -78,10 +78,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/cases/nested-import-mixed-quotes.js b/test/cases/nested-import-mixed-quotes.js index 246143e..394e30a 100644 --- a/test/cases/nested-import-mixed-quotes.js +++ b/test/cases/nested-import-mixed-quotes.js @@ -11,7 +11,7 @@ const {withCacheBase} = require('../lib/higher-order'); const {testDefault, testAbsolute, testDebug, testKeepQuery} = require('./common/tests'); const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles } = require('../lib/assert'); @@ -61,10 +61,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/cases/root-relative-asset.js b/test/cases/root-relative-asset.js index 7c929c0..dcf588c 100644 --- a/test/cases/root-relative-asset.js +++ b/test/cases/root-relative-asset.js @@ -12,7 +12,7 @@ const {testDefault, testAbsolute, testDebug, testKeepQuery, testWithLabel} = req const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const {moduleNotFound} = require('./common/partials'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles, assertStdout } = require('../lib/assert'); @@ -78,10 +78,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/cases/selector-in-directive.postcss.js b/test/cases/selector-in-directive.postcss.js new file mode 100644 index 0000000..2164722 --- /dev/null +++ b/test/cases/selector-in-directive.postcss.js @@ -0,0 +1,579 @@ +'use strict'; + +const {join} = require('path'); +const compose = require('compose-function'); +const sequence = require('promise-compose'); +const outdent = require('outdent'); +const {test, layer, fs, env, cwd} = require('test-my-cli'); + +const {trim} = require('../lib/util'); +const {withRootBase, withCacheBase} = require('../lib/higher-order'); +const {testDefault, testAbsolute, testDebug, testKeepQuery, testWithLabel} = require('./common/tests'); +const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); +const {moduleNotFound} = require('./common/partials'); +const { + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles, assertStdout +} = require('../lib/assert'); + +const assertContentDev = compose(assertContent(/;\s*}/g, ';\n}'), outdent)` + @font-face { + .some-class-name { + src: url($0) format("embedded-opentype"), url($1) format("truetype"), url($2) format(woff), url($3) format(svg); + } } + + @media only screen { + .another-class-name { + single-quoted: url($4); + double-quoted: url($5); + unquoted: url($6); + query: url($7); + hash: url($8); + } } + `; + +const assertSourcemapDev = sequence( + assertSourceMapComment(true), + assertSourceMapContent(({meta: {engine}}) => { + switch (true) { + case (engine === 'postcss'): + return outdent` + /src/feature/index.scss + 1:1 + 2:3->3:5 + 5:48->3:178 + + /src/index.scss + 1:1->2:3 + 3:2->3:180 + 4:1->5:1 + 5:3->6:3 + 6:5->7:5 6:41->7:44 + 7:5->8:5 7:41->8:44 + 8:5->9:5 8:34->9:37 + 9:5->10:5 9:37->10:34 + 10:5->11:5 10:35->11:33 + 11:4->11:35 + `; + default: + throw new Error('unexpected test configuration'); + } + }) +); + +const assertContentProd = compose(assertContent(), trim)` + @font-face{.some-class-name{ + src:url($0)${' '}format("embedded-opentype"),url($1)${' '}format("truetype"), + url($2)${' '}format(woff),url($3)${' '}format(svg) + }} + @media${' '}only${' '}screen{.another-class-name{ + single-quoted:url($4);double-quoted:url($5);unquoted:url($6);query:url($7);hash:url($8) + }} + `; + +const assertSourcemapProd = sequence( + onlyMeta('meta.version.webpack < 4')( + assertSourceMapComment(true) + ), + onlyMeta('meta.version.webpack >= 4')( + assertSourceMapComment(false) + ), + assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { + switch (true) { + case (engine === 'postcss') && (webpack < 4): + return outdent` + /src/feature/index.scss + 1:1 + 2:3->1:29 + 5:48->1:197 + + /src/index.scss + 1:1->1:12 + 3:2->1:198 + 4:1->1:199 + 5:3->1:218 + 6:5->1:238 + 7:5->1:276 + 8:5->1:314 + 9:5->1:345 + 10:5->1:373 10:35->1:399 + 11:4->1:400 + `; + case (engine === 'postcss') && (webpack === 4): + return outdent` + /src/feature/index.scss + 1:1 + 2:3->1:29 + 5:48->1:197 + + /src/index.scss + 1:1->1:12 + 3:2->1:198 + 4:1->1:199 + 5:3->1:218 + 6:5->1:238 + 7:5->1:276 + 8:5->1:314 + 9:5->1:345 + 10:5->1:373 10:35->1:399 + 11:4->1:400 11:4->1:401 + `; + default: + throw new Error('unexpected test configuration'); + } + }) +); + +const assertSourceMapSources = assertSourceMapContent([ + '/src/feature/index.scss', + '/src/index.scss' +]); + +const assertDebugMessages = sequence( + assertStdout('debug')(4)` + ^resolve-url-loader:[^:]+:[ ]*${'../fonts/font.'}\w+ + [ ]+${'./src/feature'} + [ ]+FOUND$ + `, + assertStdout('debug')(1)` + ^resolve-url-loader:[^:]+:[ ]*${'images/img.jpg'} + [ ]+${'./src'} + [ ]+FOUND$ + ` +); + +module.exports = test( + 'selector-in-directive', + layer('selector-in-directive')( + cwd('.'), + fs({ + 'package.json': withCacheBase('package.json'), + 'webpack.config.js': withCacheBase('webpack.config.js'), + 'node_modules': withCacheBase('node_modules'), + 'src/index.scss': outdent` + .some-class-name { + @import "feature/index.scss"; + } + @media only screen { + .another-class-name { + single-quoted: url('images/img.jpg'); + double-quoted: url("images/img.jpg"); + unquoted: url(images/img.jpg); + query: url(images/img.jpg?query); + hash: url(images/img.jpg#hash); + } + } + `, + 'src/feature/index.scss': outdent` + @font-face { + src: url('../fonts/font.eot?v=1.0#iefix') format('embedded-opentype'), + url("../fonts/font.ttf?v=1.0") format("truetype"), + url(../fonts/font.woff?v=1.0) format(woff), + url(../fonts/font.svg#iefix) format(svg); + } + ` + }), + env({ + ENTRY: join('src', 'index.scss') + }), + testWithLabel('asset-missing')( + moduleNotFound + ), + layer()( + fs({ + 'src/images/img.jpg': require.resolve('./assets/blank.jpg'), + 'src/fonts/font.eot': require.resolve('./assets/blank.jpg'), + 'src/fonts/font.ttf': require.resolve('./assets/blank.jpg'), + 'src/fonts/font.woff': require.resolve('./assets/blank.jpg'), + 'src/fonts/font.svg': require.resolve('./assets/blank.jpg') + }), + testDefault( + buildDevNormal( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentDev, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildDevNoUrl( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentDev, + assertSourcemapDev, + assertAssetUrls([ + './fonts/font.eot', + './fonts/font.ttf', + './fonts/font.woff', + './fonts/font.svg', + './images/img.jpg' + ]), + assertAssetFiles(false) + ), + buildProdNormal( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildProdNoUrl( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertSourcemapProd, + assertAssetUrls([ + './fonts/font.eot', + './fonts/font.ttf', + './fonts/font.woff', + './fonts/font.svg', + './images/img.jpg' + ]), + assertAssetFiles(false) + ), + buildProdNoDevtool( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertNoSourceMap, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ) + ), + testAbsolute( + buildDevNormal( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentDev, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildDevNoUrl( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentDev, + assertSourceMapSources, + assertAssetUrls(withRootBase([ + 'src/fonts/font.eot', + 'src/fonts/font.ttf', + 'src/fonts/font.woff', + 'src/fonts/font.svg', + 'src/images/img.jpg' + ])), + assertAssetFiles(false) + ), + buildProdNormal( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildProdNoUrl( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertSourceMapSources, + assertAssetUrls(withRootBase([ + 'src/fonts/font.eot', + 'src/fonts/font.ttf', + 'src/fonts/font.woff', + 'src/fonts/font.svg', + 'src/images/img.jpg' + ])), + assertAssetFiles(false) + ), + buildProdNoDevtool( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertNoSourceMap, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ) + ), + testDebug( + buildDevNormal( + assertWebpackOk, + assertNoErrors, + assertDebugMessages, + assertContentDev, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildDevNoUrl( + assertWebpackOk, + assertNoErrors, + assertDebugMessages, + assertContentDev, + assertSourceMapSources, + assertAssetUrls([ + './fonts/font.eot', + './fonts/font.ttf', + './fonts/font.woff', + './fonts/font.svg', + './images/img.jpg' + ]), + assertAssetFiles(false) + ), + buildProdNormal( + assertWebpackOk, + assertNoErrors, + assertDebugMessages, + assertContentProd, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildProdNoUrl( + assertWebpackOk, + assertNoErrors, + assertDebugMessages, + assertContentProd, + assertSourceMapSources, + assertAssetUrls([ + './fonts/font.eot', + './fonts/font.ttf', + './fonts/font.woff', + './fonts/font.svg', + './images/img.jpg' + ]), + assertAssetFiles(false) + ), + buildProdNoDevtool( + assertWebpackOk, + assertNoErrors, + assertDebugMessages, + assertContentProd, + assertNoSourceMap, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ) + ), + testKeepQuery( + buildDevNormal( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentDev, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot#iefix', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg#iefix', + 'd68e763c825dc0e388929ae1b375ce18.jpg', + 'd68e763c825dc0e388929ae1b375ce18.jpg#hash' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildDevNoUrl( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentDev, + assertSourceMapSources, + assertAssetUrls([ + './fonts/font.eot?v=1.0#iefix', + './fonts/font.ttf?v=1.0', + './fonts/font.woff?v=1.0', + './fonts/font.svg#iefix', + './images/img.jpg', + './images/img.jpg?query', + './images/img.jpg#hash' + ]), + assertAssetFiles(false) + ), + buildProdNormal( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertSourceMapSources, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot#iefix', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg#iefix', + 'd68e763c825dc0e388929ae1b375ce18.jpg', + 'd68e763c825dc0e388929ae1b375ce18.jpg#hash' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ), + buildProdNoUrl( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertSourceMapSources, + assertAssetUrls([ + './fonts/font.eot?v=1.0#iefix', + './fonts/font.ttf?v=1.0', + './fonts/font.woff?v=1.0', + './fonts/font.svg#iefix', + './images/img.jpg', + './images/img.jpg?query', + './images/img.jpg#hash' + ]), + assertAssetFiles(false) + ), + buildProdNoDevtool( + assertWebpackOk, + assertNoErrors, + assertNoMessages, + assertContentProd, + assertNoSourceMap, + assertAssetUrls([ + 'd68e763c825dc0e388929ae1b375ce18.eot#iefix', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg#iefix', + 'd68e763c825dc0e388929ae1b375ce18.jpg', + 'd68e763c825dc0e388929ae1b375ce18.jpg#hash' + ]), + assertAssetFiles([ + 'd68e763c825dc0e388929ae1b375ce18.eot', + 'd68e763c825dc0e388929ae1b375ce18.ttf', + 'd68e763c825dc0e388929ae1b375ce18.woff', + 'd68e763c825dc0e388929ae1b375ce18.svg', + 'd68e763c825dc0e388929ae1b375ce18.jpg' + ]) + ) + ) + ) + ) +); diff --git a/test/cases/shallow-asset.js b/test/cases/shallow-asset.js index a41e07d..42901d4 100644 --- a/test/cases/shallow-asset.js +++ b/test/cases/shallow-asset.js @@ -12,7 +12,7 @@ const {testDefault, testAbsolute, testDebug, testKeepQuery, testWithLabel} = req const {buildDevNormal, buildDevNoUrl, buildProdNormal, buildProdNoUrl, buildProdNoDevtool} = require('./common/builds'); const {moduleNotFound} = require('./common/partials'); const { - onlyVersion, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, + onlyMeta, assertWebpackOk, assertNoErrors, assertNoMessages, assertContent, assertSourceMapComment, assertSourceMapContent, assertNoSourceMap, assertAssetUrls, assertAssetFiles, assertStdout } = require('../lib/assert'); @@ -78,10 +78,10 @@ const assertContentProd = compose(assertContent(), trim)` `; const assertSourcemapProd = sequence( - onlyVersion('webpack<4')( + onlyMeta('meta.version.webpack < 4')( assertSourceMapComment(true) ), - onlyVersion('webpack>=4')( + onlyMeta('meta.version.webpack >= 4')( assertSourceMapComment(false) ), assertSourceMapContent(({meta: {engine, version: {webpack}}}) => { diff --git a/test/index.js b/test/index.js index 2739c9c..a8a4fa3 100644 --- a/test/index.js +++ b/test/index.js @@ -15,6 +15,11 @@ const {testBase} = require('./cases/common/tests'); const PLATFORMS_DIR = join(dirname(require.resolve('resolve-url-loader')), 'test'); const CASES_DIR = join(__dirname, 'cases'); +const testCaseVsEngine = ([_, engineName, caseName]) => { + const split = caseName.split('.'); + return (split.length === 1) || (split[1] === engineName); +}; + const testIncluded = process.env.ONLY ? (arr) => { const patterns = process.env.ONLY.split(' ').map(v => v.trim()); @@ -42,8 +47,9 @@ console.log(`timestamp: ${epoch}`); const tests = permute( readdirSync(PLATFORMS_DIR), ['rework', 'postcss'], - readdirSync(CASES_DIR).filter((v) => v.endsWith('.js')).map((v) => v.split('.').shift()) + readdirSync(CASES_DIR).filter((v) => v.endsWith('.js')).map((v) => v.split('.').slice(0, -1).join('.')) ) + .filter(testCaseVsEngine) .filter(testIncluded); const filterTests = (...terms) => diff --git a/test/lib/assert.js b/test/lib/assert.js index 808fe00..3d0ac46 100644 --- a/test/lib/assert.js +++ b/test/lib/assert.js @@ -37,11 +37,15 @@ const assertSourceMap = compose( withJson ); -exports.onlyVersion = (equation) => (...fn) => { +exports.onlyMeta = (equation) => (...fn) => { /*jshint evil:true */ - const predicate = new Function('version', `return version.${equation.replace(/\b=+\b/, '===')}`); + const predicate = new Function('cwd', 'env', 'meta', `return (${equation})`); return (context, ...rest) => { - const isPass = predicate(context.layer.meta.version); + const {cwd, env, meta} = context.layer; + const isPass = predicate(cwd, env, meta); + if (typeof isPass !== 'boolean') { + throw new Error(`predicate "${equation}" must evaluate to boolean.`); + } return (isPass ? sequence(...fn) : (x => x))(context, ...rest); }; };