From c47a748bc0a00fcb256e23c8b173146dc132e1ad Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 2 Apr 2024 19:39:15 +0000 Subject: [PATCH 1/4] start building out some e2e audit tests --- site/e2e/tests/auditLogs.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 site/e2e/tests/auditLogs.spec.ts diff --git a/site/e2e/tests/auditLogs.spec.ts b/site/e2e/tests/auditLogs.spec.ts new file mode 100644 index 0000000000000..cc0a0aaa74733 --- /dev/null +++ b/site/e2e/tests/auditLogs.spec.ts @@ -0,0 +1,13 @@ +import { test } from "@playwright/test"; +import { createTemplate, createWorkspace } from "../helpers"; +import { beforeCoderTest } from "../hooks"; + +test.beforeEach(async ({ page }) => await beforeCoderTest(page)); + +test("yay audit logs", async ({ page }) => { + const template = await createTemplate(page); + await createWorkspace(page, template); + + page.goto("/audit"); + await page.pause(); +}); From 693ae20c05632006638cac04fbc02e3a5370eb67 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Thu, 4 Apr 2024 11:20:35 -0600 Subject: [PATCH 2/4] fleshed out test --- scripts/lib.sh | 5 ++- site/e2e/README.md | 2 + site/e2e/tests/auditLogs.spec.ts | 68 +++++++++++++++++++++++++++++--- 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/scripts/lib.sh b/scripts/lib.sh index 1b4c48c784fdc..2414812c72679 100644 --- a/scripts/lib.sh +++ b/scripts/lib.sh @@ -190,6 +190,7 @@ if [[ "${CODER_LIBSH_NO_CHECK_DEPENDENCIES:-}" != *t* ]]; then if isdarwin; then log "On darwin:" log "- brew install bash" + log '- Add "$(brew --prefix bash)/bin" to your PATH' log "- Restart your terminal" fi log @@ -203,7 +204,7 @@ if [[ "${CODER_LIBSH_NO_CHECK_DEPENDENCIES:-}" != *t* ]]; then log "On darwin:" log "- brew install gnu-getopt" # shellcheck disable=SC2016 - log '- Add "$(brew --prefix)/opt/gnu-getopt/bin" to your PATH' + log '- Add "$(brew --prefix gnu-getopt)/bin" to your PATH' log "- Restart your terminal" fi log @@ -226,7 +227,7 @@ if [[ "${CODER_LIBSH_NO_CHECK_DEPENDENCIES:-}" != *t* ]]; then log "On darwin:" log "- brew install make" # shellcheck disable=SC2016 - log '- Add "$(brew --prefix)/opt/make/libexec/gnubin" to your PATH (you should Google this first)' + log '- Add "$(brew --prefix make)/libexec/gnubin" to your PATH' log "- Restart your terminal" fi log diff --git a/site/e2e/README.md b/site/e2e/README.md index 698d470e34642..ec09544f27505 100644 --- a/site/e2e/README.md +++ b/site/e2e/README.md @@ -12,6 +12,8 @@ cd site # Build the frontend assets. If you are actively changing # the site to debug an issue, add `--watch`. pnpm build +# Alternatively, build with debug info and source maps: +NODE_ENV=development pnpm vite build --mode=development # Install the browsers to `~/.cache/ms-playwright`. pnpm playwright:install # Run E2E tests. You can see the configuration of the server diff --git a/site/e2e/tests/auditLogs.spec.ts b/site/e2e/tests/auditLogs.spec.ts index cc0a0aaa74733..83c131df6336f 100644 --- a/site/e2e/tests/auditLogs.spec.ts +++ b/site/e2e/tests/auditLogs.spec.ts @@ -1,13 +1,69 @@ -import { test } from "@playwright/test"; -import { createTemplate, createWorkspace } from "../helpers"; +import { expect, test } from "@playwright/test"; +import { + createTemplate, + createWorkspace, + requiresEnterpriseLicense, +} from "../helpers"; import { beforeCoderTest } from "../hooks"; test.beforeEach(async ({ page }) => await beforeCoderTest(page)); -test("yay audit logs", async ({ page }) => { - const template = await createTemplate(page); - await createWorkspace(page, template); +test("inspecting and filtering audit logs", async ({ page }) => { + requiresEnterpriseLicense(); + const userName = "admin"; + // Do some stuff that should show up in the audit logs + const templateName = await createTemplate(page); + const workspaceName = await createWorkspace(page, templateName); + + // Go to the audit history page.goto("/audit"); - await page.pause(); + + // Make sure those things we did all actually show up + await expect(page.getByText(`${userName} logged in`)).toBeVisible(); + await expect( + page.getByText(`${userName} created template ${templateName}`), + ).toBeVisible(); + await expect( + page.getByText(`${userName} created workspace ${workspaceName}`), + ).toBeVisible(); + await expect( + page.getByText(`${userName} started workspace ${workspaceName}`), + ).toBeVisible(); + + // Make sure we can inspect the details of the log item + const createdWorkspace = page.locator(".MuiTableRow-root", { + hasText: `${userName} created workspace ${workspaceName}`, + }); + await createdWorkspace.getByLabel("open-dropdown").click(); + await expect( + createdWorkspace.getByText(`automatic_updates: "never"`), + ).toBeVisible(); + await expect( + createdWorkspace.getByText(`name: "${workspaceName}"`), + ).toBeVisible(); + + const startedWorkspaceMessage = `${userName} started workspace ${workspaceName}`; + const loginMessage = `${userName} logged in`; + + // Filter by resource type + await page.getByText("All resource types").click(); + await page.getByRole("menu").getByText("Workspace Build").click(); + // Our workspace build should be visible + await expect(page.getByText(startedWorkspaceMessage)).toBeVisible(); + // Logins should no longer be visible + await expect(page.getByText(loginMessage)).not.toBeVisible(); + + // Clear filters, everything should be visible again + await page.getByLabel("Clear filter").click(); + await expect(page.getByText(startedWorkspaceMessage)).toBeVisible(); + await expect(page.getByText(loginMessage)).toBeVisible(); + + // Filter by action type + await page.getByText("All actions").click(); + await page.getByRole("menu").getByText("Login").click(); + // Logins should be visible + await expect(page.getByText(loginMessage)).toBeVisible(); + // Our workspace build should no longer be visible + await expect(page.getByText(startedWorkspaceMessage)).not.toBeVisible(); }); From f12daee91f4a549a7183aac2c250df43a6596f17 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Thu, 4 Apr 2024 17:35:00 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=A7=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coderd/prometheusmetrics/prometheusmetrics_test.go | 2 +- scripts/lib.sh | 1 + site/e2e/tests/auditLogs.spec.ts | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/coderd/prometheusmetrics/prometheusmetrics_test.go b/coderd/prometheusmetrics/prometheusmetrics_test.go index 0ca7884cfbd8c..2322982a65d06 100644 --- a/coderd/prometheusmetrics/prometheusmetrics_test.go +++ b/coderd/prometheusmetrics/prometheusmetrics_test.go @@ -11,7 +11,6 @@ import ( "testing" "time" - "github.com/coder/coder/v2/cryptorand" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" "github.com/stretchr/testify/assert" @@ -32,6 +31,7 @@ import ( "github.com/coder/coder/v2/coderd/prometheusmetrics" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/codersdk/agentsdk" + "github.com/coder/coder/v2/cryptorand" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/tailnet" diff --git a/scripts/lib.sh b/scripts/lib.sh index 2414812c72679..689712eb1a31d 100644 --- a/scripts/lib.sh +++ b/scripts/lib.sh @@ -190,6 +190,7 @@ if [[ "${CODER_LIBSH_NO_CHECK_DEPENDENCIES:-}" != *t* ]]; then if isdarwin; then log "On darwin:" log "- brew install bash" + # shellcheck disable=SC2016 log '- Add "$(brew --prefix bash)/bin" to your PATH' log "- Restart your terminal" fi diff --git a/site/e2e/tests/auditLogs.spec.ts b/site/e2e/tests/auditLogs.spec.ts index 83c131df6336f..89c5410ae698a 100644 --- a/site/e2e/tests/auditLogs.spec.ts +++ b/site/e2e/tests/auditLogs.spec.ts @@ -17,7 +17,7 @@ test("inspecting and filtering audit logs", async ({ page }) => { const workspaceName = await createWorkspace(page, templateName); // Go to the audit history - page.goto("/audit"); + await page.goto("/audit"); // Make sure those things we did all actually show up await expect(page.getByText(`${userName} logged in`)).toBeVisible(); From 5c9dea292138d886950a1d5f4404a6e79418efed Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Thu, 11 Apr 2024 19:32:00 +0000 Subject: [PATCH 4/4] no redundant `async` `await` --- site/e2e/tests/app.spec.ts | 2 +- site/e2e/tests/auditLogs.spec.ts | 2 +- site/e2e/tests/createWorkspace.spec.ts | 2 +- site/e2e/tests/externalAuth.spec.ts | 2 +- site/e2e/tests/listTemplates.spec.ts | 2 +- site/e2e/tests/outdatedAgent.spec.ts | 2 +- site/e2e/tests/outdatedCLI.spec.ts | 2 +- site/e2e/tests/restartWorkspace.spec.ts | 2 +- site/e2e/tests/startWorkspace.spec.ts | 3 +++ site/e2e/tests/updateTemplate.spec.ts | 3 +++ site/e2e/tests/updateWorkspace.spec.ts | 2 +- site/e2e/tests/webTerminal.spec.ts | 2 +- 12 files changed, 16 insertions(+), 10 deletions(-) diff --git a/site/e2e/tests/app.spec.ts b/site/e2e/tests/app.spec.ts index 847ae6a7e0272..78b83991a0760 100644 --- a/site/e2e/tests/app.spec.ts +++ b/site/e2e/tests/app.spec.ts @@ -10,7 +10,7 @@ import { } from "../helpers"; import { beforeCoderTest } from "../hooks"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("app", async ({ context, page }) => { const appContent = "Hello World"; diff --git a/site/e2e/tests/auditLogs.spec.ts b/site/e2e/tests/auditLogs.spec.ts index 89c5410ae698a..d198a957e1e3e 100644 --- a/site/e2e/tests/auditLogs.spec.ts +++ b/site/e2e/tests/auditLogs.spec.ts @@ -6,7 +6,7 @@ import { } from "../helpers"; import { beforeCoderTest } from "../hooks"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("inspecting and filtering audit logs", async ({ page }) => { requiresEnterpriseLicense(); diff --git a/site/e2e/tests/createWorkspace.spec.ts b/site/e2e/tests/createWorkspace.spec.ts index 6a8b4ab7ada98..1fa770c5d3614 100644 --- a/site/e2e/tests/createWorkspace.spec.ts +++ b/site/e2e/tests/createWorkspace.spec.ts @@ -18,7 +18,7 @@ import { } from "../parameters"; import type { RichParameter } from "../provisionerGenerated"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("create workspace", async ({ page }) => { const template = await createTemplate(page, { diff --git a/site/e2e/tests/externalAuth.spec.ts b/site/e2e/tests/externalAuth.spec.ts index 941fac99146c6..2067582ccc0ba 100644 --- a/site/e2e/tests/externalAuth.spec.ts +++ b/site/e2e/tests/externalAuth.spec.ts @@ -5,7 +5,7 @@ import { gitAuth } from "../constants"; import { Awaiter, createServer } from "../helpers"; import { beforeCoderTest } from "../hooks"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); // Ensures that a Git auth provider with the device flow functions and completes! test("external auth device", async ({ page }) => { diff --git a/site/e2e/tests/listTemplates.spec.ts b/site/e2e/tests/listTemplates.spec.ts index 922d7215b74ad..87d87109a8659 100644 --- a/site/e2e/tests/listTemplates.spec.ts +++ b/site/e2e/tests/listTemplates.spec.ts @@ -1,7 +1,7 @@ import { test, expect } from "@playwright/test"; import { beforeCoderTest } from "../hooks"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("list templates", async ({ page, baseURL }) => { await page.goto(`${baseURL}/templates`, { waitUntil: "domcontentloaded" }); diff --git a/site/e2e/tests/outdatedAgent.spec.ts b/site/e2e/tests/outdatedAgent.spec.ts index 24f1442f7dcbd..ac045c38fd736 100644 --- a/site/e2e/tests/outdatedAgent.spec.ts +++ b/site/e2e/tests/outdatedAgent.spec.ts @@ -14,7 +14,7 @@ import { beforeCoderTest } from "../hooks"; // we no longer support versions prior to single tailnet: https://github.com/coder/coder/commit/d7cbdbd9c64ad26821e6b35834c59ecf85dcd9d4 const agentVersion = "v0.27.0"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("ssh with agent " + agentVersion, async ({ page }) => { const token = randomUUID(); diff --git a/site/e2e/tests/outdatedCLI.spec.ts b/site/e2e/tests/outdatedCLI.spec.ts index ca4957cceef61..55afdef7f4579 100644 --- a/site/e2e/tests/outdatedCLI.spec.ts +++ b/site/e2e/tests/outdatedCLI.spec.ts @@ -14,7 +14,7 @@ import { beforeCoderTest } from "../hooks"; // we no longer support versions prior to single tailnet: https://github.com/coder/coder/commit/d7cbdbd9c64ad26821e6b35834c59ecf85dcd9d4 const clientVersion = "v0.27.0"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("ssh with client " + clientVersion, async ({ page }) => { const token = randomUUID(); diff --git a/site/e2e/tests/restartWorkspace.spec.ts b/site/e2e/tests/restartWorkspace.spec.ts index 1e066aea0bd19..0da42b1257d6a 100644 --- a/site/e2e/tests/restartWorkspace.spec.ts +++ b/site/e2e/tests/restartWorkspace.spec.ts @@ -10,7 +10,7 @@ import { beforeCoderTest } from "../hooks"; import { firstBuildOption, secondBuildOption } from "../parameters"; import type { RichParameter } from "../provisionerGenerated"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("restart workspace with ephemeral parameters", async ({ page }) => { const richParameters: RichParameter[] = [firstBuildOption, secondBuildOption]; diff --git a/site/e2e/tests/startWorkspace.spec.ts b/site/e2e/tests/startWorkspace.spec.ts index 054bbf1721909..eb180c3df4ff9 100644 --- a/site/e2e/tests/startWorkspace.spec.ts +++ b/site/e2e/tests/startWorkspace.spec.ts @@ -7,9 +7,12 @@ import { stopWorkspace, verifyParameters, } from "../helpers"; +import { beforeCoderTest } from "../hooks"; import { firstBuildOption, secondBuildOption } from "../parameters"; import type { RichParameter } from "../provisionerGenerated"; +test.beforeEach(({ page }) => beforeCoderTest(page)); + test("start workspace with ephemeral parameters", async ({ page }) => { const richParameters: RichParameter[] = [firstBuildOption, secondBuildOption]; const template = await createTemplate( diff --git a/site/e2e/tests/updateTemplate.spec.ts b/site/e2e/tests/updateTemplate.spec.ts index 261e8bbca71d4..06075a15c2ba0 100644 --- a/site/e2e/tests/updateTemplate.spec.ts +++ b/site/e2e/tests/updateTemplate.spec.ts @@ -5,6 +5,9 @@ import { requiresEnterpriseLicense, updateTemplateSettings, } from "../helpers"; +import { beforeCoderTest } from "../hooks"; + +test.beforeEach(({ page }) => beforeCoderTest(page)); test("template update with new name redirects on successful submit", async ({ page, diff --git a/site/e2e/tests/updateWorkspace.spec.ts b/site/e2e/tests/updateWorkspace.spec.ts index 5de1c42e01e77..40b62aa1fc091 100644 --- a/site/e2e/tests/updateWorkspace.spec.ts +++ b/site/e2e/tests/updateWorkspace.spec.ts @@ -18,7 +18,7 @@ import { } from "../parameters"; import type { RichParameter } from "../provisionerGenerated"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("update workspace, new optional, immutable parameter added", async ({ page, diff --git a/site/e2e/tests/webTerminal.spec.ts b/site/e2e/tests/webTerminal.spec.ts index 37ab01d78e0b5..d4221ae036db3 100644 --- a/site/e2e/tests/webTerminal.spec.ts +++ b/site/e2e/tests/webTerminal.spec.ts @@ -9,7 +9,7 @@ import { } from "../helpers"; import { beforeCoderTest } from "../hooks"; -test.beforeEach(async ({ page }) => await beforeCoderTest(page)); +test.beforeEach(({ page }) => beforeCoderTest(page)); test("web terminal", async ({ context, page }) => { const token = randomUUID();