-
Notifications
You must be signed in to change notification settings - Fork 3.3k
/
Copy pathe2e.spec.ts
147 lines (124 loc) · 3.47 KB
/
e2e.spec.ts
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
145
146
147
import webpack from 'webpack'
import path from 'path'
import { expect } from 'chai'
import { EventEmitter } from 'events'
import http from 'http'
import fs from 'fs'
import { startDevServer } from '../'
const requestSpecFile = (port: number) => {
return new Promise((res) => {
const opts = {
host: 'localhost',
port,
path: '/test/fixtures/foo.spec.js',
}
const callback = (response: EventEmitter) => {
let str = ''
response.on('data', (chunk) => {
str += chunk
})
response.on('end', () => {
res(str)
})
}
http.request(opts, callback).end()
})
}
const root = path.join(__dirname, '..')
const webpackConfig: webpack.Configuration = {
output: {
path: root,
publicPath: root,
},
}
const specs: Cypress.Cypress['spec'][] = [
{
name: `${root}/test/fixtures/foo.spec.js`,
relative: `${root}/test/fixtures/foo.spec.js`,
absolute: `${root}/test/fixtures/foo.spec.js`,
},
]
const config = {
projectRoot: root,
supportFile: '',
isTextTerminal: true,
webpackDevServerPublicPathRoute: root,
} as any as Cypress.ResolvedConfigOptions & Cypress.RuntimeConfigOptions
describe('#startDevServer', () => {
it('serves specs via a webpack dev server', async () => {
const { port, close } = await startDevServer({
webpackConfig,
options: {
config,
specs,
devServerEvents: new EventEmitter(),
},
})
const response = await requestSpecFile(port as number)
expect(response).to.eq('const foo = () => {}\n')
return new Promise((res) => {
close(() => res())
})
})
it('emits dev-server:compile:success event on successful compilation', async () => {
const devServerEvents = new EventEmitter()
const { close } = await startDevServer({
webpackConfig,
options: {
config,
specs,
devServerEvents,
},
})
return new Promise((res) => {
devServerEvents.on('dev-server:compile:success', () => {
close(() => res())
})
})
})
it('emits dev-server:compile:error event on error compilation', async () => {
const devServerEvents = new EventEmitter()
const { close } = await startDevServer({
webpackConfig,
options: {
config,
specs: [
{
name: `${root}/test/fixtures/compilation-fails.spec.js`,
relative: `${root}/test/fixtures/compilation-fails.spec.js`,
absolute: `${root}/test/fixtures/compilation-fails.spec.js`,
},
],
devServerEvents,
},
})
return new Promise((res) => {
devServerEvents.on('dev-server:compile:error', () => {
close(() => res())
})
})
})
it('touches browser.js when a spec file is added', async function () {
const devServerEvents = new EventEmitter()
const { close } = await startDevServer({
webpackConfig,
options: {
config,
specs,
devServerEvents,
},
})
const newSpec: Cypress.Cypress['spec'] = {
name: './some-newly-created-spec.js',
relative: './some-newly-created-spec.js',
absolute: '/some-newly-created-spec.js',
}
const oldmtime = fs.statSync('./dist/browser.js').mtimeMs
return new Promise((res) => {
devServerEvents.emit('dev-server:specs:changed', [newSpec])
const updatedmtime = fs.statSync('./dist/browser.js').mtimeMs
expect(oldmtime).to.not.equal(updatedmtime)
close(() => res())
})
})
})