-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
cli_spec.js
144 lines (115 loc) · 3.79 KB
/
cli_spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
require('../spec_helper')
const _ = require('lodash')
const cp = require('child_process')
const pkg = require('../../package.json')
const execa = require('execa')
const semver = require('semver')
const anyLineWithCaret = (str) => {
return str[0] === '>'
}
const clean = (str) => {
// remove blank lines and slice off any line
// starting with a caret because thats junk
// from npm logs
return _
.chain(str)
.split('\n')
.compact()
.reject(anyLineWithCaret)
.join('\n')
.value()
}
const env = _.omit(process.env, 'CYPRESS_DEBUG')
describe('CLI Interface', () => {
beforeEach(function () {
// set the timeout high due to
// spawning child processes
return this.currentTest.timeout(20000)
})
it('writes out ping value and exits', (done) => {
return cp.exec('npm run dev -- --cwd=/foo/bar --smoke-test --ping=12345', { env }, (err, stdout, stderr) => {
if (err) {
done(err)
}
expect(clean(stdout)).to.eq('12345')
return done()
})
})
// TODO:(tgriesser) originally skipped this, not sure why
it.skip('writes out package.json and exits', (done) => {
return cp.exec('npm run dev -- --return-pkg', { env }, (err, stdout, stderr) => {
if (err) {
done(err)
}
const json = JSON.parse(clean(stdout))
expect(json.name).to.eq('cypress')
expect(json.productName).to.eq('Cypress', stdout)
return done()
})
})
// this tests that our exit codes are correct.
// there was a bug at one point where we incorrectly
// spawned child electron processes and did not bubble
// up their exit codes to the calling process. this
// caused false-positives in CI because tests were failing
// but the exit code was always zero
context('exit codes', () => {
describe('from start script command', () => {
beforeEach(function () {
this.dev = pkg.scripts.dev
})
it('exits with code 22', function (done) {
const s = cp.exec(`${this.dev} --exit-with-code=22`)
return s.on('close', (code) => {
expect(code).to.eq(22)
return done()
})
})
it('exits with code 0', function (done) {
const s = cp.exec(`${this.dev} --exit-with-code=0`)
return s.on('close', (code) => {
expect(code).to.eq(0)
return done()
})
})
})
describe('through NPM script', () => {
let npmVersion = null
/**
* In certain versions of npm, code with an exit code of 10 (Internal Runtime Javascript Failure)
* is ultimately displayed as an exit code of 1 (Uncaught Runtime Exception).
* This seems to occur before Node 7 / NPM 4 and after Node 14/ NPM 7.
* Please see https://github.com/arzzen/all-exit-error-codes/blob/master/programming-languages/javascript/nodejs.md
* for more details.
*
* @returns {boolean}
*/
const doesNpmObscureInternalExitCode = () => {
return semver.lt(npmVersion, '4.0.0') || semver.gt(npmVersion, '6.0.0')
}
beforeEach(() => {
return execa('npm', ['-version'])
.then((val) => val.stdout)
.then((version) => {
npmVersion = version
expect(npmVersion).to.be.a.string
})
})
it('npm slurps up or not exit value on failure', (done) => {
const expectedCode = doesNpmObscureInternalExitCode() ? 1 : 10
const s = cp.exec('npm run dev -- --exit-with-code=10')
return s.on('close', (code) => {
expect(code).to.eq(expectedCode)
return done()
})
})
it('npm passes on 0 exit code', (done) => {
const s = cp.exec('npm run dev -- --exit-with-code=0')
return s.on('close', (code) => {
expect(code).to.eq(0)
return done()
})
})
})
})
})