diff --git a/docs/playwright.md b/docs/playwright.md index a4c7d1b188..2c26b7ab2b 100644 --- a/docs/playwright.md +++ b/docs/playwright.md @@ -79,7 +79,7 @@ test.use({ The appropriate homeserver will be launched by the Playwright worker and reused for all tests which match the worker configuration. Due to homeservers being reused between tests, please use unique names for any rooms put into the room directory as they may be visible from other tests, the suggested approach is to use `testInfo.testId` within the name or lodash's uniqueId. -We remove public rooms from the directory between tests but deleting users doesn't have a homeserver agnostic solution. +We remove public rooms from the room directory between tests but deleting users doesn't have a homeserver agnostic solution. The logs from testcontainers will be attached to any reports output from Playwright. ## Writing Tests diff --git a/playwright/services.ts b/playwright/services.ts index 0d9ece0529..f275f63774 100644 --- a/playwright/services.ts +++ b/playwright/services.ts @@ -7,22 +7,25 @@ Please see LICENSE files in the repository root for full details. import { test as base } from "@playwright/test"; import mailhog from "mailhog"; -import { GenericContainer, Network, StartedNetwork, StartedTestContainer, Wait } from "testcontainers"; +import { Network, StartedNetwork } from "testcontainers"; import { PostgreSqlContainer, StartedPostgreSqlContainer } from "@testcontainers/postgresql"; import { SynapseConfigOptions, SynapseContainer } from "./testcontainers/synapse.ts"; import { ContainerLogger } from "./testcontainers/utils.ts"; import { StartedMatrixAuthenticationServiceContainer } from "./testcontainers/mas.ts"; import { HomeserverContainer, StartedHomeserverContainer } from "./testcontainers/HomeserverContainer.ts"; +import { MailhogContainer, StartedMailhogContainer } from "./testcontainers/mailhog.ts"; + +interface TestFixtures { + mailhogClient: mailhog.API; +} export interface Services { logger: ContainerLogger; network: StartedNetwork; postgres: StartedPostgreSqlContainer; - - mailhog: StartedTestContainer; - mailhogClient: mailhog.API; + mailhog: StartedMailhogContainer; synapseConfigOptions: SynapseConfigOptions; _homeserver: HomeserverContainer; @@ -30,7 +33,7 @@ export interface Services { mas?: StartedMatrixAuthenticationServiceContainer; } -export const test = base.extend<{}, Services>({ +export const test = base.extend({ logger: [ // eslint-disable-next-line no-empty-pattern async ({}, use) => { @@ -79,24 +82,20 @@ export const test = base.extend<{}, Services>({ mailhog: [ async ({ logger, network }, use) => { - const container = await new GenericContainer("mailhog/mailhog:latest") + const container = await new MailhogContainer() .withNetwork(network) .withNetworkAliases("mailhog") - .withExposedPorts(8025) .withLogConsumer(logger.getConsumer("mailhog")) - .withWaitStrategy(Wait.forListeningPorts()) .start(); await use(container); await container.stop(); }, { scope: "worker" }, ], - mailhogClient: [ - async ({ mailhog: container }, use) => { - await use(mailhog({ host: container.getHost(), port: container.getMappedPort(8025) })); - }, - { scope: "worker" }, - ], + mailhogClient: async ({ mailhog: container }, use) => { + await use(container.client); + await container.client.deleteAll(); + }, synapseConfigOptions: [{}, { option: true, scope: "worker" }], _homeserver: [ diff --git a/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png b/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png index 541eaa2fa5..6a55618c78 100644 Binary files a/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png and b/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png differ diff --git a/playwright/testcontainers/mailhog.ts b/playwright/testcontainers/mailhog.ts new file mode 100644 index 0000000000..c3305607d8 --- /dev/null +++ b/playwright/testcontainers/mailhog.ts @@ -0,0 +1,30 @@ +/* +Copyright 2024 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { AbstractStartedContainer, GenericContainer, StartedTestContainer, Wait } from "testcontainers"; +import mailhog from "mailhog"; + +export class MailhogContainer extends GenericContainer { + constructor() { + super("mailhog/mailhog:latest"); + + this.withExposedPorts(8025).withWaitStrategy(Wait.forListeningPorts()); + } + + public override async start(): Promise { + return new StartedMailhogContainer(await super.start()); + } +} + +export class StartedMailhogContainer extends AbstractStartedContainer { + public readonly client: mailhog.API; + + constructor(container: StartedTestContainer) { + super(container); + this.client = mailhog({ host: container.getHost(), port: container.getMappedPort(8025) }); + } +}