Files
cypress/scripts/unit/binary/util/packages-spec.js
Ben Kucera 7857dac907 [internal] use webpack for builds (#4103)
* add webpack

* fix build proccess

* fix reporter build and test

* fix reporter test .css

* use apply(window, ...) since strict mode in webpack

* temp 05/13/19 [skip ci] resolver

* temp 05/14/19 [skip ci] webpack w/ root level symlinks

* run ci

* minor fixes

* fix link-packages script

* hopefully fix mac build

* re-add build-prod script in reporter

* fix typo in link-packages script

* fix lint errors

* fix node-version

* namespace files in webpack

* bust circle ci cache

* bust circle ci cache 2

* remove deps

* bust circle ci cache 3

* bust circle ci cache (launcher)

* ok circleci, you win. I will change all the cache keys

* update snapshot: not sure why added stack lines

* add mocha to reporter devDeps

* separate build file for reporter

* remove unneeded code

* node-sass-globbing use relative imports for appveyor

* add debugging for appveyor failure

* node-sass-globbing force unix paths for windows

* node-sass-globbing force unix paths for windows 2

* node-sass-globbing force unix paths for windows in runner

* run ci

* add checksum to packages caches

* bust circle ci cache (sub packages)

* testing code for appveyor env vars

* fix appveyor env vars for branchname
06-00000026

* fix binary build script, smoke test catch errors, include pkg mains
03-0000000a

* build binary in appveyor for this branch
07-00000047

* fix binary unit test, revert mocha upgrade in root, fix e2e specs
02-00000004

* statically replace symlinks at build time, add test, remove proxy packages code
03-00000002

* oops, update snapshot
04-00000049

* bump circle packages cache
02-00000005

* fix path.win32 on windows, add test for it
00-00000058

* for some reason packages ci cache is not including `rebuild-node-sass` in node_modules/.bin, and npm does not recreate .bin links if a node_modules folder already exists. so Im bumping all the npm caches, again
00-00000003

* emit during webpack-dev-server watch mode
02-00000020

* try revert circle.yml
02-0000002f

* try revert everything
03-0000003b

* Revert "try revert everything"

This reverts commit be125b88ff.

* no circle cache now
02-00000013

* remove logging in reporter build
06-00002a41

* Merge branch develop of github.com:cypress-io/cypress into webpack-runner
02-0000089b

* make build scripts DRY
04-00000a7f

* fix missing fonts, better watch mode
06-00003053

* use webpack --progress in watch mode
00-00000582

* move webpack config files into dedicated package
05-000023bf

* build desktop-gui with webpack, use relative scss url()s
03-00001801

* add timings info, fix configs
07-00005582

* enable sourcemaps "eval", fix desktopgui test
04-00005a08

* try 2: fix desktopgui test
01-0000058e

* fix lint
03-00000b10

* fix snapshot (very minor do not worry)
04-000014a4

* code cleanup
00-00007a4f

* try disable devtool
07-0000a97a

* remove cypress:// devtool sourceURL mapping to prevent cross-domain on electron
00-000056e4

* re-enable eval sourcemap in dev and prod
06-000051e6

* code cleanup
02-000056ae

* refactor node-jsdom setup for tests
00-000041a2

* re-enable sourceURL protocol, enable crossorigin script on runner to appease electron

* smoke tests for static assets in binary build script, disable sourceURL protocol mapping, more consistent dev/prod webpack builds

* use cross-env for desktop-gui

* desktop-dui: expect development NODE_ENV during build script (as has been in past)

* fix build script unit test

* fix build script unit test for real

* fix sourcemaps for dev/prod, add comments, add build static asset tests

* add cross-env to runner devDeps

* fix unit tests for build binary script

* fix whitespace

* add postcss autoprefixer + staticAsset tets

* add eslintrc to scripts/unit

* tabs -> spaces

* tabs -> spaces

* fix binary/util scripts

* fix testStaticAssets in build script

* fix extension requiring node socket

* fix unit-test for binary build script

* fix unit test for runner/reporter

* disable sourcemaps/eval in production

* fix disable sourcemaps in prod code

* resort jsons w/ new lint

* linting fixes

* runner/package.json add back rebuild-node-sass

* no circle cache again

* fix circle.yml

* try appveyor again

* fix binary build: remove "timers" from server/package.json.files

* fix testStaticAssets false-positive sourcemap detection (due to diff package)

* fix 2 failing e2e tests (run in chrome for now)
use build-prod scripts in binary-build script
add build-prod scripts to all packages

* a string is no regex

* correct merge: global_mode_spec

* fix all snapshot screenshot dimensions

* fix all snapshot screenshot dimensions (again)

* fix testStaticAssets development -> production

* Revert "fix all snapshot screenshot dimensions (again)"

This reverts commit d9022ef950.

* Revert "fix all snapshot screenshot dimensions"

This reverts commit 4f7628a051.

* helpers/e2e: only normalize screenshot dimensions NOT on electron

* post-task: windows build don't build on this branch

* post-task: un-bump circleci cache

* post-task: bump circleci cache packages/node_modules to v9

* cleanup: fix eol-newline, remove unneeded eslintrc

* bump circleci cache

* run rebuild-node-sass inside webpack build config

* bump circleci cache

* use cache version from env variable on circle

* use custom command to save cache for most packages

* add custom restore cache command

* restore 2 packages separately

* allow passing package path to restore

* pass explicit path to package to restore

* add restore-caches and save-caches

* print name for restoring cache commands

* print name when storing cache

* print .bin when saving cache

* fix path to .bin

* print launcher .bin

* show .bin for desktop-gui

* print bins

* update npm version

* update npm version - try 2

* update npm version - try 3

* remove circleci debugging print commands

* Revert "remove circleci debugging print commands"

This reverts commit 248966efcd.

* add TERM=xterm to Circle

* Revert "Revert "remove circleci debugging print commands""

This reverts commit cf77273b10.

* Revert "add TERM=xterm to Circle"

This reverts commit dc77c94c57.

* remove --serial arg from run all scripts

* add web-config package to cache

* simplify circleci build job

* circleci: try rmrf node_modules/@packages before install

* appveyor: try removing --serial from install script

* Revert "appveyor: try removing --serial from install script"

This reverts commit 7ef619ff30.

* use appveyor from develop

* use preinstall removing subpackage symlinks
fix webpack config typescript errors
fix path to rebuild-node-sass in packages/web-config
assert replace minimum number of symlink requires

* test binary build [build binary]

* fix transformRequires code [build binary]
2019-07-18 12:11:27 -04:00

317 lines
7.8 KiB
JavaScript

const os = require('os')
const _ = require('lodash')
const path = require('path')
const proxyquire = require('proxyquire')
const mockfs = require('mock-fs')
const _snapshot = require('snap-shot-it')
const chai = require('chai')
chai.use(require('chai-as-promised'))
const { expect } = chai
const packages = require('../../../binary/util/packages')
const { transformRequires } = require('../../../binary/util/transform-requires')
const { testPackageStaticAssets } = require('../../../binary/util/testStaticAssets')
global.beforeEach(() => {
mockfs.restore()
})
const snapshot = (...args) => {
mockfs.restore()
return _snapshot(...args)
}
describe('packages', () => {
it('can copy files from package.json', async () => {
mockfs({
'packages': {
'coffee': {
'package.json': '{"main":"src/main.js", "name": "foo", "files": ["lib"]}',
'src': { 'main.js': new Buffer('console.log()') },
'lib': { 'foo.js': '{}' },
},
},
})
await packages.copyAllToDist(os.tmpdir())
const files = getFs()
snapshot(files)
})
it('can find packages with script', async () => {
mockfs(
{
'packages': {
'foo': {
'package.json': JSON.stringify({
scripts: {
build: 'somefoo',
},
}),
},
'bar': {
'package.json': JSON.stringify({
scripts: {
start: 'somefoo',
},
}),
},
'baz': {
'package.json': JSON.stringify({
main: 'somefoo',
}),
},
},
}
)
const res = await packages.getPackagesWithScript('build')
expect(res).deep.eq(['foo'])
})
})
describe('transformRequires', () => {
it('can find and replace symlink requires', async () => {
const buildRoot = 'build/linux/Cypress/resources/app'
mockfs({
[buildRoot]: { 'packages': {
'foo': {
'package.json': '{"main":"src/main.js", "name": "foo", "files": ["lib"]}',
'src': { 'main.js': new Buffer('console.log()') },
'lib': { 'foo.js': /*js*/`require("@packages/bar/src/main")${''}` },
},
'bar': {
'package.json': '{"main":"src/main.js", "name": "foo", "files": ["lib"]}',
'src': { 'main.js': new Buffer('console.log()') },
'lib': { 'foo.js': `require("@packages/foo/lib/somefoo")${''}` },
'node_modules': { 'no-search.js': '' },
'dist': { 'no-search.js': '' },
},
},
},
})
// should return number of transformed requires
await expect(transformRequires(buildRoot)).to.eventually.eq(2)
// console.log(getFs())
snapshot(getFs())
})
it('can find and replace symlink requires on win32', async () => {
const { transformRequires } = proxyquire('../../../binary/util/transform-requires', { path: path.win32 })
const buildRoot = 'build/linux/Cypress/resources/app'
mockfs({
[buildRoot]: { 'packages': {
'foo': {
'package.json': '{"main":"src/main.js", "name": "foo", "files": ["lib"]}',
'src': { 'main.js': new Buffer('console.log()') },
'lib': { 'foo.js': /*js*/`require("@packages/bar/src/main")${''}` },
},
'bar': {
'package.json': '{"main":"src/main.js", "name": "foo", "files": ["lib"]}',
'src': { 'main.js': new Buffer('console.log()') },
'lib': { 'foo.js': `require("@packages/foo/lib/somefoo")${''}` },
'node_modules': { 'no-search.js': '' },
'dist': { 'no-search.js': '' },
},
},
},
})
await transformRequires(buildRoot)
snapshot(getFs())
})
})
describe('testStaticAssets', () => {
it('can detect bad strings in asset', async () => {
const buildDir = 'resources/app'
mockfs({
[buildDir]: {
'packages': {
'runner': {
'dist': {
'runner.js': `
some js
some really bad string
some more js
`,
},
},
},
},
})
// logFs()
await expect(testPackageStaticAssets({
assetGlob: `${buildDir}/packages/runner/dist/*.js`,
badStrings: ['some really bad string'],
})).to.rejected.with.eventually.property('message').contain('some really bad string')
mockfs.restore()
mockfs({
[buildDir]: {
'packages': {
'runner': {
'dist': {},
},
},
},
})
await expect(testPackageStaticAssets({
assetGlob: `${buildDir}/packages/runner/dist/*.js`,
badStrings: ['some really bad string'],
})).to.rejected.with.eventually
.property('message').contain('assets to be found')
})
it('can detect asset with too many lines', async () => {
const buildDir = 'resources/app'
mockfs({
[buildDir]: {
'packages': {
'runner': {
'dist': {
'runner.js': `
${'minified code;minified code;minified code;\n'.repeat(50)}
`,
},
},
},
},
})
await expect(testPackageStaticAssets({
assetGlob: `${buildDir}/packages/runner/dist/*.js`,
minLineCount: 100,
})).to.rejected.with.eventually
.property('message').contain('minified')
})
it('can detect asset that includes specified number of goodStrings', async () => {
const buildDir = 'resources/app'
mockfs({
[buildDir]: {
'packages': {
'test': {
'file.css': `
${'-moz-user-touch: "none"\n'.repeat(5)}
`,
},
},
},
})
await expect(testPackageStaticAssets({
assetGlob: `${buildDir}/packages/test/file.css`,
goodStrings: [['-moz-', 10]],
})).to.rejected.with.eventually
.property('message').contain('at least 10')
})
it('can have custom testAssetString tests', async () => {
const buildDir = 'resources/app'
mockfs({
[buildDir]: {
'packages': {
'test': {
'file.css': `
${'-moz-user-touch: "none"\n'.repeat(5)}
foo-bar-baz\
`,
},
},
},
})
await expect(testPackageStaticAssets({
assetGlob: `${buildDir}/packages/test/file.css`,
testAssetStrings: [
[(str) => !str.split('\n').slice(-1)[0].includes('foo-bar-baz'), 'expected not to end with foo-bar-baz'],
],
})).to.rejected.with.eventually
.property('message').contain('foo-bar-baz')
})
})
/*
// Example: Test real assets
it('can detect', async () => {
const buildDir = process.cwd()
await expect(testPackageStaticAssets({
assetGlob: `${buildDir}/packages/runner/dist/*.css`,
goodStrings: [['-ms-', 20]],
})).not.be.rejected
})
*/
afterEach(() => {
mockfs.restore()
})
// eslint-disable-next-line
const logFs = () => {
// eslint-disable-next-line no-console
console.dir(getFs(), { depth: null })
}
const getFs = () => {
const cwd = process.cwd().split('/').slice(1)
const recurse = (dir, d) => {
if (_.isString(dir)) {
return dir
}
return _.extend({}, ..._.map(dir, (val, key) => {
let nextDepth = null
if (d !== null) {
if (d === -1) {
nextDepth = d + 1
} else if (!(d > cwd.length) && key === cwd[d]) {
key = 'foo'
nextDepth = d + 1
if (d === cwd.length - 1) {
return { '[cwd]': recurse(val._items, nextDepth) }
}
return recurse(val._items, nextDepth)
} else {
nextDepth = null
}
}
return {
[key]: recurse(val._content ? val._content.toString() : val._items, nextDepth),
}
}))
}
return recurse({ root: mockfs.getMockRoot() }, -1).root
}