Skip to content

Commit

Permalink
Start using viewport params for Electron and optimize metadata group (#…
Browse files Browse the repository at this point in the history
…16381)

* feat(e2e): Electron launched by tests has fixed viewport size

* refactor(e2e): Optimize CI run grouping by splitting metadata group
  • Loading branch information
Vere-Grey authored Feb 3, 2025
1 parent a02095c commit e411dee
Show file tree
Hide file tree
Showing 18 changed files with 68 additions and 37 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/test-suite-desktop-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/test-suite-web-e2e-pw.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
17 changes: 9 additions & 8 deletions packages/suite-desktop-core/e2e/support/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand All @@ -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,
Expand All @@ -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);
Expand All @@ -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'));
Expand Down Expand Up @@ -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();

Expand Down
1 change: 1 addition & 0 deletions packages/suite-desktop-core/e2e/support/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ const test = base.extend<Fixtures>({
locale,
colorScheme,
videoFolder: testInfo.outputDir,
viewport: testInfo.project.use.viewport!,
});
await use(suite.window);
await suite.electronApp.close(); // Ensure cleanup after tests
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,23 @@ 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 () => {
await expectBridgeToBeRunning(request);
}).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');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down Expand Up @@ -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);
Expand Down
34 changes: 24 additions & 10 deletions packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-tor.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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();

Expand All @@ -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',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
2 changes: 1 addition & 1 deletion packages/suite-desktop-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit e411dee

Please sign in to comment.