2021-06-10 21:09:38 +08:00
|
|
|
import { test as base } from "@playwright/test"
|
2021-06-23 05:34:44 +08:00
|
|
|
import { CodeServer, CodeServerPage } from "./models/CodeServer"
|
2021-06-10 21:09:38 +08:00
|
|
|
|
2021-06-23 05:34:44 +08:00
|
|
|
/**
|
|
|
|
* 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`.
|
2021-06-24 06:41:36 +08:00
|
|
|
*
|
|
|
|
* If `includeCredentials` is `true` page requests will be authenticated.
|
2021-06-23 05:34:44 +08:00
|
|
|
*/
|
2022-02-16 05:51:42 +08:00
|
|
|
export const describe = (
|
|
|
|
name: string,
|
|
|
|
codeServerArgs: string[],
|
2022-03-03 04:02:51 +08:00
|
|
|
codeServerEnv: NodeJS.ProcessEnv,
|
2022-02-16 05:51:42 +08:00
|
|
|
fn: (codeServer: CodeServer) => void,
|
|
|
|
) => {
|
2021-06-23 05:34:44 +08:00
|
|
|
test.describe(name, () => {
|
|
|
|
// This will spawn on demand so nothing is necessary on before.
|
2022-08-10 02:24:37 +08:00
|
|
|
const codeServer = new CodeServer(name, codeServerArgs, codeServerEnv, undefined)
|
2021-06-23 05:34:44 +08:00
|
|
|
|
|
|
|
// 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()
|
|
|
|
})
|
|
|
|
|
2021-06-24 06:41:36 +08:00
|
|
|
test.use({
|
|
|
|
// Makes `codeServer` and `authenticated` available to the extend call
|
|
|
|
// below.
|
|
|
|
codeServer,
|
2022-02-16 05:51:42 +08:00
|
|
|
// NOTE@jsjoeio some tests use --cert which uses a self-signed certificate
|
|
|
|
// without this option, those tests will fail.
|
|
|
|
ignoreHTTPSErrors: true,
|
2021-06-24 06:41:36 +08:00
|
|
|
})
|
2021-06-23 05:34:44 +08:00
|
|
|
|
|
|
|
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`.
|
2022-08-10 02:24:37 +08:00
|
|
|
codeServerPage: async ({ codeServer, page }, use) => {
|
2021-06-26 01:05:13 +08:00
|
|
|
// It's possible code-server might prevent navigation because of unsaved
|
|
|
|
// changes (seems to happen based on timing even if no changes have been
|
|
|
|
// made too). In these cases just accept.
|
|
|
|
page.on("dialog", (d) => d.accept())
|
|
|
|
|
2022-08-10 02:24:37 +08:00
|
|
|
const codeServerPage = new CodeServerPage(codeServer, page)
|
2022-03-04 02:32:43 +08:00
|
|
|
await codeServerPage.navigate()
|
2021-06-23 05:34:44 +08:00
|
|
|
await use(codeServerPage)
|
2021-06-10 21:09:38 +08:00
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2021-06-23 05:34:44 +08:00
|
|
|
/** Shorthand for test.expect. */
|
2021-06-10 21:09:38 +08:00
|
|
|
export const expect = test.expect
|