Skip to content

Commit

Permalink
test: add test case for restarting test run on file change
Browse files Browse the repository at this point in the history
  • Loading branch information
devoto13 authored and Jonathan Ginsburg committed Nov 16, 2021
1 parent 92ffe60 commit cf318e5
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
28 changes: 28 additions & 0 deletions test/e2e/restart-on-change.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Feature: Restart on file change
In order to use Karma
As a person who wants to write great tests
I want Karma to re-run tests whenever file changes.

Scenario: Re-run tests when file changes
Given a configuration with:
"""
files = ['basic/plus.js', 'basic/test.js'];
browsers = ['ChromeHeadlessNoSandbox'];
plugins = [
'karma-jasmine',
'karma-chrome-launcher'
];
restartOnFileChange = true;
singleRun = false;
"""
When I start a server in background
And I wait until server output contains:
"""
..
Chrome Headless
"""
When I touch file: "basic/test.js"
Then the background stdout matches RegExp:
"""
Executed 2 of 2 SUCCESS[\s\S]+Executed 2 of 2 SUCCESS
"""
35 changes: 34 additions & 1 deletion test/e2e/step_definitions/core_steps.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ When('I stop a server programmatically', function (callback) {
})

When('I start a server in background', async function () {
await this.runBackgroundProcess(['start', '--log-level', 'debug', this.configFile])
await this.runBackgroundProcess(['start', this.configFile])
})

When('I start a server in background with additional arguments: {string}', async function (args) {
await this.runBackgroundProcess(['start', ...args.split(' '), this.configFile])
})

When('I wait until server output contains:', async function (expectedOutput) {
Expand All @@ -50,6 +54,11 @@ When('I {command} Karma', async function (command) {
await this.runForegroundProcess(`${command} ${this.configFile}`)
})

When('I touch file: {string}', async function (file) {
const now = new Date()
await fs.promises.utimes(path.join(this.workDir, file), now, now)
})

When('I {command} Karma with additional arguments: {string}', async function (command, args) {
await this.runForegroundProcess(`${command} ${this.configFile} ${args}`)
})
Expand Down Expand Up @@ -149,3 +158,27 @@ Then(/^the file at ([a-zA-Z0-9/\\_.]+) contains:$/, function (filePath, expected
throw new Error('Expected output to match the following:\n ' + expectedOutput + '\nGot:\n ' + data)
}
})

Then(/^the background (stdout|stderr) (is exactly|contains|matches RegExp):$/, async function (outputType, comparison, expectedOutput) {
const message = comparison === 'is exactly' ? 'Expected output to be exactly as above, but got:'
: comparison === 'contains' ? 'Expected output to contain the above text, but got:'
: 'Expected output to match the above RegExp, but got:'

await waitForCondition(
() => {
const actualOutput = this.backgroundProcess[outputType].trim()
expectedOutput = expectedOutput.trim()

switch (comparison) {
case 'is exactly':
return actualOutput === expectedOutput
case 'contains':
return actualOutput.includes(expectedOutput)
case 'matches RegExp':
return new RegExp(expectedOutput).test(actualOutput)
}
},
5000,
() => new Error(`${message}\n\n${this.backgroundProcess[outputType]}`)
)
})

0 comments on commit cf318e5

Please sign in to comment.