Skip to content

Commit 75d9fc3

Browse files
authored
[LW-12654] test: add e2e test for Trezor with emulator (#1851)
* test: add e2e test for Trezor * test: save docker compose logs after teardown
1 parent b310ff9 commit 75d9fc3

16 files changed

+463
-33
lines changed

packages/e2e-tests/README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ UI-mapped gherkin tests for the Lace browser extension
1010
- On macOS, you can install it easily with homebrew: `brew install openjdk`
1111
- gpg
1212
- Firefox Developer Edition (for running tests on Firefox locally)
13+
- Docker (for Trezor tests)
1314

1415
## Running tests locally
1516

@@ -86,12 +87,12 @@ UI-mapped gherkin tests for the Lace browser extension
8687
- encrypt `walletConfiguration.ts` by running `./encrypt_secret.sh` (from the `packages/e2e-tests` directory)
8788
- delete `packages/e2e-tests/src/support/walletConfiguration.ts`
8889

89-
## Trezor test automation precondition (local run)
90+
## Trezor test automation precondition (for local development)
9091

91-
- run docker image locally <https://github.com/input-output-hk/lace-hw-testing-toolkit.git>
92+
- build docker image locally <https://github.com/input-output-hk/lace-hw-testing-toolkit.git> or
93+
- `docker pull public.ecr.aws/e8d0p1a5/lw-hw-testing-toolkit:latest` (you need to be authenticated) and run it
9294
- After starting docker image (info should be displayed - `⚡️ Trezor Device Manipulation API is running at http://localhost:8000`)
9395
Tests need to be triggered in 60 sec because emulator shuts down device if there is no action
94-
(will be improved in follow-up tickets by starting emulator trough API)
9596

9697
## Running tests locally in debug mode using IntelliJ IDEA/WebStorm
9798

packages/e2e-tests/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"eslint-plugin-import": "2.27.5",
5454
"eslint-plugin-wdio": "8.37.0",
5555
"flat": "6.0.1",
56+
"testcontainers": "10.24.2",
5657
"ts-node": "10.9.1",
5758
"typescript": "^4.9.5",
5859
"wdio-intercept-service": "4.4.1",
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
services:
2+
lw-hw-testing-toolkit-e2e:
3+
image: 'public.ecr.aws/e8d0p1a5/lw-hw-testing-toolkit:latest'
4+
container_name: lw-hw-testing-toolkit
5+
ports:
6+
- "3389:3389/tcp"
7+
- "127.0.0.1:21325:11325"
8+
- "8000:8000"
9+
tty: true
10+
stdin_open: true
11+
restart: "no"
12+
healthcheck:
13+
test: ['CMD', 'curl', '-f', 'http://localhost:8000/healthcheck']
14+
interval: 30s
15+
timeout: 5s
16+
retries: 3
17+
start_period: 10s

packages/e2e-tests/src/elements/trezorConnectPage.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
import { ChainablePromiseElement } from 'webdriverio';
33

44
class TrezorConnectPage {
5-
private CONFIRM_BUTTON = '[data-test="@permissions/confirm-button"]';
5+
private CONFIRM_BUTTON = '[data-testid="@permissions/confirm-button"]';
66
private EXPORT_BUTTON = '[id="container"] .confirm';
7-
private ANALYTICS_CONFIRM_BUTTON = '[data-test="@analytics/continue-button"]';
8-
private ANALYTICS_TOGGLE_BUTTON = '[data-test="@analytics/toggle-switch"]';
7+
private ANALYTICS_CONFIRM_BUTTON = '[data-testid="@analytics/continue-button"]';
8+
private ANALYTICS_TOGGLE_BUTTON = '[data-testid="@analytics/toggle-switch"]';
99
private SHADOW_ROOT = '#react';
1010

1111
get confirmButton(): ChainablePromiseElement<WebdriverIO.Element> {

packages/e2e-tests/src/features/trezor/Trezor.feature

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
1-
@TrezorOnboarding @Trezor @Pending
1+
@TrezorOnboarding @Trezor @Testnet
22
Feature: Trezor Onboarding
33

4+
@LW-7877 @Pending
45
Scenario: Onboarding Trezor wallet
56
And I connect, unlock and enter correct pin on Trezor emulator
6-
Given I reject analytics banner on "Get started" page
7-
And I click "Connect" button on wallet setup page
8-
# TODO: remove/replace outdated steps
9-
# And I click Trezor wallet icon
7+
And I force the Trezor account setup page to open
108
And I click "Next" button during wallet setup
11-
# And I select 1 account on Select Account page
12-
When I click "Next" button during wallet setup
13-
When I enter wallet name with size of: 10 characters
14-
When I click "Next" button during wallet setup
15-
And I switch to window with title: TrezorConnect
169
And I reject analytics and click "Allow once for this session" on Trezor Connect page
1710
And I click "Export" on Trezor Connect page
1811
And I confirm exporting public key on Trezor emulator
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { DockerManager } from '../support/DockerManager';
2+
3+
export const afterFeatureHook = async (): Promise<void> => {
4+
if (process.env.PRE_STARTED_TREZOR_SERVICES !== 'true' && DockerManager.getContainer()) {
5+
await DockerManager.downDockerCompose();
6+
}
7+
};

packages/e2e-tests/src/hooks/afterTagHooks.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { After } from '@wdio/cucumber-framework';
22
import { switchToWindowWithLace } from '../utils/window';
33
import extendedView from '../page/extendedView';
44
import { browser } from '@wdio/globals';
5+
import { stopEmulator } from '../utils/trezorEmulatorApiClient';
56

67
After(
78
{ tags: '@DAppConnector or @DAppConnector-Extended or @DAppConnector-Popup' },
@@ -12,3 +13,5 @@ After({ tags: '@LW-7125 or @LW-9335' }, async () => {
1213
await browser.reloadSession();
1314
await extendedView.visit();
1415
});
16+
17+
After({ tags: '@Trezor' }, async () => await stopEmulator());
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { DockerManager } from '../support/DockerManager';
2+
3+
import type { Feature } from '@cucumber/messages';
4+
import { Logger } from '../support/logger';
5+
6+
export const beforeFeatureHook = async (_uri: string, feature: Feature): Promise<void> => {
7+
Logger.log('running before feature hook');
8+
const tags = feature.tags.map((tag) => tag.name);
9+
10+
if (tags.includes('@Trezor') && !DockerManager.getContainer() && process.env.PRE_STARTED_TREZOR_SERVICES !== 'true') {
11+
await DockerManager.startComposeFile();
12+
}
13+
};

packages/e2e-tests/src/hooks/beforeTagHooks.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import networkManager from '../utils/networkManager';
77
import analyticsBanner from '../elements/analyticsBanner';
88
import { addAndActivateWalletsInRepository } from '../fixture/walletRepositoryInitializer';
99
import { setUsePersistentUserId } from '../utils/browserStorage';
10+
import { checkAndStartEmulator } from '../utils/trezorEmulatorApiClient';
1011

1112
const extendedViewRepositoryWalletInitialization = async (walletNames: TestWalletName[]): Promise<void> => {
1213
await extendedView.visit();
@@ -303,3 +304,12 @@ Before(
303304
await localStorageInitializer.disableShowPinExtension();
304305
}
305306
);
307+
308+
Before(
309+
{
310+
tags: '@Trezor'
311+
},
312+
async () => {
313+
await checkAndStartEmulator();
314+
}
315+
);

packages/e2e-tests/src/page/extendedView.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ class ExtendedView extends LaceView implements Page {
6262
await browser.url(`${await this.getBaseUrl()}#/voting`);
6363
await this.waitForPreloaderToDisappear();
6464
}
65+
66+
async visitTrezorSetupAccountPageWithOverride() {
67+
await browser.url(`${await this.getBaseUrl()}#/setup/hardware?force-trezor-picked`);
68+
await this.waitForPreloaderToDisappear();
69+
}
6570
}
6671

6772
export default new ExtendedView();

0 commit comments

Comments
 (0)