diff --git a/.github/workflows/test-suite-desktop-e2e.yml b/.github/workflows/test-suite-desktop-e2e.yml index 55b06b9ec63..5ed4c363d88 100644 --- a/.github/workflows/test-suite-desktop-e2e.yml +++ b/.github/workflows/test-suite-desktop-e2e.yml @@ -44,8 +44,8 @@ jobs: # CONTAINERS: "trezor-user-env-unix" # - TEST_GROUP: "@group=passphrase" # CONTAINERS: "trezor-user-env-unix" - - TEST_GROUP: "@group=other" - CONTAINERS: "trezor-user-env-unix" + # - TEST_GROUP: "@group=other" + # CONTAINERS: "trezor-user-env-unix" - TEST_GROUP: "@group=wallet" CONTAINERS: "trezor-user-env-unix bitcoin-regtest" diff --git a/.github/workflows/test-suite-web-e2e-pw.yml b/.github/workflows/test-suite-web-e2e-pw.yml index 982f9167645..e3399555529 100644 --- a/.github/workflows/test-suite-web-e2e-pw.yml +++ b/.github/workflows/test-suite-web-e2e-pw.yml @@ -108,7 +108,9 @@ jobs: # CONTAINERS: "trezor-user-env-unix" - TEST_GROUP: "@group=settings" CONTAINERS: "trezor-user-env-unix" - - TEST_GROUP: "@group=metadata" + - TEST_GROUP: "@group=metadata1" + CONTAINERS: "trezor-user-env-unix" + - TEST_GROUP: "@group=metadata2" CONTAINERS: "trezor-user-env-unix" # - TEST_GROUP: "@group=passphrase" # CONTAINERS: "trezor-user-env-unix" diff --git a/packages/suite-desktop-core/e2e/support/common.ts b/packages/suite-desktop-core/e2e/support/common.ts index 74aa0c5f83a..efb416bb2cf 100644 --- a/packages/suite-desktop-core/e2e/support/common.ts +++ b/packages/suite-desktop-core/e2e/support/common.ts @@ -21,7 +21,8 @@ type LaunchSuiteParams = { bridgeDaemon?: boolean; locale?: string; colorScheme?: 'light' | 'dark' | 'no-preference' | null | undefined; - videoFolder?: string; + videoFolder: string; + viewport: { width: number; height: number }; }; const formatErrorLogMessage = (data: string) => { @@ -31,7 +32,7 @@ const formatErrorLogMessage = (data: string) => { return `${red}${data}${reset}`; }; -export const launchSuiteElectronApp = async (params: LaunchSuiteParams = {}) => { +export const launchSuiteElectronApp = async (params: LaunchSuiteParams) => { const defaultParams = { rmUserData: true, bridgeLegacyTest: true, @@ -40,7 +41,8 @@ export const launchSuiteElectronApp = async (params: LaunchSuiteParams = {}) => const options = Object.assign(defaultParams, params); const appDir = path.join(__dirname, '../../../suite-desktop'); - const desiredLogLevel = process.env.LOGLEVEL ?? 'error'; + const logLevelArgument = `--log-level=${process.env.LOGLEVEL ?? 'error'}`; + const viewportArgument = `--width=${options.viewport.width} --height=${options.viewport.height}`; if (!options.bridgeDaemon) { // TODO: #15646 Find out why currently pw fails to see node-bridge so we default to legacy bridge. await TrezorUserEnvLink.startBridge(LEGACY_BRIDGE_VERSION); @@ -51,15 +53,14 @@ export const launchSuiteElectronApp = async (params: LaunchSuiteParams = {}) => path.join(appDir, './dist/app.js'), disableHashCheckArgument, showDebugMenuArgument, - `--log-level=${desiredLogLevel}`, + viewportArgument, + logLevelArgument, ...(options.bridgeLegacyTest ? ['--bridge-legacy', '--bridge-test'] : []), ...(options.bridgeDaemon ? ['--bridge-daemon', '--skip-new-bridge-rollout'] : []), ], colorScheme: params.colorScheme, locale: params.locale, - ...(params.videoFolder && { - recordVideo: { dir: params.videoFolder, size: { width: 1280, height: 720 } }, - }), + recordVideo: { dir: options.videoFolder, size: options.viewport }, }); const localDataDir = await electronApp.evaluate(({ app }) => app.getPath('userData')); @@ -100,7 +101,7 @@ export const launchSuiteElectronApp = async (params: LaunchSuiteParams = {}) => return electronApp; }; -export const launchSuite = async (params: LaunchSuiteParams = {}) => { +export const launchSuite = async (params: LaunchSuiteParams) => { const electronApp = await launchSuiteElectronApp(params); const window = await electronApp.firstWindow(); diff --git a/packages/suite-desktop-core/e2e/support/fixtures.ts b/packages/suite-desktop-core/e2e/support/fixtures.ts index e2a5787141c..e96d9e39190 100644 --- a/packages/suite-desktop-core/e2e/support/fixtures.ts +++ b/packages/suite-desktop-core/e2e/support/fixtures.ts @@ -105,6 +105,7 @@ const test = base.extend({ locale, colorScheme, videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, }); await use(suite.window); await suite.electronApp.close(); // Ensure cleanup after tests diff --git a/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge-daemon.test.ts b/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge-daemon.test.ts index e0fa2c9c5f6..43121d4cb6f 100644 --- a/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge-daemon.test.ts +++ b/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge-daemon.test.ts @@ -13,10 +13,12 @@ test.describe.serial('Bridge', { tag: ['@group=suite', '@desktopOnly'] }, () => await trezorUserEnvLink.stopBridge(); }); - test('App in daemon mode spawns bridge', async ({ request }) => { + test('App in daemon mode spawns bridge', async ({ request }, testInfo) => { const daemonApp = await launchSuiteElectronApp({ bridgeDaemon: true, bridgeLegacyTest: false, + videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, }); await expect(async () => { @@ -24,7 +26,10 @@ test.describe.serial('Bridge', { tag: ['@group=suite', '@desktopOnly'] }, () => }).toPass({ timeout: 3_000 }); // launch UI - const suite = await launchSuite(); + const suite = await launchSuite({ + videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, + }); const title = await suite.window.title(); expect(title).toContain('Trezor Suite'); diff --git a/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge.test.ts b/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge.test.ts index 31c7fd16c31..ddc0cfe355e 100644 --- a/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge.test.ts +++ b/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-bridge.test.ts @@ -18,8 +18,13 @@ test.describe.serial('Bridge', { tag: ['@group=suite', '@desktopOnly'] }, () => }); // #15646 This test is failing and has no values since the launchSuite starts legacy bridge in emulator anyway - test.skip('App spawns bundled bridge and stops it after app quit', async ({ request }) => { - const suite = await launchSuite(); + test.skip('App spawns bundled bridge and stops it after app quit', async ({ + request, + }, testInfo) => { + const suite = await launchSuite({ + videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, + }); const title = await suite.window.title(); expect(title).toContain('Trezor Suite'); @@ -51,7 +56,10 @@ test.describe.serial('Bridge', { tag: ['@group=suite', '@desktopOnly'] }, () => await trezorUserEnvLink.setupEmu({}); await trezorUserEnvLink.startBridge(LEGACY_BRIDGE_VERSION); - const suite = await launchSuite(); + const suite = await launchSuite({ + videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, + }); await suite.window.title(); const devicePrompt = new DevicePromptActions(suite.window); diff --git a/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-tor.test.ts b/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-tor.test.ts index bafa3e372ce..6db07fedc58 100644 --- a/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-tor.test.ts +++ b/packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-tor.test.ts @@ -33,16 +33,21 @@ const turnOnTorInSettings = async (window: Page, shouldEnableTor = true) => { }; test.describe.skip('Tor loading screen', { tag: ['@group=suite', '@desktopOnly'] }, () => { - test('Tor loading screen: happy path', async () => { + /* eslint-disable-next-line no-empty-pattern */ + test('Tor loading screen: happy path', async ({}, testInfo) => { + const suiteArgs = { + videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, + }; test.setTimeout(timeout); - let suite = await launchSuite(); + let suite = await launchSuite(suiteArgs); await turnOnTorInSettings(suite.window); suite.electronApp.close(); - suite = await launchSuite(); + suite = await launchSuite(suiteArgs); await suite.window.waitForSelector('[data-testid="@tor-loading-screen"]', { state: 'visible', @@ -53,18 +58,22 @@ test.describe.skip('Tor loading screen', { tag: ['@group=suite', '@desktopOnly'] suite.electronApp.close(); }); - test('Tor loading screen: making sure that all the request go throw Tor', async () => { - test.setTimeout(timeout); + /* eslint-disable-next-line no-empty-pattern */ + test('Tor loading screen: making sure that all the request go throw Tor', async ({}, testInfo) => { + const suiteArgs = { + videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, + }; const networkAnalyzer = new NetworkAnalyzer(); - let suite = await launchSuite(); + let suite = await launchSuite(suiteArgs); await turnOnTorInSettings(suite.window); suite.electronApp.close(); - suite = await launchSuite(); + suite = await launchSuite(suiteArgs); // Start network analyzer after making sure tor is going to be running. networkAnalyzer.start(); @@ -82,16 +91,21 @@ test.describe.skip('Tor loading screen', { tag: ['@group=suite', '@desktopOnly'] suite.electronApp.close(); }); - test('Tor loading screen: disable tor while loading', async () => { + /* eslint-disable-next-line no-empty-pattern */ + test('Tor loading screen: disable tor while loading', async ({}, testInfo) => { + const suiteArgs = { + videoFolder: testInfo.outputDir, + viewport: testInfo.project.use.viewport!, + }; test.setTimeout(timeout); - let suite = await launchSuite(); + let suite = await launchSuite(suiteArgs); await turnOnTorInSettings(suite.window); suite.electronApp.close(); - suite = await launchSuite(); + suite = await launchSuite(suiteArgs); await suite.window.waitForSelector('[data-testid="@tor-loading-screen"]', { state: 'visible', diff --git a/packages/suite-desktop-core/e2e/tests/metadata/account-metadata.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/account-metadata.test.ts index 4934b6b4f7b..9c8e2cf5fb4 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/account-metadata.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/account-metadata.test.ts @@ -4,7 +4,7 @@ import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; // Metadata is by default disabled, this means, that application does not try to generate master key and connect to cloud. // Hovering over fields that may be labeled shows "add label" button upon which is clicked, Suite initiates metadata flow -test.describe('Account metadata', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Account metadata', { tag: ['@group=metadata1', '@webOnly'] }, () => { test.use({ emulatorSetupConf: { mnemonic: 'mnemonic_all' } }); test.beforeEach(async ({ metadataProviderMock }) => { await metadataProviderMock.start(MetadataProvider.DROPBOX); diff --git a/packages/suite-desktop-core/e2e/tests/metadata/address-metadata.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/address-metadata.test.ts index dab699f00a9..e4229c929c6 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/address-metadata.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/address-metadata.test.ts @@ -3,7 +3,7 @@ import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; const metadataEl = '@metadata/addressLabel/bc1q7e6qu5smalrpgqrx9k2gnf0hgjyref5p36ru2m'; -test.describe('Metadata - address labeling', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Metadata - address labeling', { tag: ['@group=metadata1', '@webOnly'] }, () => { test.use({ emulatorSetupConf: { mnemonic: 'mnemonic_all' } }); test.beforeEach(async ({ metadataProviderMock }) => { await metadataProviderMock.start(MetadataProvider.GOOGLE); diff --git a/packages/suite-desktop-core/e2e/tests/metadata/dropbox-api-errors.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/dropbox-api-errors.test.ts index bf999479edf..145a9640fed 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/dropbox-api-errors.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/dropbox-api-errors.test.ts @@ -2,7 +2,7 @@ import { AccountLabelId } from '../../support/enums/accountLabelId'; import { expect, test } from '../../support/fixtures'; import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; -test.describe('Dropbox API errors', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Dropbox API errors', { tag: ['@group=metadata1', '@webOnly'] }, () => { test.use({ emulatorSetupConf: { mnemonic: 'mnemonic_all' }, }); diff --git a/packages/suite-desktop-core/e2e/tests/metadata/google-api-errors.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/google-api-errors.test.ts index bed2dc51051..b9dd267aeac 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/google-api-errors.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/google-api-errors.test.ts @@ -2,7 +2,7 @@ import { AccountLabelId } from '../../support/enums/accountLabelId'; import { expect, test } from '../../support/fixtures'; import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; -test.describe('Google API errors', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Google API errors', { tag: ['@group=metadata1', '@webOnly'] }, () => { test.use({ emulatorSetupConf: { mnemonic: 'mnemonic_all' }, }); diff --git a/packages/suite-desktop-core/e2e/tests/metadata/interval-fetching.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/interval-fetching.test.ts index d5320e59709..43d50b26e4f 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/interval-fetching.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/interval-fetching.test.ts @@ -15,7 +15,7 @@ const providers = [ }, ] as const; -test.describe('Account metadata', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Account metadata', { tag: ['@group=metadata1', '@webOnly'] }, () => { test.use({ emulatorSetupConf: { mnemonic: 'mnemonic_all' } }); providers.forEach(p => { diff --git a/packages/suite-desktop-core/e2e/tests/metadata/metadata-lifecycle.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/metadata-lifecycle.test.ts index c5b596cf97a..766b663a240 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/metadata-lifecycle.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/metadata-lifecycle.test.ts @@ -4,7 +4,7 @@ import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; test.describe( 'Metadata - cancel metadata on device', - { tag: ['@group=metadata', '@webOnly'] }, + { tag: ['@group=metadata2', '@webOnly'] }, () => { test.use({ emulatorSetupConf: { diff --git a/packages/suite-desktop-core/e2e/tests/metadata/output-labeling.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/output-labeling.test.ts index 6d70e24d264..6d75abbefa5 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/output-labeling.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/output-labeling.test.ts @@ -4,7 +4,7 @@ import { OutputLabelId } from '../../support/enums/outputLabelId'; import { expect, test } from '../../support/fixtures'; import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; -test.describe('Metadata - Output labeling', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Metadata - Output labeling', { tag: ['@group=metadata1', '@webOnly'] }, () => { test.use({ emulatorSetupConf: { mnemonic: 'mnemonic_all' } }); test.beforeEach(async ({ metadataProviderMock }) => { await metadataProviderMock.start(MetadataProvider.DROPBOX); diff --git a/packages/suite-desktop-core/e2e/tests/metadata/remembered-device.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/remembered-device.test.ts index 6bba6da53d8..b700f850c7c 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/remembered-device.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/remembered-device.test.ts @@ -5,7 +5,7 @@ import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; //Metadata - In settings, there is enable metadata switch. //On enable, it initiates metadata right away (if device already has state). //On disable, it throws away all metadata related records from memory. -test.describe('Remembered device', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Remembered device', { tag: ['@group=metadata2', '@webOnly'] }, () => { test.use({ emulatorStartConf: { model: 'T2T1', wipe: true }, emulatorSetupConf: { mnemonic: 'mnemonic_all' }, diff --git a/packages/suite-desktop-core/e2e/tests/metadata/switching-providers.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/switching-providers.test.ts index 2a43b59bba7..d0553ed3140 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/switching-providers.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/switching-providers.test.ts @@ -4,7 +4,7 @@ import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; test.describe( 'Metadata - switching between cloud providers', - { tag: ['@group=metadata', '@webOnly'] }, + { tag: ['@group=metadata2', '@webOnly'] }, () => { const dropboxLabel = 'dropbox label'; const googleLabel = 'google label'; diff --git a/packages/suite-desktop-core/e2e/tests/metadata/wallet-metadata.test.ts b/packages/suite-desktop-core/e2e/tests/metadata/wallet-metadata.test.ts index 41ff7bade35..7b451a7da4a 100644 --- a/packages/suite-desktop-core/e2e/tests/metadata/wallet-metadata.test.ts +++ b/packages/suite-desktop-core/e2e/tests/metadata/wallet-metadata.test.ts @@ -4,7 +4,7 @@ import { MetadataProvider } from '../../support/mocks/metadataProviderMock'; const standardWalletIndex = 0; const hiddenWalletIndex = 1; -test.describe('Metadata - wallet labeling', { tag: ['@group=metadata', '@webOnly'] }, () => { +test.describe('Metadata - wallet labeling', { tag: ['@group=metadata2', '@webOnly'] }, () => { test.beforeEach(async ({ onboardingPage, dashboardPage, metadataProviderMock }) => { await metadataProviderMock.start(MetadataProvider.DROPBOX); await onboardingPage.completeOnboarding({ enableViewOnly: true }); diff --git a/packages/suite-desktop-core/package.json b/packages/suite-desktop-core/package.json index 4d5b7758b7f..56a309afa6a 100644 --- a/packages/suite-desktop-core/package.json +++ b/packages/suite-desktop-core/package.json @@ -13,7 +13,7 @@ "test:e2e": "yarn xvfb-maybe -- playwright test --config=./e2e/playwright.config.ts", "test:e2e:web": "yarn xvfb-maybe -- playwright test --config=./e2e/playwright.config.ts --project=web", "test:e2e:desktop": "yarn xvfb-maybe -- playwright test --config=./e2e/playwright.config.ts --project=desktop", - "test:e2e:update-snapshots": "yarn xvfb-maybe -- playwright test --config=./e2e/playwright.config.ts --project=web --grep @snapshot --update-snapshots" + "test:e2e:update-snapshots": "yarn xvfb-maybe -- playwright test --config=./e2e/playwright.config.ts --grep @snapshot --update-snapshots" }, "dependencies": { "@sentry/electron": "^5.9.0",