mirror of
https://github.com/coder/coder.git
synced 2026-09-22 05:05:20 +08:00
test(site): improve E2E framework (#9438)
This commit is contained in:
@@ -554,7 +554,7 @@ jobs:
|
||||
- run: pnpm playwright:install
|
||||
working-directory: site
|
||||
|
||||
- run: pnpm playwright:test
|
||||
- run: pnpm playwright:test --workers 1
|
||||
env:
|
||||
DEBUG: pw:api
|
||||
working-directory: site
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import { Page } from "@playwright/test"
|
||||
|
||||
export const beforeCoderTest = async (page: Page) => {
|
||||
// eslint-disable-next-line no-console -- Show everything that was printed with console.log()
|
||||
page.on("console", (msg) => console.log("[onConsole] " + msg.text()))
|
||||
|
||||
page.on("request", (request) => {
|
||||
if (!isApiCall(request.url())) {
|
||||
return
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-console -- Log HTTP requests for debugging purposes
|
||||
console.log(
|
||||
`[onRequest] method=${request.method()} url=${request.url()} postData=${
|
||||
request.postData() ? request.postData() : ""
|
||||
}`,
|
||||
)
|
||||
})
|
||||
page.on("response", async (response) => {
|
||||
if (!isApiCall(response.url())) {
|
||||
return
|
||||
}
|
||||
|
||||
const shouldLogResponse =
|
||||
!response.url().endsWith("/api/v2/deployment/config") &&
|
||||
!response.url().endsWith("/api/v2/debug/health")
|
||||
|
||||
let responseText = ""
|
||||
try {
|
||||
if (shouldLogResponse) {
|
||||
const buffer = await response.body()
|
||||
responseText = buffer.toString("utf-8")
|
||||
responseText = responseText.replace(/\n$/g, "")
|
||||
} else {
|
||||
responseText = "skipped..."
|
||||
}
|
||||
} catch (error) {
|
||||
responseText = "not_available"
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-console -- Log HTTP requests for debugging purposes
|
||||
console.log(
|
||||
`[onResponse] url=${response.url()} status=${response.status()} body=${responseText}`,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
const isApiCall = (urlString: string): boolean => {
|
||||
const url = new URL(urlString)
|
||||
const apiPath = "/api/v2"
|
||||
|
||||
return url.pathname.startsWith(apiPath)
|
||||
}
|
||||
@@ -30,6 +30,7 @@ export default defineConfig({
|
||||
timeout: 60000,
|
||||
},
|
||||
],
|
||||
reporter: [["./reporter.ts"]],
|
||||
use: {
|
||||
baseURL: `http://localhost:${port}`,
|
||||
video: "retain-on-failure",
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import type {
|
||||
FullConfig,
|
||||
Suite,
|
||||
TestCase,
|
||||
TestResult,
|
||||
FullResult,
|
||||
Reporter,
|
||||
} from "@playwright/test/reporter"
|
||||
|
||||
class CoderReporter implements Reporter {
|
||||
onBegin(config: FullConfig, suite: Suite) {
|
||||
// eslint-disable-next-line no-console -- Helpful for debugging
|
||||
console.log(`Starting the run with ${suite.allTests().length} tests`)
|
||||
}
|
||||
|
||||
onTestBegin(test: TestCase) {
|
||||
// eslint-disable-next-line no-console -- Helpful for debugging
|
||||
console.log(`Starting test ${test.title}`)
|
||||
}
|
||||
|
||||
onStdOut(chunk: string, test: TestCase, _: TestResult): void {
|
||||
// eslint-disable-next-line no-console -- Helpful for debugging
|
||||
console.log(
|
||||
`[stdout] [${test ? test.title : "unknown"}]: ${chunk.replace(
|
||||
/\n$/g,
|
||||
"",
|
||||
)}`,
|
||||
)
|
||||
}
|
||||
|
||||
onStdErr(chunk: string, test: TestCase, _: TestResult): void {
|
||||
// eslint-disable-next-line no-console -- Helpful for debugging
|
||||
console.log(
|
||||
`[stderr] [${test ? test.title : "unknown"}]: ${chunk.replace(
|
||||
/\n$/g,
|
||||
"",
|
||||
)}`,
|
||||
)
|
||||
}
|
||||
|
||||
onTestEnd(test: TestCase, result: TestResult) {
|
||||
// eslint-disable-next-line no-console -- Helpful for debugging
|
||||
console.log(`Finished test ${test.title}: ${result.status}`)
|
||||
}
|
||||
|
||||
onEnd(result: FullResult) {
|
||||
// eslint-disable-next-line no-console -- Helpful for debugging
|
||||
console.log(`Finished the run: ${result.status}`)
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars -- Playwright config uses it
|
||||
export default CoderReporter
|
||||
@@ -2,6 +2,9 @@ import { test } from "@playwright/test"
|
||||
import { randomUUID } from "crypto"
|
||||
import * as http from "http"
|
||||
import { createTemplate, createWorkspace, startAgent } from "../helpers"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
test("app", async ({ context, page }) => {
|
||||
const appContent = "Hello World"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { test, Page } from "@playwright/test"
|
||||
import { test } from "@playwright/test"
|
||||
import {
|
||||
createTemplate,
|
||||
createWorkspace,
|
||||
@@ -16,11 +16,9 @@ import {
|
||||
sixthParameter,
|
||||
} from "../parameters"
|
||||
import { RichParameter } from "../provisionerGenerated"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
test.beforeEach(async ({ page }: { page: Page }) => {
|
||||
// eslint-disable-next-line no-console -- For debugging purposes
|
||||
page.on("console", (msg) => console.log("Console: " + msg.text()))
|
||||
})
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
test("create workspace", async ({ page }) => {
|
||||
const template = await createTemplate(page, {
|
||||
|
||||
@@ -3,6 +3,9 @@ import { gitAuth } from "../constants"
|
||||
import { Endpoints } from "@octokit/types"
|
||||
import { GitAuthDevice } from "api/typesGenerated"
|
||||
import { Awaiter, createServer } from "../helpers"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
// Ensures that a Git auth provider with the device flow functions and completes!
|
||||
test("git auth device", async ({ page }) => {
|
||||
|
||||
@@ -7,9 +7,12 @@ import {
|
||||
sshIntoWorkspace,
|
||||
startAgentWithCommand,
|
||||
} from "../helpers"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
const agentVersion = "v0.14.0"
|
||||
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
test("ssh with agent " + agentVersion, async ({ page }) => {
|
||||
const token = randomUUID()
|
||||
const template = await createTemplate(page, {
|
||||
|
||||
@@ -7,9 +7,12 @@ import {
|
||||
sshIntoWorkspace,
|
||||
startAgent,
|
||||
} from "../helpers"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
const clientVersion = "v0.14.0"
|
||||
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
test("ssh with client " + clientVersion, async ({ page }) => {
|
||||
const token = randomUUID()
|
||||
const template = await createTemplate(page, {
|
||||
|
||||
@@ -9,6 +9,9 @@ import {
|
||||
|
||||
import { firstBuildOption, secondBuildOption } from "../parameters"
|
||||
import { RichParameter } from "../provisionerGenerated"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
test("restart workspace with ephemeral parameters", async ({ page }) => {
|
||||
const richParameters: RichParameter[] = [firstBuildOption, secondBuildOption]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { test, Page } from "@playwright/test"
|
||||
import { test } from "@playwright/test"
|
||||
|
||||
import {
|
||||
createTemplate,
|
||||
@@ -18,11 +18,9 @@ import {
|
||||
secondBuildOption,
|
||||
} from "../parameters"
|
||||
import { RichParameter } from "../provisionerGenerated"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
test.beforeEach(async ({ page }: { page: Page }) => {
|
||||
// eslint-disable-next-line no-console -- For debugging purposes
|
||||
page.on("console", (msg) => console.log("Console: " + msg.text()))
|
||||
})
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
test("update workspace, new optional, immutable parameter added", async ({
|
||||
page,
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import { test } from "@playwright/test"
|
||||
import { createTemplate, createWorkspace, startAgent } from "../helpers"
|
||||
import { randomUUID } from "crypto"
|
||||
import { beforeCoderTest } from "../hooks"
|
||||
|
||||
test.beforeEach(async ({ page }) => await beforeCoderTest(page))
|
||||
|
||||
test("web terminal", async ({ context, page }) => {
|
||||
const token = randomUUID()
|
||||
|
||||
Reference in New Issue
Block a user