From b5a06c124000be60f61450332a5ce9f4a86c9d97 Mon Sep 17 00:00:00 2001 From: Ryan Manuel Date: Mon, 6 Jun 2022 10:14:34 -0500 Subject: [PATCH 1/6] fix: restart server on baseUrl change --- packages/config/src/options.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/config/src/options.ts b/packages/config/src/options.ts index fd583e6d2799..a87ede49cee4 100644 --- a/packages/config/src/options.ts +++ b/packages/config/src/options.ts @@ -135,7 +135,7 @@ const resolvedOptions: Array = [ defaultValue: null, validation: validate.isFullyQualifiedUrl, canUpdateDuringTestTime: true, - requireRestartOnChange: 'pingBaseUrl', + requireRestartOnChange: 'server', }, { name: 'blockHosts', defaultValue: null, From 6aa129d012a281f6233243c592948dde4adea12c Mon Sep 17 00:00:00 2001 From: Ryan Manuel Date: Mon, 6 Jun 2022 10:52:50 -0500 Subject: [PATCH 2/6] Rework how baseUrl works --- packages/config/src/options.ts | 2 +- packages/data-context/src/data/ProjectLifecycleManager.ts | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/config/src/options.ts b/packages/config/src/options.ts index a87ede49cee4..fd583e6d2799 100644 --- a/packages/config/src/options.ts +++ b/packages/config/src/options.ts @@ -135,7 +135,7 @@ const resolvedOptions: Array = [ defaultValue: null, validation: validate.isFullyQualifiedUrl, canUpdateDuringTestTime: true, - requireRestartOnChange: 'server', + requireRestartOnChange: 'pingBaseUrl', }, { name: 'blockHosts', defaultValue: null, diff --git a/packages/data-context/src/data/ProjectLifecycleManager.ts b/packages/data-context/src/data/ProjectLifecycleManager.ts index 03de9c2b40c5..fe544e362b2d 100644 --- a/packages/data-context/src/data/ProjectLifecycleManager.ts +++ b/packages/data-context/src/data/ProjectLifecycleManager.ts @@ -246,12 +246,10 @@ export class ProjectLifecycleManager { } finalConfig.baseUrl = `http://localhost:${devServerOptions?.port}` + } - // Devserver can pick a random port, this solve the edge case where closing - // and spawning the devserver can result in a different baseUrl - if (this._cachedFullConfig && this._cachedFullConfig.baseUrl !== finalConfig.baseUrl) { - restartOnChange.server = true - } + if (this._cachedFullConfig && this._cachedFullConfig.baseUrl !== finalConfig.baseUrl) { + restartOnChange.server = true } this._cachedFullConfig = finalConfig From d3ce9ca1950459de125f01e489a457365e047f20 Mon Sep 17 00:00:00 2001 From: Ryan Manuel Date: Mon, 6 Jun 2022 12:12:09 -0500 Subject: [PATCH 3/6] Refactor how we determine if we should ping the base url --- .../app/cypress/e2e/cypress-in-cypress.cy.ts | 22 +++++++++++++++++++ packages/config/src/browser.ts | 1 - packages/config/src/options.ts | 6 ++--- .../src/data/ProjectLifecycleManager.ts | 10 ++++----- .../cypress/e2e/choose-a-browser.cy.ts | 12 ++++++---- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/packages/app/cypress/e2e/cypress-in-cypress.cy.ts b/packages/app/cypress/e2e/cypress-in-cypress.cy.ts index 64eda51c6b43..7a78e8c5886c 100644 --- a/packages/app/cypress/e2e/cypress-in-cypress.cy.ts +++ b/packages/app/cypress/e2e/cypress-in-cypress.cy.ts @@ -305,4 +305,26 @@ describe('Cypress in Cypress', { viewportWidth: 1500, defaultCommandTimeout: 100 expect(ctx.actions.project.initializeActiveProject).to.be.called }) }) + + it('restarts server if baseUrl is updated in the config file', () => { + startAtSpecsPage('e2e') + cy.get('[data-cy="spec-item"]') + + cy.withCtx((ctx, o) => { + ctx.coreData.app.browserStatus = 'open' + o.sinon.stub(ctx.actions.project, 'initializeActiveProject') + + let config = ctx.actions.file.readFileInProject('cypress.config.js') + + config = config.replace(`{`, `{\n baseUrl: 'https://example.cypress.io',\n`) + ctx.actions.file.writeFileInProject('cypress.config.js', config) + }) + + cy.get('[data-cy="loading-spinner"]').should('be.visible') + cy.contains('[role="alert"]', 'Loading') + + cy.withRetryableCtx((ctx) => { + expect(ctx.actions.project.initializeActiveProject).to.be.called + }) + }) }) diff --git a/packages/config/src/browser.ts b/packages/config/src/browser.ts index 4d7739216f2d..f269f189352a 100644 --- a/packages/config/src/browser.ts +++ b/packages/config/src/browser.ts @@ -188,7 +188,6 @@ export const validateNeedToRestartOnChange = (cachedConfig: any, updatedConfig: const restartOnChange = { browser: false, server: false, - pingBaseUrl: false, } if (!cachedConfig || !updatedConfig) { diff --git a/packages/config/src/options.ts b/packages/config/src/options.ts index fd583e6d2799..2bd37206f122 100644 --- a/packages/config/src/options.ts +++ b/packages/config/src/options.ts @@ -40,7 +40,7 @@ interface ResolvedConfigOption { */ canUpdateDuringTestTime?: boolean specificTestingType?: TestingType - requireRestartOnChange?: 'server' | 'browser' | 'pingBaseUrl' + requireRestartOnChange?: 'server' | 'browser' } interface RuntimeConfigOption { @@ -52,7 +52,7 @@ interface RuntimeConfigOption { * Can be mutated with Cypress.config() or test-specific configuration overrides */ canUpdateDuringTestTime?: boolean - requireRestartOnChange?: 'server' | 'browser' | 'pingBaseUrl' + requireRestartOnChange?: 'server' | 'browser' } export interface BreakingOption { @@ -135,7 +135,7 @@ const resolvedOptions: Array = [ defaultValue: null, validation: validate.isFullyQualifiedUrl, canUpdateDuringTestTime: true, - requireRestartOnChange: 'pingBaseUrl', + requireRestartOnChange: 'server', }, { name: 'blockHosts', defaultValue: null, diff --git a/packages/data-context/src/data/ProjectLifecycleManager.ts b/packages/data-context/src/data/ProjectLifecycleManager.ts index fe544e362b2d..c0a1ffa3e233 100644 --- a/packages/data-context/src/data/ProjectLifecycleManager.ts +++ b/packages/data-context/src/data/ProjectLifecycleManager.ts @@ -236,8 +236,6 @@ export class ProjectLifecycleManager { }) } - const restartOnChange = validateNeedToRestartOnChange(this._cachedFullConfig, finalConfig) - if (this._currentTestingType === 'component') { const devServerOptions = await this.ctx._apis.projectApi.getDevServer().start({ specs: this.ctx.project.specs, config: finalConfig }) @@ -248,9 +246,9 @@ export class ProjectLifecycleManager { finalConfig.baseUrl = `http://localhost:${devServerOptions?.port}` } - if (this._cachedFullConfig && this._cachedFullConfig.baseUrl !== finalConfig.baseUrl) { - restartOnChange.server = true - } + const pingBaseUrl = this._cachedFullConfig && this._cachedFullConfig.baseUrl !== finalConfig.baseUrl + + const restartOnChange = validateNeedToRestartOnChange(this._cachedFullConfig, finalConfig) this._cachedFullConfig = finalConfig @@ -269,7 +267,7 @@ export class ProjectLifecycleManager { await this.ctx.actions.browser.relaunchBrowser() } - if (restartOnChange.pingBaseUrl) { + if (pingBaseUrl) { this.ctx.actions.project.pingBaseUrl().catch(this.onLoadError) } } diff --git a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts index d14cd0863ef6..1a062519926d 100644 --- a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts +++ b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts @@ -190,7 +190,7 @@ describe('Choose a Browser Page', () => { cy.get('h1').should('contain', 'Choose a Browser') cy.withCtx((ctx, o) => { - o.sinon.spy(ctx.actions.project, 'launchProject') + o.sinon.stub(ctx.actions.project, 'launchProject') }) cy.intercept('mutation-OpenBrowser_LaunchProject', cy.stub().as('launchProject')) @@ -220,7 +220,7 @@ describe('Choose a Browser Page', () => { cy.visitLaunchpad() - cy.withCtx((ctx) => { + cy.withCtx((ctx, o) => { ctx.browser.setBrowserStatus('open') }) @@ -233,7 +233,7 @@ describe('Choose a Browser Page', () => { cy.intercept('mutation-OpenBrowser_FocusActiveBrowserWindow').as('focusBrowser') cy.withCtx((ctx, o) => { - o.sinon.spy(ctx.actions.browser, 'focusActiveBrowserWindow') + o.sinon.stub(ctx.actions.browser, 'focusActiveBrowserWindow') }) cy.get('@focusButton').click() @@ -276,9 +276,13 @@ describe('Choose a Browser Page', () => { cy.findByRole('radio', { name: 'Chrome v1', checked: true }).as('chromeItem') + cy.withCtx((ctx, o) => { + o.sinon.stub(ctx.actions.project, 'launchProject') + }) + cy.contains('button', 'Start E2E Testing in Chrome').should('be.visible').click() - cy.withCtx((ctx) => { + cy.withCtx((ctx, o) => { ctx.browser.setBrowserStatus('open') }) From fdf7c1a1c3014a74a30d5b7a3b0c448720fa947d Mon Sep 17 00:00:00 2001 From: Ryan Manuel Date: Mon, 6 Jun 2022 13:11:52 -0500 Subject: [PATCH 4/6] Fix test --- packages/app/cypress/e2e/cypress-in-cypress.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/cypress/e2e/cypress-in-cypress.cy.ts b/packages/app/cypress/e2e/cypress-in-cypress.cy.ts index 7a78e8c5886c..b9af2b6e1db9 100644 --- a/packages/app/cypress/e2e/cypress-in-cypress.cy.ts +++ b/packages/app/cypress/e2e/cypress-in-cypress.cy.ts @@ -316,7 +316,7 @@ describe('Cypress in Cypress', { viewportWidth: 1500, defaultCommandTimeout: 100 let config = ctx.actions.file.readFileInProject('cypress.config.js') - config = config.replace(`{`, `{\n baseUrl: 'https://example.cypress.io',\n`) + config = config.replace(` e2e: {`, ` e2e: {\n baseUrl: 'https://example.cypress.io',\n`) ctx.actions.file.writeFileInProject('cypress.config.js', config) }) From b3396a15cdf91fcaa9594bd2be7c0dab667541a9 Mon Sep 17 00:00:00 2001 From: Ryan Manuel Date: Mon, 6 Jun 2022 19:36:34 -0500 Subject: [PATCH 5/6] Update packages/launchpad/cypress/e2e/choose-a-browser.cy.ts --- packages/launchpad/cypress/e2e/choose-a-browser.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts index 1a062519926d..3957f2fd7ca5 100644 --- a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts +++ b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts @@ -220,7 +220,7 @@ describe('Choose a Browser Page', () => { cy.visitLaunchpad() - cy.withCtx((ctx, o) => { + cy.withCtx((ctx) => { ctx.browser.setBrowserStatus('open') }) From 3dbc9ce4bf9d6cdc95e721622f29a1f57ec21041 Mon Sep 17 00:00:00 2001 From: Ryan Manuel Date: Mon, 6 Jun 2022 19:36:53 -0500 Subject: [PATCH 6/6] Update packages/launchpad/cypress/e2e/choose-a-browser.cy.ts --- packages/launchpad/cypress/e2e/choose-a-browser.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts index 3957f2fd7ca5..319940c95bce 100644 --- a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts +++ b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts @@ -282,7 +282,7 @@ describe('Choose a Browser Page', () => { cy.contains('button', 'Start E2E Testing in Chrome').should('be.visible').click() - cy.withCtx((ctx, o) => { + cy.withCtx((ctx) => { ctx.browser.setBrowserStatus('open') })