Spawn a code-server instance for each test suite
This uses the current dev build by default but can be overidden with CODE_SERVER_TEST_ENTRY (for example to test a release or some other version). Each instance has a separate state directory. This should make parallelization work. This also means you are no longer required to specify the password and address yourself (or the extension directory once we add a test extension). `yarn test:e2e` should just work as-is. Lastly, it means the tests are no longer subject to yarn watch randomly restarting.
This commit is contained in:
@ -1,12 +1,47 @@
|
||||
import { field, logger } from "@coder/logger"
|
||||
import { test as base } from "@playwright/test"
|
||||
import { CodeServer } from "./models/CodeServer"
|
||||
import { CodeServer, CodeServerPage } from "./models/CodeServer"
|
||||
|
||||
export const test = base.extend<{ codeServerPage: CodeServer }>({
|
||||
codeServerPage: async ({ page }, use) => {
|
||||
const codeServer = new CodeServer(page)
|
||||
await codeServer.navigate()
|
||||
await use(codeServer)
|
||||
/**
|
||||
* Wraps `test.describe` to create and manage an instance of code-server. If you
|
||||
* don't use this you will need to create your own code-server instance and pass
|
||||
* it to `test.use`.
|
||||
*/
|
||||
export const describe = (name: string, fn: (codeServer: CodeServer) => void) => {
|
||||
test.describe(name, () => {
|
||||
// This will spawn on demand so nothing is necessary on before.
|
||||
const codeServer = new CodeServer(name)
|
||||
|
||||
// Kill code-server after the suite has ended. This may happen even without
|
||||
// doing it explicitly but it seems prudent to be sure.
|
||||
test.afterAll(async () => {
|
||||
await codeServer.close()
|
||||
})
|
||||
|
||||
// This makes `codeServer` available to the extend call below.
|
||||
test.use({ codeServer })
|
||||
|
||||
fn(codeServer)
|
||||
})
|
||||
}
|
||||
|
||||
interface TestFixtures {
|
||||
codeServer: CodeServer
|
||||
codeServerPage: CodeServerPage
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a test that spawns code-server if necessary and ensures the page is
|
||||
* ready.
|
||||
*/
|
||||
export const test = base.extend<TestFixtures>({
|
||||
codeServer: undefined, // No default; should be provided through `test.use`.
|
||||
codeServerPage: async ({ codeServer, page }, use) => {
|
||||
const codeServerPage = new CodeServerPage(codeServer, page)
|
||||
await codeServerPage.navigate()
|
||||
await use(codeServerPage)
|
||||
},
|
||||
})
|
||||
|
||||
/** Shorthand for test.expect. */
|
||||
export const expect = test.expect
|
||||
|
Reference in New Issue
Block a user