diff options
| -rw-r--r-- | gui/package.json | 2 | ||||
| -rw-r--r-- | gui/src/renderer/components/ConnectionPanel.tsx | 2 | ||||
| -rw-r--r-- | gui/test/e2e/installed/playwright.config.ts | 2 | ||||
| -rw-r--r-- | gui/test/e2e/installed/state-dependent/disconnected.spec.ts | 4 | ||||
| -rw-r--r-- | gui/test/e2e/installed/state-dependent/login.spec.ts | 4 | ||||
| -rw-r--r-- | gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts | 63 | ||||
| -rw-r--r-- | gui/test/e2e/mocked/tunnel-state.spec.ts | 12 | ||||
| -rw-r--r-- | gui/test/e2e/shared/tunnel-state.ts | 30 |
8 files changed, 60 insertions, 59 deletions
diff --git a/gui/package.json b/gui/package.json index 0d8fadc2f8..12b15be57d 100644 --- a/gui/package.json +++ b/gui/package.json @@ -98,7 +98,7 @@ "e2e": "npm run build && npm run e2e:no-build", "e2e:no-build": "xvfb-maybe -- playwright test mocked", "e2e:sequential": "npm run build && npm run e2e:sequential:no-build", - "e2e:sequential:no-build": "xvfb-maybe -- playwright test --workers 1", + "e2e:sequential:no-build": "xvfb-maybe -- playwright test -c test/e2e/installed/playwright.config.ts --workers 1", "e2e:update-snapshots": "npm run e2e:no-build -- --update-snapshots", "develop": "gulp develop", "test": "cross-env NODE_ENV=test electron-mocha --renderer --reporter spec --require ts-node/register --require \"test/unit/setup.ts\" \"test/unit/**/*.{ts,tsx}\"", diff --git a/gui/src/renderer/components/ConnectionPanel.tsx b/gui/src/renderer/components/ConnectionPanel.tsx index a366a9058d..07547363a0 100644 --- a/gui/src/renderer/components/ConnectionPanel.tsx +++ b/gui/src/renderer/components/ConnectionPanel.tsx @@ -111,7 +111,7 @@ export default class ConnectionPanel extends React.Component<IProps> { {entryPoint && ( <Row> <Caption>{messages.pgettext('connection-info', 'In')}</Caption> - <Text> + <Text data-testid="in-ip"> {`${entryPoint.ip}:${entryPoint.port} ${entryPoint.protocol.toUpperCase()}`} </Text> </Row> diff --git a/gui/test/e2e/installed/playwright.config.ts b/gui/test/e2e/installed/playwright.config.ts index 209838beb1..9c1fa7fb87 100644 --- a/gui/test/e2e/installed/playwright.config.ts +++ b/gui/test/e2e/installed/playwright.config.ts @@ -4,6 +4,8 @@ export default defineConfig({ testDir: process.cwd(), timeout: 60_000, workers: 1, + reportSlowTests: null, + maxFailures: 1, expect: { timeout: 30_000, }, diff --git a/gui/test/e2e/installed/state-dependent/disconnected.spec.ts b/gui/test/e2e/installed/state-dependent/disconnected.spec.ts index a26b61279c..360a88338d 100644 --- a/gui/test/e2e/installed/state-dependent/disconnected.spec.ts +++ b/gui/test/e2e/installed/state-dependent/disconnected.spec.ts @@ -1,6 +1,6 @@ import { test } from '@playwright/test'; import { Page } from 'playwright'; -import { assertDisconnected } from '../../shared/tunnel-state'; +import { expectDisconnected } from '../../shared/tunnel-state'; import { startInstalledApp } from '../installed-utils'; @@ -18,5 +18,5 @@ test.afterAll(async () => { }); test('App should show disconnected tunnel state', async () => { - await assertDisconnected(page); + await expectDisconnected(page); }); diff --git a/gui/test/e2e/installed/state-dependent/login.spec.ts b/gui/test/e2e/installed/state-dependent/login.spec.ts index b860de010c..4c6bc76dd4 100644 --- a/gui/test/e2e/installed/state-dependent/login.spec.ts +++ b/gui/test/e2e/installed/state-dependent/login.spec.ts @@ -5,7 +5,7 @@ import { RoutePath } from '../../../../src/renderer/lib/routes'; import { TestUtils } from '../../utils'; import { startInstalledApp } from '../installed-utils'; -import { assertDisconnected } from '../../shared/tunnel-state'; +import { expectDisconnected } from '../../shared/tunnel-state'; // This test expects the daemon to be logged out. // Env parameters: @@ -87,7 +87,7 @@ test('App should log in', async () => { await expect(subtitle).toHaveText('Valid account number'); expect(await util.waitForNavigation()).toEqual(RoutePath.main); - await assertDisconnected(page); + await expectDisconnected(page); }); test('App should log out', async () => { diff --git a/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts b/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts index b2c196b8dd..00535ad863 100644 --- a/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts +++ b/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts @@ -3,13 +3,10 @@ import { promisify } from 'util'; import { expect, test } from '@playwright/test'; import { Page } from 'playwright'; import { - assertConnected, - assertConnectedPq, - assertConnecting, - assertConnectingPq, - assertDisconnected, - assertDisconnecting, - assertError, + expectConnected, + expectConnectedPq, + expectDisconnected, + expectError, } from '../../shared/tunnel-state'; import { startInstalledApp } from '../installed-utils'; @@ -34,14 +31,12 @@ test.afterAll(async () => { }); test('App should show disconnected tunnel state', async () => { - await assertDisconnected(page); + await expectDisconnected(page); }); test('App should connect', async () => { await page.getByText('Secure my connection').click(); - - await assertConnecting(page); - await assertConnected(page); + await expectConnected(page); const relay = page.getByTestId('hostname-line'); const inIp = page.locator(':text("In") + span'); @@ -63,28 +58,30 @@ test('App should connect', async () => { }); test('App should show correct WireGuard port', async () => { - const inData = page.locator(':text("In") + span'); + const inData = page.getByTestId('in-ip'); await expect(inData).toContainText(new RegExp(':[0-9]+')); await exec('mullvad relay set tunnel wireguard --port=53'); - await assertConnected(page); + await expectConnected(page); await expect(inData).toContainText(new RegExp(':53')); await exec('mullvad relay set tunnel wireguard --port=51820'); - await assertConnected(page); + await expectConnected(page); await expect(inData).toContainText(new RegExp(':51820')); await exec('mullvad relay set tunnel wireguard --port=any'); }); test('App should show correct WireGuard transport protocol', async () => { - const inData = page.locator(':text("In") + span'); + const inData = page.getByTestId('in-ip'); await exec('mullvad obfuscation set mode udp2tcp'); + await expectConnected(page); await expect(inData).toContainText(new RegExp('TCP')); await exec('mullvad obfuscation set mode off'); + await expectConnected(page); await expect(inData).toContainText(new RegExp('UDP$')); }); @@ -94,33 +91,34 @@ test('App should show correct tunnel protocol', async () => { await exec('mullvad relay set tunnel-protocol openvpn'); await exec('mullvad relay set location se'); - await assertConnected(page); + await expectConnected(page); await expect(tunnelProtocol).toHaveText('OpenVPN'); }); test('App should show correct OpenVPN transport protocol and port', async () => { - const inData = page.locator(':text("In") + span'); + const inData = page.getByTestId('in-ip'); await expect(inData).toContainText(new RegExp(':[0-9]+')); await expect(inData).toContainText(new RegExp('(TCP|UDP)$')); await exec('mullvad relay set tunnel openvpn --transport-protocol udp --port 1195'); - await assertConnected(page); + await expectConnected(page); await expect(inData).toContainText(new RegExp(':1195')); await exec('mullvad relay set tunnel openvpn --transport-protocol udp --port 1300'); - await assertConnected(page); + await expectConnected(page); await expect(inData).toContainText(new RegExp(':1300')); await exec('mullvad relay set tunnel openvpn --transport-protocol tcp --port any'); + await expectConnected(page); await expect(inData).toContainText(new RegExp(':[0-9]+')); await expect(inData).toContainText(new RegExp('TCP$')); await exec('mullvad relay set tunnel openvpn --transport-protocol tcp --port 80'); - await assertConnected(page); + await expectConnected(page); await expect(inData).toContainText(new RegExp(':80')); await exec('mullvad relay set tunnel openvpn --transport-protocol tcp --port 443'); - await assertConnected(page); + await expectConnected(page); await expect(inData).toContainText(new RegExp(':443')); await exec('mullvad relay set tunnel openvpn --transport-protocol any'); @@ -128,6 +126,7 @@ test('App should show correct OpenVPN transport protocol and port', async () => test('App should show bridge mode', async () => { await exec('mullvad bridge set state on'); + await expectConnected(page); const relay = page.getByTestId('hostname-line'); await expect(relay).toHaveText(new RegExp(' via ', 'i')); await exec('mullvad bridge set state off'); @@ -137,27 +136,27 @@ test('App should show bridge mode', async () => { test('App should enter blocked state', async () => { await exec('mullvad relay set location xx'); - await assertError(page); + await expectError(page); - await exec(`mullvad relay set hostname ${process.env.HOSTNAME}`); - await assertConnected(page); + await exec(`mullvad relay set location ${process.env.HOSTNAME}`); + await expectConnected(page); }); test('App should disconnect', async () => { await page.getByText('Disconnect').click(); - await assertDisconnected(page); + await expectDisconnected(page); }); test('App should create quantum secure connection', async () => { await exec('mullvad tunnel set wireguard --quantum-resistant on'); await page.getByText('Secure my connection').click(); - await assertConnectingPq(page); - await assertConnectedPq(page); + await expectConnectedPq(page); }); test('App should show multihop', async () => { await exec('mullvad relay set tunnel wireguard --use-multihop=on'); + await expectConnectedPq(page); const relay = page.getByTestId('hostname-line'); await expect(relay).toHaveText(new RegExp('^' + escapeRegExp(`${process.env.HOSTNAME} via`), 'i')); await exec('mullvad relay set tunnel wireguard --use-multihop=off'); @@ -168,10 +167,10 @@ test('App should show multihop', async () => { test('App should become connected when other frontend connects', async () => { - await assertDisconnected(page); - await Promise.all([assertConnecting(page), exec('mullvad connect')]); - await assertConnected(page); + await expectDisconnected(page); + await exec('mullvad connect'); + await expectConnected(page); - await Promise.all([assertDisconnecting(page), exec('mullvad disconnect')]); - await assertDisconnected(page); + await exec('mullvad disconnect'); + await expectDisconnected(page); }); diff --git a/gui/test/e2e/mocked/tunnel-state.spec.ts b/gui/test/e2e/mocked/tunnel-state.spec.ts index c729fa27af..db919e09d3 100644 --- a/gui/test/e2e/mocked/tunnel-state.spec.ts +++ b/gui/test/e2e/mocked/tunnel-state.spec.ts @@ -3,7 +3,7 @@ import { Page } from 'playwright'; import { MockedTestUtils, startMockedApp } from './mocked-utils'; import { ErrorStateCause, ILocation, ITunnelEndpoint, TunnelState } from '../../../src/shared/daemon-rpc-types'; -import { assertConnected, assertConnecting, assertDisconnected, assertDisconnecting, assertError } from '../shared/tunnel-state'; +import { expectConnected, expectConnecting, expectDisconnected, expectDisconnecting, expectError } from '../shared/tunnel-state'; const mockLocation: ILocation = { country: 'Sweden', @@ -36,7 +36,7 @@ test('App should show disconnected tunnel state', async () => { channel: 'tunnel-', response: { state: 'disconnected' }, }); - await assertDisconnected(page); + await expectDisconnected(page); }); /** @@ -51,7 +51,7 @@ test('App should show connecting tunnel state', async () => { channel: 'tunnel-', response: { state: 'connecting' }, }); - await assertConnecting(page); + await expectConnecting(page); }); /** @@ -75,7 +75,7 @@ test('App should show connected tunnel state', async () => { response: { state: 'connected', details: { endpoint, location } }, }); - await assertConnected(page); + await expectConnected(page); }); /** @@ -90,7 +90,7 @@ test('App should show disconnecting tunnel state', async () => { channel: 'tunnel-', response: { state: 'disconnecting', details: 'nothing' }, }); - await assertDisconnecting(page); + await expectDisconnecting(page); }); /** @@ -105,5 +105,5 @@ test('App should show error tunnel state', async () => { channel: 'tunnel-', response: { state: 'error', details: { cause: ErrorStateCause.isOffline } }, }); - await assertError(page); + await expectError(page); }); diff --git a/gui/test/e2e/shared/tunnel-state.ts b/gui/test/e2e/shared/tunnel-state.ts index 09cbcd4999..db7b7e3658 100644 --- a/gui/test/e2e/shared/tunnel-state.ts +++ b/gui/test/e2e/shared/tunnel-state.ts @@ -13,8 +13,8 @@ const SECURE_BUTTON_COLOR = anyOf(colors.green, colors.green90); const getLabel = (page: Page) => page.locator('span[role="status"]'); const getHeader = (page: Page) => page.locator('header'); -export async function assertDisconnected(page: Page) { - await assertTunnelState(page, { +export async function expectDisconnected(page: Page) { + await expectTunnelState(page, { labelText: 'unsecured connection', labelColor: UNSECURED_COLOR, headerColor: UNSECURED_COLOR, @@ -23,8 +23,8 @@ export async function assertDisconnected(page: Page) { }); } -export async function assertConnecting(page: Page) { - await assertTunnelState(page, { +export async function expectConnecting(page: Page) { + await expectTunnelState(page, { labelText: 'creating secure connection', labelColor: WHITE_COLOR, headerColor: SECURE_COLOR, @@ -33,8 +33,8 @@ export async function assertConnecting(page: Page) { }); } -export async function assertConnected(page: Page) { - await assertTunnelState(page, { +export async function expectConnected(page: Page) { + await expectTunnelState(page, { labelText: 'secure connection', labelColor: SECURE_COLOR, headerColor: SECURE_COLOR, @@ -43,24 +43,24 @@ export async function assertConnected(page: Page) { }); } -export async function assertDisconnecting(page: Page) { - await assertTunnelState(page, { +export async function expectDisconnecting(page: Page) { + await expectTunnelState(page, { headerColor: UNSECURED_COLOR, buttonText: 'secure my connection', buttonColor: SECURE_BUTTON_COLOR, }); } -export async function assertError(page: Page) { - await assertTunnelState(page, { +export async function expectError(page: Page) { + await expectTunnelState(page, { labelText: 'blocked connection', labelColor: WHITE_COLOR, headerColor: SECURE_COLOR, }); } -export async function assertConnectingPq(page: Page) { - await assertTunnelState(page, { +export async function expectConnectingPq(page: Page) { + await expectTunnelState(page, { labelText: 'creating quantum secure connection', labelColor: WHITE_COLOR, headerColor: SECURE_COLOR, @@ -69,8 +69,8 @@ export async function assertConnectingPq(page: Page) { }); } -export async function assertConnectedPq(page: Page) { - await assertTunnelState(page, { +export async function expectConnectedPq(page: Page) { + await expectTunnelState(page, { labelText: 'quantum secure connection', labelColor: SECURE_COLOR, headerColor: SECURE_COLOR, @@ -87,7 +87,7 @@ interface TunnelStateContent { buttonColor?: string | RegExp; } -export async function assertTunnelState(page: Page, content: TunnelStateContent) { +export async function expectTunnelState(page: Page, content: TunnelStateContent) { const statusLabel = getLabel(page); if (content.labelText && content.labelColor) { await expect(statusLabel).toContainText(new RegExp(content.labelText, 'i')); |
