-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
cli_spec.js
135 lines (106 loc) · 3.28 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
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()
})
})
// This fails on MacOS due to an apparent limit on the buffer size of stdout
it('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
const isNpmSlurpingCode = () => {
return semver.lt(npmVersion, '4.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 = isNpmSlurpingCode() ? 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()
})
})
})
})
})