Skip to content

Commit 88908ec

Browse files
authored
Merge pull request #2572 from IntersectMBO/refactor/test-structure
Refactor test suite: Automated Testing Strategy for Mainnet with ADA-Free Scenarios
2 parents 2d816f0 + 63b50c4 commit 88908ec

30 files changed

+350
-272
lines changed

.github/workflows/test_integration_playwright.yml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ on:
1515
- "staging.govtool.byron.network"
1616
- "govtool.cardanoapi.io"
1717
- "preview.gov.tools"
18+
- "gov.tools"
1819

1920
workflow_run:
2021
workflows: ["Build and deploy GovTool to TEST server"]
@@ -54,18 +55,27 @@ jobs:
5455
mkdir -p ./lib/_mock
5556
chmod +w ./lib/_mock
5657
npm run generate-wallets
57-
if [[ "${{ env.NETWORK }}" == "preprod" ]]; then
58+
59+
# Set network variables based on deployment input and environment
60+
if [[ "${{inputs.deployment}}" == "gov.tools" ]]; then
61+
export NETWORK='mainnet'
62+
else
63+
export NETWORK="${{ vars.NETWORK }}"
64+
fi
65+
66+
# Set API keys based on the network
67+
if [[ "${{ vars.NETWORK }}" == "preprod" ]]; then
5868
export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREPROD }}"
5969
export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_PREPROD }}"
60-
elif [[ "${{ env.NETWORK }}" == "sanchonet" ]]; then
70+
elif [[ "${{ vars.NETWORK }}" == "sanchonet" ]]; then
6171
export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_SANCHONET }}"
6272
export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_SANCHONET }}"
6373
else
6474
export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREVIEW }}"
6575
export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_PREVIEW }}"
6676
fi
77+
6778
npm test
68-
6979
7080
- name: Upload report
7181
uses: actions/upload-artifact@v3
@@ -88,7 +98,6 @@ jobs:
8898
KUBER_API_KEY: ${{secrets.KUBER_API_KEY}}
8999
TEST_WORKERS: ${{vars.TEST_WORKERS}}
90100
CI: ${{vars.CI}}
91-
NETWORK: ${{vars.NETWORK}}
92101
FAUCET_ADDRESS: ${{vars.FAUCET_ADDRESS}}
93102
CARDANOAPI_METADATA_URL: ${{vars.CARDANOAPI_METADATA_URL}}
94103
PROPOSAL_FAUCET_PAYMENT_PRIVATE: ${{secrets.PROPOSAL_FAUCET_PAYMENT_PRIVATE}}

tests/govtool-frontend/playwright/lib/constants/environments.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ const environments = {
1414
apiUrl: `${SERVER_HOST_URL}/api`,
1515
docsUrl: process.env.DOCS_URL || "https://docs.gov.tools/cardano-govtool",
1616
pdfUrl: process.env.PDF_URL || "https://dev.api.pdf.gov.tools",
17-
networkId: parseInt(process.env.NETWORK_ID) || 0,
17+
networkId: NETWORK === "mainnet" ? 1 : 0,
1818
faucet: {
19-
apiUrl:`https://faucet.${NETWORK}.world.dev.cardano.org`,
19+
apiUrl: `https://faucet.${NETWORK}.world.dev.cardano.org`,
2020
apiKey: process.env.FAUCET_API_KEY || "",
2121
address:
2222
process.env.FAUCET_ADDRESS ||

tests/govtool-frontend/playwright/lib/fixtures/loadExtension.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default async function loadDemosExtension(
1919
let walletConfig: CardanoTestWalletConfig = {
2020
enableStakeSigning,
2121
kuberApiUrl: environments.kuber.apiUrl,
22+
networkId: environments.networkId,
2223
kuberApiKey: environments.kuber.apiKey,
2324
blockfrostApiKey: environments.blockfrostApiKey,
2425
blockfrostApiUrl: environments.blockfrostApiUrl,

tests/govtool-frontend/playwright/lib/helpers/auth.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export async function createAuthWithUserName({
4545

4646
const proposalDiscussionPage = new ProposalDiscussionPage(page);
4747
await proposalDiscussionPage.goto();
48-
await proposalDiscussionPage.verifyIdentityBtn.click();
48+
await proposalDiscussionPage.verifyIdentityBtn.click({ timeout: 15_000 });
4949

5050
await proposalDiscussionPage.setUsername(mockValid.username());
5151

tests/govtool-frontend/playwright/lib/helpers/cardano.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import test, { expect } from "@playwright/test";
1+
import environments from "@constants/environments";
2+
import test from "@playwright/test";
23
import kuberService from "@services/kuberService";
34
import { ProposalType, ProtocolParams } from "@types";
45
import { allure } from "allure-playwright";
@@ -45,3 +46,12 @@ export async function skipIfNotHardFork() {
4546
test.skip();
4647
}
4748
}
49+
50+
export async function skipIfMainnet() {
51+
if (environments.networkId === 1) {
52+
await allure.description(
53+
"Ada spendable features are not available on mainnet."
54+
);
55+
test.skip();
56+
}
57+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import DRepDirectoryPage from "@pages/dRepDirectoryPage";
2+
import { Page } from "@playwright/test";
3+
4+
export async function fetchFirstActiveDRepDetails(page: Page) {
5+
let dRepGivenName: string;
6+
let dRepId: string;
7+
let dRepDirectoryPage: DRepDirectoryPage;
8+
await page.route(
9+
"**/drep/list?page=0&pageSize=10&sort=Random&**",
10+
async (route) => {
11+
const response = await route.fetch();
12+
const json = await response.json();
13+
const elements = json["elements"].filter(
14+
(element) => element["givenName"] != null
15+
);
16+
dRepGivenName =
17+
elements[Math.floor(Math.random() * elements.length)]["givenName"];
18+
dRepId = json["elements"][0]["view"];
19+
await route.fulfill({
20+
status: 200,
21+
contentType: "application/json",
22+
body: JSON.stringify(json),
23+
});
24+
}
25+
);
26+
27+
const responsePromise = page.waitForResponse(
28+
"**/drep/list?page=0&pageSize=10&sort=Random&**"
29+
);
30+
31+
dRepDirectoryPage = new DRepDirectoryPage(page);
32+
await dRepDirectoryPage.goto();
33+
await dRepDirectoryPage.filterBtn.click();
34+
await page.getByTestId("Active-checkbox").click();
35+
await responsePromise;
36+
37+
await dRepDirectoryPage.searchInput.click();
38+
return { dRepGivenName, dRepId, dRepDirectoryPage };
39+
}

tests/govtool-frontend/playwright/lib/pages/dRepDirectoryPage.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,10 @@ export default class DRepDirectoryPage {
147147
}
148148

149149
async getAllListedDReps() {
150-
await this.page.waitForTimeout(5_000); // load until the dRep card load properly
150+
// wait for the dRep list to render properly
151+
await this.page.waitForTimeout(3_000);
152+
// add assertion to wait until the search input is visible
153+
await expect(this.searchInput).toBeVisible({ timeout: 10_000 });
151154

152155
return await this.page
153156
.getByRole("list")

tests/govtool-frontend/playwright/lib/pages/proposalDiscussionPage.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,7 @@ export default class ProposalDiscussionPage {
2929

3030
async goto() {
3131
await this.page.goto(`${environments.frontendUrl}/proposal_discussion`);
32-
// Temporary fix for blank proposals issue in proposal view during disconnected state
33-
// This code handles the blank proposals error, which is causing failing tests.
34-
// It will be removed once the underlying issue is resolved.
35-
await this.page.getByTestId("logo-button").click();
36-
if (isMobile(this.page)) {
37-
await this.page.getByTestId("open-drawer-button").click();
38-
}
39-
await this.page.getByText("Proposals", { exact: true }).click();
40-
32+
// wait for the proposal cards to load
4133
await this.page.waitForTimeout(2_000);
4234
}
4335

tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ export default class ProposalSubmissionPage {
184184

185185
async getFirstDraft() {
186186
await expect(
187-
this.page.locator('[data-testid^="draft-"][data-testid$="-card"]')
187+
this.page.locator('[data-testid^="draft-"][data-testid$="-card"]').first()
188188
).toBeVisible({ timeout: 10_000 }); // slow rendering
189189

190190
return this.page

tests/govtool-frontend/playwright/tests/1-wallet-connect/walletConnect.spec.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import environments from "@constants/environments";
12
import createWallet from "@fixtures/createWallet";
23
import { test } from "@fixtures/walletExtension";
34
import { setAllureEpic } from "@helpers/allure";
@@ -17,29 +18,34 @@ test("1A. Should connect wallet and choose stake-key to use", async ({
1718
const shellyWallet = await ShelleyWallet.generate();
1819
const extraPubStakeKey = convertBufferToHex(shellyWallet.stakeKey.public);
1920
const extraRewardAddress = convertBufferToHex(
20-
shellyWallet.rewardAddressRawBytes(0)
21+
shellyWallet.rewardAddressRawBytes(environments.networkId)
2122
);
2223

2324
await createWallet(page, {
2425
extraRegisteredPubStakeKeys: [extraPubStakeKey],
2526
extraRewardAddresses: [extraRewardAddress],
27+
networkId: environments.networkId,
2628
});
2729

2830
const loginPage = new LoginPage(page);
2931
await loginPage.login();
3032
});
3133

3234
test("1C. Should disconnect Wallet When connected", async ({ page }) => {
33-
await createWallet(page);
35+
await createWallet(page, {
36+
networkId: environments.networkId,
37+
});
3438

3539
const loginPage = new LoginPage(page);
3640
await loginPage.login();
3741

3842
await loginPage.logout();
3943
});
4044

41-
test("1D. Should reject wallet connection in mainnet", async ({ page }) => {
42-
const wrongNetworkId = 1; // mainnet network
45+
test("1D. Should reject wallet connection if on different network", async ({
46+
page,
47+
}) => {
48+
const wrongNetworkId = environments.networkId == 0 ? 1 : 0;
4349
await createWallet(page, {
4450
networkId: wrongNetworkId,
4551
});

0 commit comments

Comments
 (0)