forked from kumahq/kuma-gui
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cypress.config.ts
97 lines (87 loc) · 3.27 KB
/
cypress.config.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
import { addCucumberPreprocessorPlugin } from '@badeball/cypress-cucumber-preprocessor'
import { createEsbuildPlugin } from '@badeball/cypress-cucumber-preprocessor/esbuild'
import createBundler from '@bahmutov/cypress-esbuild-preprocessor'
import { defineConfig } from 'cypress'
import cypressFailFast from 'cypress-fail-fast/plugin'
import dotenv from 'dotenv'
import esbuild from 'esbuild'
import fs from 'node:fs'
function createVuePlugin(
): esbuild.Plugin {
return {
name: 'vue',
setup(build) {
build.onLoad({ filter: /\.vue$/ }, async () => {
return {
contents: 'export default ""',
loader: 'js',
}
})
},
}
}
const env = dotenv.config().parsed as { [key: string]: string }
Object.entries({
// default base URL for testing against
KUMA_BASE_URL: 'http://localhost:5681/gui',
}).forEach(([key, d]: [string, string]) => {
env[key] = process.env[key] ?? d
})
export default defineConfig({
viewportWidth: 1366,
viewportHeight: 768,
e2e: {
baseUrl: env.KUMA_BASE_URL,
specPattern: '**/*.feature',
experimentalRunAllSpecs: true,
// Can be turned on via CLI using `CYPRESS_video=true npm run test:browser`
video: false,
async setupNodeEvents(on, config) {
// propagate env to Cypress.env
Object.entries(env).forEach(([prop, value]) => {
config.env[prop] = value
})
// This is required for the preprocessor to be able to generate JSON reports after each run, and more,
await addCucumberPreprocessorPlugin(on, config)
on('task', {
log(message: unknown) {
console.info(JSON.stringify(message))
return null
},
})
on(
'file:preprocessor',
createBundler({
plugins: [
createEsbuildPlugin(config) as esbuild.Plugin,
createVuePlugin(),
],
}),
)
on('after:spec', (_spec, results) => {
// Deletes videos of successful specs to avoid uploading them as GitHub artifacts
if (results && results.video && results.stats.failures === 0) {
fs.unlinkSync(results.video)
}
// Extract the error message of a failing test to log it via the special GitHub Actions annotation for errors. This way, the workflow summary doesn’t just show “Process completed with exit code 1”.
if (results && results.stats.failures > 0) {
for (const test of results.tests.filter((test) => test.state === 'failed')) {
if (test.displayError) {
const trimmedMessage = test.displayError
.replace(/^Error: The following error originated from your application code, not from Cypress.*\n/, '')
.replace(/^AssertionError: cypress-fail-on-console-error.*\n/, '')
.trim()
.replace(/^> /, '')
const newLineIndex = trimmedMessage.indexOf('\n')
const message = trimmedMessage.substring(0, newLineIndex !== -1 ? newLineIndex : trimmedMessage.length)
console.info(`::error file=${results.spec.relative}::${message}`)
}
}
}
})
cypressFailFast(on, config)
// Make sure to return the config object as it might have been modified by the plugin.
return config
},
},
})