mirror of
https://github.com/cypress-io/cypress.git
synced 2026-03-15 05:40:29 -05:00
* 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 commitbe125b88ff. * 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 commitd9022ef950. * Revert "fix all snapshot screenshot dimensions" This reverts commit4f7628a051. * 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 commit248966efcd. * add TERM=xterm to Circle * Revert "Revert "remove circleci debugging print commands"" This reverts commitcf77273b10. * Revert "add TERM=xterm to Circle" This reverts commitdc77c94c57. * 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 commit7ef619ff30. * 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]
317 lines
7.8 KiB
JavaScript
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
|
|
}
|