Archived
1
0

Run each e2e test in a new workspace

The workspaces also have settings to prevent the welcome page from
appearing.
This commit is contained in:
Asher 2021-06-22 16:34:11 -05:00
parent 4a47ce774d
commit ba0364a522
No known key found for this signature in database
GPG Key ID: D63C1EF81242354A
5 changed files with 52 additions and 26 deletions

View File

@ -1,21 +1,24 @@
import { promises as fs } from "fs"
import * as path from "path"
import { Page } from "playwright" import { Page } from "playwright"
import { CODE_SERVER_ADDRESS } from "../../utils/constants" import { CODE_SERVER_ADDRESS, workspaceDir } from "../../utils/constants"
import { tmpdir } from "../../utils/helpers"
// This is a Page Object Model // This is a Page Object Model
// We use these to simplify e2e test authoring // We use these to simplify e2e test authoring
// See Playwright docs: https://playwright.dev/docs/pom/ // See Playwright docs: https://playwright.dev/docs/pom/
export class CodeServer { export class CodeServer {
page: Page private readonly editorSelector = "div.monaco-workbench"
editorSelector = "div.monaco-workbench"
constructor(page: Page) { constructor(public readonly page: Page) {}
this.page = page
}
/** /**
* Navigates to CODE_SERVER_ADDRESS * Navigates to CODE_SERVER_ADDRESS. It will open a newly created random
* directory.
*/ */
async navigate() { async navigate() {
await this.page.goto(CODE_SERVER_ADDRESS, { waitUntil: "networkidle" }) const dir = await this.createWorkspace()
await this.page.goto(`${CODE_SERVER_ADDRESS}?folder=${dir}`, { waitUntil: "networkidle" })
} }
/** /**
@ -113,4 +116,20 @@ export class CodeServer {
await this.navigate() await this.navigate()
await this.reloadUntilEditorIsReady() await this.reloadUntilEditorIsReady()
} }
/**
* Create a random workspace and seed it with settings.
*/
private async createWorkspace(): Promise<string> {
const dir = await tmpdir(workspaceDir)
await fs.mkdir(path.join(dir, ".vscode"))
await fs.writeFile(
path.join(dir, ".vscode/settings.json"),
JSON.stringify({
"workbench.startupEditor": "none",
}),
"utf8",
)
return dir
}
} }

View File

@ -6,7 +6,7 @@ import path from "path"
const config: PlaywrightTestConfig = { const config: PlaywrightTestConfig = {
testDir: path.join(__dirname, "e2e"), // Search for tests in this directory. testDir: path.join(__dirname, "e2e"), // Search for tests in this directory.
timeout: 60000, // Each test is given 60 seconds. timeout: 60000, // Each test is given 60 seconds.
retries: 3, // Retry failing tests 2 times retries: process.env.CI ? 2 : 1, // Retry twice in CI due to flakiness.
workers: 1, workers: 1,
globalSetup: require.resolve("./utils/globalSetup.ts"), globalSetup: require.resolve("./utils/globalSetup.ts"),
reporter: "list", reporter: "list",
@ -34,10 +34,4 @@ const config: PlaywrightTestConfig = {
], ],
} }
if (process.env.CI) {
// In CI, retry failing tests 2 times
// in the event of flakiness
config.retries = 2
}
export default config export default config

View File

@ -1,3 +1,4 @@
export const CODE_SERVER_ADDRESS = process.env.CODE_SERVER_ADDRESS || "http://localhost:8080" export const CODE_SERVER_ADDRESS = process.env.CODE_SERVER_ADDRESS || "http://localhost:8080"
export const PASSWORD = process.env.PASSWORD || "e45432jklfdsab" export const PASSWORD = process.env.PASSWORD || "e45432jklfdsab"
export const storageState = JSON.parse(process.env.STORAGE || "{}") export const storageState = JSON.parse(process.env.STORAGE || "{}")
export const workspaceDir = "workspaces"

View File

@ -1,15 +1,20 @@
// This setup runs before our e2e tests
// so that it authenticates us into code-server
// ensuring that we're logged in before we run any tests
import { chromium } from "playwright" import { chromium } from "playwright"
import { hash } from "../../src/node/util" import { hash } from "../../src/node/util"
import { PASSWORD } from "./constants" import { PASSWORD, workspaceDir } from "./constants"
import { clean } from "./helpers"
import * as wtfnode from "./wtfnode" import * as wtfnode from "./wtfnode"
/**
* Perform workspace cleanup and authenticate. This should be set up to run
* before our tests execute.
*/
export default async function () { export default async function () {
console.log("\n🚨 Running Global Setup for Playwright End-to-End Tests") console.log("\n🚨 Running Global Setup for Playwright End-to-End Tests")
console.log(" Please hang tight...") console.log(" Please hang tight...")
// Cleanup workspaces from previous tests.
await clean(workspaceDir)
const cookieToStore = { const cookieToStore = {
sameSite: "Lax" as const, sameSite: "Lax" as const,
name: "key", name: "key",

View File

@ -1,4 +1,4 @@
import * as fs from "fs" import { promises as fs } from "fs"
import * as os from "os" import * as os from "os"
import * as path from "path" import * as path from "path"
@ -20,13 +20,20 @@ export function createLoggerMock() {
} }
/** /**
* Create a uniquely named temporary directory. * Clean up directories left by a test. It is recommended to do this when a test
* * starts to avoid potentially accumulating infinite test directories.
* These directories are placed under a single temporary code-server directory. */
export async function clean(testName: string): Promise<void> {
const dir = path.join(os.tmpdir(), `code-server/tests/${testName}`)
await fs.rm(dir, { recursive: true })
}
/**
* Create a uniquely named temporary directory for a test.
*/ */
export async function tmpdir(testName: string): Promise<string> { export async function tmpdir(testName: string): Promise<string> {
const dir = path.join(os.tmpdir(), "code-server/tests") const dir = path.join(os.tmpdir(), `code-server/tests/${testName}`)
await fs.promises.mkdir(dir, { recursive: true }) await fs.mkdir(dir, { recursive: true })
return await fs.promises.mkdtemp(path.join(dir, `${testName}-`), { encoding: "utf8" }) return await fs.mkdtemp(path.join(dir, `${testName}-`), { encoding: "utf8" })
} }