UNPKG

@ledgerhq/live-common

Version:
122 lines (103 loc) 4.43 kB
import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets"; import { genAccount } from "../../mock/account"; import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; import type { Account, TokenAccount } from "@ledgerhq/types-live"; import { getAccountTuplesForCurrency } from "../getAccountTuplesForCurrency"; import { setupMockCryptoAssetsStore } from "@ledgerhq/cryptoassets/cal-client/test-helpers"; // Setup mock store for unit tests setupMockCryptoAssetsStore(); function* accountGenerator(currency: CryptoCurrency): Generator<Account> { let id = 0; while (true) { id += 1; yield genAccount(`mocked-account-${id}`, { currency, operationsSize: 0 }); } } const getAccountCreator = (currencyId: string) => { const generator = accountGenerator(getCryptoCurrencyById(currencyId)); return () => generator.next().value; }; describe("getAccountTuplesForCurrency", () => { const getEthAccount = getAccountCreator("ethereum"); const getBtcAccount = getAccountCreator("bitcoin"); const getPolkadotAccount = getAccountCreator("polkadot"); const getCosmosAccount = getAccountCreator("cosmos"); describe("CryptoCurrency", () => { test("returns all accounts associated to the CryptoCurrency", () => { const ethCurrency = getCryptoCurrencyById("ethereum"); const ethAccounts = [getEthAccount(), getEthAccount()]; const allAccounts: Account[] = [ getCosmosAccount(), ...ethAccounts, getBtcAccount(), getPolkadotAccount(), ]; const results = getAccountTuplesForCurrency(ethCurrency, allAccounts); expect(results).toHaveLength(2); results.forEach((result, index) => { expect(result.account).toEqual(ethAccounts[index]); expect(result.subAccount).toBeNull(); }); }); test("returns an empty array if the CryptoCurrency passed has no associated account", () => { const ethCurrency = getCryptoCurrencyById("ethereum"); const allAccounts: Account[] = [getCosmosAccount(), getBtcAccount(), getPolkadotAccount()]; const results = getAccountTuplesForCurrency(ethCurrency, allAccounts); expect(results).toHaveLength(0); }); }); describe("TokenCurrency", () => { const aaveToken = { type: "TokenCurrency" as const, id: "ethereum/erc20/aave", name: "Aave Token", ticker: "AAVE", units: [{ name: "Aave Token", code: "AAVE", magnitude: 18 }], contractAddress: "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", parentCurrency: getCryptoCurrencyById("ethereum"), tokenType: "erc20" as const, }; test("returns correct parent accounts including a new subAccount when a TokenCurrency is provided", () => { const ethAccounts = [ { ...getEthAccount(), subAccounts: [] }, { ...getEthAccount(), subAccounts: [] }, ]; const allAccounts: Account[] = [ getCosmosAccount(), ...ethAccounts, getBtcAccount(), getPolkadotAccount(), ]; const results = getAccountTuplesForCurrency(aaveToken, allAccounts); expect(results).toHaveLength(ethAccounts.length); results.forEach((result, index) => { expect(result.account).toEqual(ethAccounts[index]); expect((result.subAccount as TokenAccount & { token: TokenCurrency }).token).toEqual( aaveToken, ); }); }); test("returns correct parent accounts including already existing subAccounts when a TokenCurrency is provided", () => { const ethAccounts = [{ ...getEthAccount(), subAccounts: [aaveToken] }]; const allAccounts: Account[] = [ getCosmosAccount(), ...ethAccounts, getBtcAccount(), getPolkadotAccount(), ]; const results = getAccountTuplesForCurrency(aaveToken, allAccounts); expect(results).toHaveLength(ethAccounts.length); results.forEach((result, index) => { expect(result.account).toEqual(ethAccounts[index]); expect((result.subAccount as TokenAccount & { token: TokenCurrency }).token).toEqual( aaveToken, ); }); }); test("returns an empty array when a TokenCurrency is provided but the accounts list is empty", () => { const allAccounts: Account[] = []; const results = getAccountTuplesForCurrency(aaveToken, allAccounts); expect(results).toHaveLength(0); }); }); });