Files
cypress/system-tests/test/plugins_spec.js
2022-12-20 01:56:10 +00:00

254 lines
7.2 KiB
JavaScript

const path = require('path')
const systemTests = require('../lib/system-tests').default
const Fixtures = require('../lib/fixtures')
const e2eProject = Fixtures.projectPath('e2e')
describe('e2e plugins', function () {
systemTests.setup()
// this tests verifies stdout manually instead of via snapshot because
// there's a degree of randomness as to whether the error occurs before or
// after the run output starts. the important thing is that the run is
// failed and the right error is displayed
systemTests.it('fails when there is an async error at the root', {
browser: 'chrome',
spec: 'app.cy.js',
project: 'plugins-root-async-error',
expectedExitCode: 1,
onRun (exec) {
return exec().then(({ stdout }) => {
expect(stdout).to.include('We stopped running your tests because your config file crashed.')
expect(stdout).to.include('Your configFile threw an error from: cypress.config.js')
expect(stdout).to.include('Error: Root async error from config file')
})
},
})
it('fails when there is an async error inside an event handler', function () {
// TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23493
this.retries(15)
return systemTests.exec(this, {
spec: 'app.cy.js',
project: 'plugins-async-error',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
config: {
video: false,
},
})
})
it('can modify config from plugins', function () {
return systemTests.exec(this, {
spec: 'app.cy.js',
env: 'foo=foo,bar=bar',
config: { pageLoadTimeout: 10000 },
project: 'plugin-config',
sanitizeScreenshotDimensions: true,
snapshot: true,
})
})
it('passes version correctly', function () {
return systemTests.exec(this, {
project: 'plugin-config-version',
})
})
it('catches invalid viewportWidth returned from plugins', function () {
// the test project returns config object with a bad value
return systemTests.exec(this, {
project: 'plugin-returns-bad-config',
expectedExitCode: 1,
snapshot: true,
})
})
it('catches invalid browsers list returned from plugins', function () {
return systemTests.exec(this, {
project: 'plugin-returns-empty-browsers-list',
expectedExitCode: 1,
snapshot: true,
})
})
it('catches invalid browser returned from plugins', function () {
return systemTests.exec(this, {
project: 'plugin-returns-invalid-browser',
expectedExitCode: 1,
snapshot: true,
})
})
it('can filter browsers from config', function () {
return systemTests.exec(this, {
project: 'plugin-filter-browsers',
// the test project filters available browsers
// and returns a list with JUST Electron browser
// and we ask to run in Chrome
// thus the test should fail
browser: 'chrome',
expectedExitCode: 1,
snapshot: true,
// we are interested in the actual filtered available browser name
// which should be "electron"
normalizeStdoutAvailableBrowsers: false,
})
})
systemTests.it('works with user extensions', {
browser: 'chrome',
spec: 'app.cy.js',
headed: true,
project: 'plugin-extension',
sanitizeScreenshotDimensions: true,
snapshot: true,
})
const pluginAfterScreenshot = 'plugin-after-screenshot'
it('calls after:screenshot for cy.screenshot() and failure screenshots', function () {
return systemTests.exec(this, {
spec: 'after_screenshot.cy.js',
project: pluginAfterScreenshot,
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
// https://github.com/cypress-io/cypress/issues/8079
it('does not report more screenshots than exist if user overwrites previous screenshot in afterScreenshot', function () {
return systemTests.exec(this, {
spec: 'after_screenshot_overwrite.cy.js',
project: pluginAfterScreenshot,
snapshot: true,
})
})
it('fails when invalid event is registered', function () {
return systemTests.exec(this, {
spec: 'app.cy.js',
project: 'plugin-validation-error',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
it('fails when invalid event handler is registered', function () {
return systemTests.exec(this, {
spec: 'app.cy.js',
project: 'plugin-invalid-event-handler-error',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
it('fails when setupNodeEvents is not a function', function () {
return systemTests.exec(this, {
spec: 'app.cy.js',
project: 'plugin-empty',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
it('fails when there is no function exported', function () {
return systemTests.exec(this, {
spec: 'app_spec.js',
project: 'plugin-no-function-return',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
it('fails when require throws synchronously', function () {
return systemTests.exec(this, {
spec: 'app_spec.js',
project: 'plugins-root-sync-error',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
it('fails when require has a syntax error', function () {
return systemTests.exec(this, {
spec: 'app_spec.js',
project: 'plugins-root-syntax-error',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
it('fails when function throws synchronously', function () {
return systemTests.exec(this, {
spec: 'app_spec.js',
project: 'plugins-function-sync-error',
sanitizeScreenshotDimensions: true,
snapshot: true,
expectedExitCode: 1,
})
})
describe('preprocessor', function () {
it('passes with working preprocessor', function () {
return systemTests.exec(this, {
spec: 'app.cy.js',
project: 'working-preprocessor',
sanitizeScreenshotDimensions: true,
snapshot: true,
})
})
it('supports node builtins', function () {
return systemTests.exec(this, {
spec: 'node_builtins.cy.js',
})
})
// https://github.com/cypress-io/cypress/issues/8361
it('supports .mjs files', function () {
return systemTests.exec(this, {
spec: 'mjs_spec.cy.mjs',
})
})
})
describe('extra properties', function () {
it('passes projectRoot and default configFile to plugins function', function () {
return systemTests.exec(this, {
spec: 'plugins_config_extras.cy.js',
config: {
env: {
projectRoot: e2eProject,
configFile: path.join(e2eProject, 'cypress.config.js'),
},
},
})
})
it('passes custom configFile to plugins function', function () {
return systemTests.exec(this, {
spec: 'plugins_config_extras.cy.js',
configFile: 'cypress-alt.config.js',
config: {
env: {
projectRoot: e2eProject,
configFile: path.join(e2eProject, 'cypress-alt.config.js'),
},
},
})
})
})
})