Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[QAA-383] Swap tests - Entry points #8737

Merged
merged 2 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions apps/ledger-live-desktop/tests/page/asset.page.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
import { step } from "tests/misc/reporters/step";
import { AppPage } from "tests/page/abstractClasses";

export class AssetPage extends AppPage {
private stakeButton = this.page.getByTestId("asset-page-stake-button");
private buyButton = this.page.getByTestId("asset-page-buy-button");
private swapButton = this.page.getByTestId("asset-page-swap-button");

@step("Start stake flow")
async startStakeFlow() {
await this.stakeButton.click();
await this.page.getByText("Choose Account").waitFor({ state: "visible" });
}

@step("Start buy flow")
async startBuyFlow() {
await this.buyButton.click();
}

@step("Start swap flow")
async startSwapFlow() {
VicAlbr marked this conversation as resolved.
Show resolved Hide resolved
await this.swapButton.click();
}
}
2 changes: 2 additions & 0 deletions apps/ledger-live-desktop/tests/page/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { PasswordlockModal } from "./modal/passwordlock.modal";
import { LockscreenPage } from "tests/page/lockscreen.page";
import { NFTDrawer } from "./drawer/nft.drawer";
import { NftGallery } from "./nftGallery.page";
import { AssetPage } from "./asset.page";

export class Application extends PageHolder {
public account = new AccountPage(this.page);
Expand All @@ -47,4 +48,5 @@ export class Application extends PageHolder {
public LockscreenPage = new LockscreenPage(this.page);
public nftDrawer = new NFTDrawer(this.page);
public nftGallery = new NftGallery(this.page);
public assetPage = new AssetPage(this.page);
}
13 changes: 12 additions & 1 deletion apps/ledger-live-desktop/tests/page/market.page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export class MarketPage extends AppPage {
private buyButton = (ticker: string) => this.page.getByTestId(`market-${ticker}-buy-button`);
readonly swapButton = (ticker: string) => this.page.getByTestId(`market-${ticker}-swap-button`);
private stakeButton = (ticker: string) => this.page.getByTestId(`market-${ticker}-stake-button`);
private swapButtonOnAsset = this.page.getByTestId("market-coin-swap-button");

@step("Search for $0")
async search(query: string) {
Expand Down Expand Up @@ -41,7 +42,7 @@ export class MarketPage extends AppPage {

@step("Open coin page for $0")
async openCoinPage(ticker: string) {
await this.coinRow(ticker).click();
await this.coinRow(ticker.toLowerCase()).click();
await this.coinPageContainer.waitFor({ state: "attached" });
await this.loadingPlaceholder.first().waitFor({ state: "detached" });
}
Expand Down Expand Up @@ -69,6 +70,16 @@ export class MarketPage extends AppPage {
await this.swapButton("btc").waitFor({ state: "attached" }); // swap buttons are displayed few seconds after
}

@step("Click on swap button for $0")
async startSwapForSelectedTicker(ticker: string) {
await this.swapButton(ticker.toLowerCase()).click();
}

@step("Click on swap button on asset")
async clickOnSwapButtonOnAsset() {
await this.swapButtonOnAsset.click();
}

@step("Wait for search bar to be empty")
async waitForSearchBarToBeEmpty() {
await this.page.waitForFunction(async () => {
Expand Down
10 changes: 10 additions & 0 deletions apps/ledger-live-desktop/tests/page/portfolio.page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ export class PortfolioPage extends AppPage {
await expect(this.swapEntryButton).toBeVisible();
}

@step("Click on swap button")
async clickSwapButton() {
await this.swapEntryButton.click();
}

@step("Check 'Stake' button visibility")
async checkStakeButtonVisibility() {
await expect(this.stakeEntryButton).toBeVisible();
Expand Down Expand Up @@ -74,6 +79,11 @@ export class PortfolioPage extends AppPage {
await this.buySellEntryButton.click();
}

@step("Click on asset row $0")
async clickOnSelectedAssetRow(asset: string) {
await this.assetRow(asset).click();
}

@step("Click stake button")
async startStakeFlow() {
await this.stakeEntryButton.click();
Expand Down
6 changes: 6 additions & 0 deletions apps/ledger-live-desktop/tests/page/swap.page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,12 @@ export class SwapPage extends AppPage {
await this.chooseAssetDrawer.chooseFromAsset(accountToSwapFrom.currency.name);
}

@step("Expect asset or account selected $0 to be displayed")
async expectSelectedAssetDisplayed(asset: string, electronApp: ElectronApplication) {
VicAlbr marked this conversation as resolved.
Show resolved Hide resolved
const [, webview] = electronApp.windows();
await expect(webview.getByTestId(this.fromAccountCoinSelector)).toContainText(asset);
}

@step("Fill in amount: $1")
async fillInOriginCurrencyAmount(electronApp: ElectronApplication, amount: string) {
const [, webview] = electronApp.windows();
Expand Down
11 changes: 9 additions & 2 deletions apps/ledger-live-desktop/tests/specs/speculos/delegate.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { test } from "../../fixtures/common";
import { Account } from "@ledgerhq/live-common/e2e/enum/Account";
import { Delegate } from "../../models/Delegate";
import { addTmsLink } from "tests/utils/allureUtils";
import { addTmsLink, addBugLink } from "tests/utils/allureUtils";
import { getDescription } from "../../utils/customJsonReporter";
import { CLI } from "tests/utils/cliUtils";
import { Currency } from "@ledgerhq/live-common/e2e/enum/Currency";
Expand All @@ -10,6 +10,7 @@ const e2eDelegationAccounts = [
{
delegate: new Delegate(Account.ATOM_1, "0.001", "Ledger"),
xrayTicket: "B2CQA-2740, B2CQA-2770",
bugLing: "LIVE-14501",
},
{
delegate: new Delegate(Account.SOL_1, "0.001", "Ledger by Figment"),
Expand Down Expand Up @@ -69,10 +70,16 @@ test.describe("Delegate flows", () => {
test(
`[${account.delegate.account.currency.name}] Delegate`,
{
annotation: { type: "TMS", description: account.xrayTicket },
annotation: [
{ type: "TMS", description: account.xrayTicket },
{ type: "BUG", description: account.bugLing },
],
},
async ({ app }) => {
await addTmsLink(getDescription(test.info().annotations, "TMS").split(", "));
if (account.bugLing) {
await addBugLink(getDescription(test.info().annotations, "BUG").split(", "));
}

await app.layout.goToAccounts();
await app.accounts.navigateToAccountByName(account.delegate.account.accountName);
Expand Down
160 changes: 157 additions & 3 deletions apps/ledger-live-desktop/tests/specs/speculos/swap.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ const swaps = [
Provider.CHANGELLY,
Rate.FLOAT,
),
xrayTicket: "B2CQA-2828",
xrayTicket: "B2CQA-2775",
},
{
swap: new Swap(
Expand All @@ -132,7 +132,7 @@ const swaps = [
Provider.CHANGELLY,
Rate.FLOAT,
),
xrayTicket: "B2CQA-2827",
xrayTicket: "B2CQA-2776",
},
{
swap: new Swap(
Expand All @@ -143,7 +143,7 @@ const swaps = [
Provider.CHANGELLY,
Rate.FLOAT,
),
xrayTicket: "B2CQA-2829",
xrayTicket: "B2CQA-2777",
},
{
swap: new Swap(
Expand Down Expand Up @@ -421,6 +421,160 @@ for (const { swap, xrayTicket } of tooLowAmountForQuoteSwaps) {
});
}

const swapEntryPoint = {
swap: new Swap(
Account.BTC_NATIVE_SEGWIT_1,
Account.ETH_1,
"0.0006",
Fee.MEDIUM,
Provider.CHANGELLY,
Rate.FLOAT,
),
};

test.describe("Swap flow from different entry point", () => {
test.beforeAll(async () => {
process.env.SWAP_DISABLE_APPS_INSTALL = "true";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether we need all these envs if in your tests you don't do actual swap flow

Copy link
Contributor Author

@VicAlbr VicAlbr Dec 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think SWAP_DISABLE_APPS_INSTALL and SWAP_API_BASE are mandatory to target the correct version of the live app.
Do you confirm @bharamboure-ledger ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep, I think you can remove the broadcasting var

Copy link
Contributor

@bharamboure-ledger bharamboure-ledger Dec 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SWAP_DISABLE_APPS_INSTALL is actually to prevent apps version check and rely on those we considered app candidates (prod versions) for speculos
SWAP_API_BASE is to target correct firebase env with proper flags
edit: to me they're both required

process.env.SWAP_API_BASE = "https://swap-stg.ledger-test.com/v5";
});

test.afterAll(async () => {
delete process.env.SWAP_DISABLE_APPS_INSTALL;
VicAlbr marked this conversation as resolved.
Show resolved Hide resolved
delete process.env.SWAP_API_BASE;
});

test.use({
userdata: "speculos-tests-app",
speculosApp: app,
});

test(
"Entry Point - Portfolio page",
{
annotation: {
type: "TMS",
description: "B2CQA-2985",
},
},
async ({ app, electronApp }) => {
await addTmsLink(getDescription(test.info().annotations, "TMS").split(", "));
await app.layout.goToPortfolio();
await app.portfolio.clickSwapButton();
await app.swap.waitForPageNetworkIdleState();
await app.swap.expectSelectedAssetDisplayed("BTC", electronApp);
},
);

test(
"Entry Point - Asset Allocation",
{
annotation: {
type: "TMS",
description: "B2CQA-2986",
},
},
async ({ app, electronApp }) => {
await addTmsLink(getDescription(test.info().annotations, "TMS").split(", "));
await app.layout.goToPortfolio();
await app.portfolio.clickOnSelectedAssetRow(swapEntryPoint.swap.accountToDebit.currency.name);
await app.assetPage.startSwapFlow();
await app.swap.waitForPageNetworkIdleState();
await app.swap.expectSelectedAssetDisplayed(
swapEntryPoint.swap.accountToDebit.currency.name,
electronApp,
);
},
);

test(
"Entry Point - Market page - Click on swap for any coin",
{
annotation: {
type: "TMS",
description: "B2CQA-2987",
},
},
async ({ app, electronApp }) => {
await addTmsLink(getDescription(test.info().annotations, "TMS").split(", "));
await app.layout.goToMarket();
await app.market.startSwapForSelectedTicker(
swapEntryPoint.swap.accountToDebit.currency.ticker,
);
await app.swap.waitForPageNetworkIdleState();
await app.swap.expectSelectedAssetDisplayed(
swapEntryPoint.swap.accountToDebit.currency.name,
electronApp,
);
await app.swap.expectSelectedAssetDisplayed(
swapEntryPoint.swap.accountToDebit.accountName,
electronApp,
);
},
);

test(
"Entry Point - Market page - More than one account for an asset",
{
annotation: {
type: "TMS",
description: "B2CQA-2988",
},
},
async ({ app, electronApp }) => {
await addTmsLink(getDescription(test.info().annotations, "TMS").split(", "));
await app.layout.goToMarket();
await app.market.openCoinPage(swapEntryPoint.swap.accountToDebit.currency.ticker);
await app.market.clickOnSwapButtonOnAsset();
await app.swap.waitForPageNetworkIdleState();
await app.swap.expectSelectedAssetDisplayed(
swapEntryPoint.swap.accountToDebit.currency.name,
electronApp,
);
},
);

test(
"Entry Point - Account page",
{
annotation: {
type: "TMS",
description: "B2CQA-2989",
},
},
async ({ app, electronApp }) => {
await addTmsLink(getDescription(test.info().annotations, "TMS").split(", "));
await app.layout.goToAccounts();
await app.accounts.navigateToAccountByName(swapEntryPoint.swap.accountToDebit.accountName);
await app.account.navigateToSwap();
await app.swap.waitForPageNetworkIdleState();
await app.swap.expectSelectedAssetDisplayed(
swapEntryPoint.swap.accountToDebit.currency.name,
electronApp,
);
await app.swap.expectSelectedAssetDisplayed(
swapEntryPoint.swap.accountToDebit.accountName,
electronApp,
);
},
);

test(
"Entry Point - left menu",
{
annotation: {
type: "TMS",
description: "B2CQA-2990, B2CQA-523",
},
},
async ({ app, electronApp }) => {
await addTmsLink(getDescription(test.info().annotations, "TMS").split(", "));
await app.layout.goToSwap();
await app.swap.waitForPageNetworkIdleState();
await app.swap.expectSelectedAssetDisplayed("BTC", electronApp);
},
);
});

async function performSwapUntilQuoteSelectionStep(
app: Application,
electronApp: ElectronApplication,
Expand Down
Loading