From 68eab81d9668530ac15e9813adfe2f12bfca9a85 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 2 Mar 2022 20:55:07 +0100 Subject: [PATCH 1/7] Record e2e tests to cypress dashboard --- airbyte-webapp-e2e-tests/build.gradle | 11 +++++++++-- airbyte-webapp-e2e-tests/cypress.json | 1 + airbyte-webapp-e2e-tests/package.json | 3 ++- tools/bin/e2e_test.sh | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/airbyte-webapp-e2e-tests/build.gradle b/airbyte-webapp-e2e-tests/build.gradle index df78f6404cd2e..fc10a04ef1ad8 100644 --- a/airbyte-webapp-e2e-tests/build.gradle +++ b/airbyte-webapp-e2e-tests/build.gradle @@ -13,8 +13,15 @@ node { task e2etest(type: NpmTask) { dependsOn npmInstall - - args = ['run', 'cypress:ci'] + // If the cypressWebappKey property has been set from the outside (see tools/bin/e2e_test.sh) + // we'll record the cypress session, otherwise we're not recording + def recordCypress = project.hasProperty('cypressWebappKey') && project.getProperty('cypressWebappKey') + if (recordCypress) { + environment = [CYPRESS_KEY: project.getProperty('cypressWebappKey')] + args = ['run', 'cypress:ci:record'] + } else { + args = ['run', 'cypress:ci'] + } inputs.files fileTree('cypress') inputs.file 'package.json' inputs.file 'package-lock.json' diff --git a/airbyte-webapp-e2e-tests/cypress.json b/airbyte-webapp-e2e-tests/cypress.json index 67b3f620bfcc7..cd22f12502da6 100644 --- a/airbyte-webapp-e2e-tests/cypress.json +++ b/airbyte-webapp-e2e-tests/cypress.json @@ -1,4 +1,5 @@ { + "projectId": "916nvw", "baseUrl": "http://localhost:3000", "testFiles": [ "base.spec.js", diff --git a/airbyte-webapp-e2e-tests/package.json b/airbyte-webapp-e2e-tests/package.json index 25eff6858bffa..09a50a2b076b7 100644 --- a/airbyte-webapp-e2e-tests/package.json +++ b/airbyte-webapp-e2e-tests/package.json @@ -4,7 +4,8 @@ "description": "Airbyte e2e testing", "scripts": { "cypress:open": "cypress open", - "cypress:ci": "CYPRESS_BASE_URL=http://localhost:8000 cypress run" + "cypress:ci": "CYPRESS_BASE_URL=http://localhost:8000 cypress run", + "cypress:ci:record": "CYPRESS_BASE_URL=http://localhost:8000 cypress run --record --key $CYPRESS_KEY" }, "eslintConfig": { "env": { diff --git a/tools/bin/e2e_test.sh b/tools/bin/e2e_test.sh index 7deb9bdf24377..085a111e3b093 100755 --- a/tools/bin/e2e_test.sh +++ b/tools/bin/e2e_test.sh @@ -23,4 +23,4 @@ echo "Waiting for services to begin" sleep 30 # TODO need a better way to wait echo "Running e2e tests via gradle" -SUB_BUILD=PLATFORM ./gradlew --no-daemon :airbyte-webapp-e2e-tests:e2etest +SUB_BUILD=PLATFORM ./gradlew --no-daemon :airbyte-webapp-e2e-tests:e2etest -PcypressWebappKey=$CYPRESS_WEBAPP_KEY From 1a589790d32e93b36ae2df714cbefe364cf8f330 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 2 Mar 2022 21:17:01 +0100 Subject: [PATCH 2/7] Make env variable accessible in script --- .github/workflows/gradle.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 59a1965d96762..514747f4f4911 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -440,6 +440,8 @@ jobs: run: SUB_BUILD=PLATFORM ./gradlew --no-daemon assemble --scan - name: Run End-to-End Frontend Tests + env: + CYPRESS_WEBAPP_KEY: ${{ secrets.CYPRESS_WEBAPP_KEY }} run: ./tools/bin/e2e_test.sh # In case of self-hosted EC2 errors, remove this block. stop-frontend-test-runner: From 6793f4ecc97015ee3879e7b89ee1dcc684a97be6 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 2 Mar 2022 22:21:58 +0100 Subject: [PATCH 3/7] Improve e2e_test script --- tools/bin/e2e_test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/bin/e2e_test.sh b/tools/bin/e2e_test.sh index 085a111e3b093..7612ab9e83d5a 100755 --- a/tools/bin/e2e_test.sh +++ b/tools/bin/e2e_test.sh @@ -16,9 +16,9 @@ mkdir -p /tmp/airbyte_local # Detach so we can run subsequent commands VERSION=dev TRACKING_STRATEGY=logging docker-compose up -d -trap 'echo "docker-compose logs:" && docker-compose logs -t --tail 1000 && docker-compose down && docker rm -f $(docker ps -q --filter name=airbyte_ci_pg)' EXIT +trap 'echo "docker-compose logs:" && docker-compose logs -t --tail 1000 && docker-compose down && docker stop airbyte_ci_pg' EXIT -docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=secret_password -e POSTGRES_DB=airbyte_ci --name airbyte_ci_pg postgres +docker run --rm -d -p 5433:5432 -e POSTGRES_PASSWORD=secret_password -e POSTGRES_DB=airbyte_ci --name airbyte_ci_pg postgres echo "Waiting for services to begin" sleep 30 # TODO need a better way to wait From 9bb9894da5ccc731993110d85db3b3a9620f1866 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 3 Mar 2022 10:15:04 +0100 Subject: [PATCH 4/7] Properly wait for server to be ready --- tools/bin/e2e_test.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/bin/e2e_test.sh b/tools/bin/e2e_test.sh index 7612ab9e83d5a..e0e194e6eff34 100755 --- a/tools/bin/e2e_test.sh +++ b/tools/bin/e2e_test.sh @@ -19,8 +19,12 @@ VERSION=dev TRACKING_STRATEGY=logging docker-compose up -d trap 'echo "docker-compose logs:" && docker-compose logs -t --tail 1000 && docker-compose down && docker stop airbyte_ci_pg' EXIT docker run --rm -d -p 5433:5432 -e POSTGRES_PASSWORD=secret_password -e POSTGRES_DB=airbyte_ci --name airbyte_ci_pg postgres -echo "Waiting for services to begin" -sleep 30 # TODO need a better way to wait +echo "Waiting for health API to be available..." +# Retry loading the health API of the server to check that the server is fully available +until $(curl --output /dev/null --fail --silent --max-time 5 --head localhost:8001/api/v1/health); do + echo "Health API not available yet. Retrying in 10 seconds..." + sleep 10 +done echo "Running e2e tests via gradle" SUB_BUILD=PLATFORM ./gradlew --no-daemon :airbyte-webapp-e2e-tests:e2etest -PcypressWebappKey=$CYPRESS_WEBAPP_KEY From 7a13e6e690557c063085c9a19c3af8a5a559ab70 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 3 Mar 2022 12:16:38 +0100 Subject: [PATCH 5/7] Isolate test suites better --- .../cypress/integration/connection.spec.js | 6 +++++- .../cypress/integration/destination.spec.js | 4 ++++ .../cypress/integration/source.spec.js | 4 ++++ .../cypress/support/commands/index.ts | 1 + .../cypress/support/commands/workspaces.js | 10 ++++++++++ 5 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js diff --git a/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.js b/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.js index 7c103f46a3bb4..29cabfe394854 100644 --- a/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.js +++ b/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.js @@ -1,4 +1,8 @@ describe("Connection main actions", () => { + beforeEach(() => { + cy.initialSetupCompleted(); + }); + it("Create new connection", () => { cy.createTestConnection("Test connection source cypress", "Test destination cypress"); @@ -6,7 +10,7 @@ describe("Connection main actions", () => { cy.get("div").contains("Test destination cypress").should("exist"); }); - it.only("Update connection", () => { + it("Update connection", () => { cy.intercept("/api/v1/web_backend/connections/update").as("updateConnection"); cy.createTestConnection("Test update connection source cypress", "Test update connection destination cypress"); diff --git a/airbyte-webapp-e2e-tests/cypress/integration/destination.spec.js b/airbyte-webapp-e2e-tests/cypress/integration/destination.spec.js index 8d64a08263d8f..94524c9135ac3 100644 --- a/airbyte-webapp-e2e-tests/cypress/integration/destination.spec.js +++ b/airbyte-webapp-e2e-tests/cypress/integration/destination.spec.js @@ -1,4 +1,8 @@ describe("Destination main actions", () => { + beforeEach(() => { + cy.initialSetupCompleted(); + }); + it("Create new destination", () => { cy.createTestDestination("Test destination cypress"); diff --git a/airbyte-webapp-e2e-tests/cypress/integration/source.spec.js b/airbyte-webapp-e2e-tests/cypress/integration/source.spec.js index 581251d4445c6..8b486d47dcf06 100644 --- a/airbyte-webapp-e2e-tests/cypress/integration/source.spec.js +++ b/airbyte-webapp-e2e-tests/cypress/integration/source.spec.js @@ -1,4 +1,8 @@ describe("Source main actions", () => { + beforeEach(() => { + cy.initialSetupCompleted(); + }); + it("Create new source", () => { cy.createTestSource("Test source cypress"); diff --git a/airbyte-webapp-e2e-tests/cypress/support/commands/index.ts b/airbyte-webapp-e2e-tests/cypress/support/commands/index.ts index 3ffc02becb89b..281bf7833b84c 100644 --- a/airbyte-webapp-e2e-tests/cypress/support/commands/index.ts +++ b/airbyte-webapp-e2e-tests/cypress/support/commands/index.ts @@ -3,3 +3,4 @@ import "./sidebar"; import "./source"; import "./destination"; import "./connection"; +import "./workspaces"; diff --git a/airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js b/airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js new file mode 100644 index 0000000000000..ba36e8245febf --- /dev/null +++ b/airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js @@ -0,0 +1,10 @@ +Cypress.Commands.add("initialSetupCompleted", () => { + // Modify the workspaces/list response to mark every workspace as "initialSetupComplete" to ensure we're not showing + // the setup/preference page for any workspace if this method got called. + cy.intercept("POST", "/api/v1/workspaces/list", (req) => { + req.continue(res => { + res.body.workspaces = res.body.workspaces.map(ws => ({ ...ws, initialSetupComplete: true })); + res.send(res.body); + }); + }); +}); \ No newline at end of file From 7c993765a49c431419e6fe6a1b8d648cc443ab20 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 3 Mar 2022 12:35:01 +0100 Subject: [PATCH 6/7] More test isolation --- airbyte-webapp-e2e-tests/cypress.json | 2 +- .../cypress/integration/onboarding.spec.js | 4 ++++ .../cypress/support/commands/workspaces.js | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/airbyte-webapp-e2e-tests/cypress.json b/airbyte-webapp-e2e-tests/cypress.json index cd22f12502da6..eb3940bd9db7e 100644 --- a/airbyte-webapp-e2e-tests/cypress.json +++ b/airbyte-webapp-e2e-tests/cypress.json @@ -1,6 +1,6 @@ { "projectId": "916nvw", - "baseUrl": "http://localhost:3000", + "baseUrl": "http://localhost:8000", "testFiles": [ "base.spec.js", "onboarding.spec.js", diff --git a/airbyte-webapp-e2e-tests/cypress/integration/onboarding.spec.js b/airbyte-webapp-e2e-tests/cypress/integration/onboarding.spec.js index 3a83011604651..b6ad80ceb2b27 100644 --- a/airbyte-webapp-e2e-tests/cypress/integration/onboarding.spec.js +++ b/airbyte-webapp-e2e-tests/cypress/integration/onboarding.spec.js @@ -1,4 +1,8 @@ describe("Preferences actions", () => { + beforeEach(() => { + cy.initialSetupCompleted(false); + }); + it("Should redirect to onboarding after email is entered", () => { cy.visit("/preferences"); cy.url().should("include", `/preferences`); diff --git a/airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js b/airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js index ba36e8245febf..3111fc247cf25 100644 --- a/airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js +++ b/airbyte-webapp-e2e-tests/cypress/support/commands/workspaces.js @@ -1,10 +1,10 @@ -Cypress.Commands.add("initialSetupCompleted", () => { +Cypress.Commands.add("initialSetupCompleted", (completed = true) => { // Modify the workspaces/list response to mark every workspace as "initialSetupComplete" to ensure we're not showing // the setup/preference page for any workspace if this method got called. cy.intercept("POST", "/api/v1/workspaces/list", (req) => { req.continue(res => { - res.body.workspaces = res.body.workspaces.map(ws => ({ ...ws, initialSetupComplete: true })); + res.body.workspaces = res.body.workspaces.map(ws => ({ ...ws, initialSetupComplete: completed })); res.send(res.body); }); }); -}); \ No newline at end of file +}); From 198f237e11cc25c9e6b47055172bb03c77ac4e4b Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 3 Mar 2022 12:52:19 +0100 Subject: [PATCH 7/7] Revert baseUrl for development --- airbyte-webapp-e2e-tests/cypress.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-webapp-e2e-tests/cypress.json b/airbyte-webapp-e2e-tests/cypress.json index eb3940bd9db7e..cd22f12502da6 100644 --- a/airbyte-webapp-e2e-tests/cypress.json +++ b/airbyte-webapp-e2e-tests/cypress.json @@ -1,6 +1,6 @@ { "projectId": "916nvw", - "baseUrl": "http://localhost:8000", + "baseUrl": "http://localhost:3000", "testFiles": [ "base.spec.js", "onboarding.spec.js",