test: add an e2e audit logs test (#12868)

This commit is contained in:
Kayla Washburn-Love 2024-04-12 14:01:54 -06:00 committed by GitHub
parent cf2d2a98bd
commit 00fcf36999
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 90 additions and 11 deletions

View File

@ -190,6 +190,8 @@ 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
log
@ -203,7 +205,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 +228,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

View File

@ -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

View File

@ -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";

View File

@ -0,0 +1,69 @@
import { expect, test } from "@playwright/test";
import {
createTemplate,
createWorkspace,
requiresEnterpriseLicense,
} from "../helpers";
import { beforeCoderTest } from "../hooks";
test.beforeEach(({ page }) => beforeCoderTest(page));
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
await page.goto("/audit");
// 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();
});

View File

@ -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, {

View File

@ -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 }) => {

View File

@ -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" });

View File

@ -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 }) => {
test.setTimeout(40_000); // This is a slow test, 20s may not be enough on Mac.

View File

@ -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();

View File

@ -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];

View File

@ -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(

View File

@ -6,6 +6,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,

View File

@ -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,

View File

@ -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();