UNPKG

@ledgerhq/live-common

Version:
358 lines • 10.9 kB
import { initState } from "./logic"; import { deviceInfo155, mockListAppsResult } from "./mock"; import { sortFilterApps, isAppAssociatedCurrencySupported } from "./filtering"; import { setSupportedCurrencies } from "../currencies/index"; import { WALLET_API_VERSION } from "../wallet-api/constants"; import { setWalletAPIVersion } from "../wallet-api/version"; setWalletAPIVersion(WALLET_API_VERSION); const mockedFeatureFlags = { isFeature: () => false, getFeature: () => null, }; setSupportedCurrencies([ "ethereum", "bitcoin", "dogecoin", "ethereum_classic", "ripple", "litecoin", ]); const apps = "Bitcoin, Ethereum, Litecoin, Dogecoin, HODL, Password Manager, Ethereum Classic, XRP, Stellar "; const scenarios = [ { name: "Catalog - Default sorting, no filters", apps, installed: "", _sortOptions: { type: "default", order: "asc", }, _filterOptions: { installedApps: [], type: [], ...mockedFeatureFlags, }, expectedApps: "Bitcoin, Ethereum, Litecoin, Dogecoin, HODL, Password Manager, Ethereum Classic, XRP, Stellar", }, { name: "Catalog - Marketcap sorting, desc", apps, installed: "", _sortOptions: { type: "marketcap", order: "desc", }, _filterOptions: { installedApps: [], type: [], ...mockedFeatureFlags, }, expectedApps: "Bitcoin, Ethereum, XRP, Litecoin, Stellar, Ethereum Classic, Dogecoin, Password Manager, HODL", }, { name: "Catalog - Marketcap sorting, asc", apps, installed: "", _sortOptions: { type: "marketcap", order: "asc", }, _filterOptions: { installedApps: [], type: [], ...mockedFeatureFlags, }, expectedApps: "Dogecoin, Ethereum Classic, Stellar, Litecoin, XRP, Ethereum, Bitcoin, HODL, Password Manager", }, { name: "Catalog - Name sorting, desc", apps, installed: "", _sortOptions: { type: "name", order: "desc", }, _filterOptions: { installedApps: [], type: [], ...mockedFeatureFlags, }, expectedApps: "XRP, Stellar, Password Manager, Litecoin, HODL, Ethereum Classic, Ethereum, Dogecoin, Bitcoin", }, { name: "Catalog - Name sorting, asc", apps, installed: "", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { installedApps: [], type: [], ...mockedFeatureFlags, }, expectedApps: "Bitcoin, Dogecoin, Ethereum, Ethereum Classic, HODL, Litecoin, Password Manager, Stellar, XRP", }, { name: "Catalog - Only apps supported by Live", apps, installed: "", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { type: ["supported"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "Bitcoin, Dogecoin, Ethereum, Ethereum Classic, Litecoin, XRP", }, { name: "Catalog - Only apps supported by Live, feature flagged currencies", apps, installed: "", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { type: ["supported"], installedApps: [], isFeature() { return true; }, getFeature(key) { if (key === "currencyLitecoin") return { enabled: true }; if (key === "currencyDogecoin") return { enabled: false }; return null; }, }, expectedApps: "Bitcoin, Ethereum, Ethereum Classic, Litecoin, XRP", }, { name: "Catalog - Only apps not supported by Live", apps, installed: "", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { type: ["not_supported"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "HODL, Password Manager, Stellar", }, { name: "Installed - Filtering outdated apps only", apps, installed: "Bitcoin (outdated), Dogecoin (outdated), XRP", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { type: ["updatable"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "Bitcoin, Dogecoin", }, { name: "Installed - Only not supported by live", apps, installed: "Bitcoin, Dogecoin, XRP, Stellar, HODL", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { type: ["installed", "not_supported"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "HODL, Stellar", }, { name: "Installed - Marketcap sorting asc, no filters", apps, installed: "Bitcoin, Stellar, Ethereum", _sortOptions: { type: "marketcap", order: "asc", }, _filterOptions: { type: ["installed"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "Stellar, Ethereum, Bitcoin", }, { name: "Installed - Search query, no matches", apps, installed: "Bitcoin, Stellar, Ethereum", _sortOptions: {}, _filterOptions: { query: "IMNOTHERE", type: ["installed"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "", }, { name: "Installed - With install queue param no sort", apps, installed: "Bitcoin, Stellar, Ethereum", _sortOptions: {}, _filterOptions: { type: ["installed"], installQueue: ["XRP", "Dogecoin"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "XRP, Stellar, Ethereum, Dogecoin, Bitcoin", }, { name: "Not Installed - Search query 'ethereum'", apps, installed: "Bitcoin", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { query: "ethereum", type: ["not_installed"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "Ethereum, Ethereum Classic", }, { name: "Compatible compound filters - Installed and also supported by live", apps, installed: "Bitcoin, Ethereum, HODL", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { query: "", type: ["installed", "supported"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "Bitcoin, Ethereum", }, { name: "Incompatible compound filters - Installed but also not installed", apps, installed: "Bitcoin, Ethereum", _sortOptions: { type: "name", order: "asc", }, _filterOptions: { query: "", type: ["not_installed", "installed"], installedApps: [], ...mockedFeatureFlags, }, expectedApps: "", }, ]; scenarios.forEach(scenario => { test("Scenario: " + scenario.name, async () => { const { apps, installed: installedApps } = initState(mockListAppsResult(scenario.apps, scenario.installed, deviceInfo155)); const sortedFilteredApps = sortFilterApps(apps, { ...scenario._filterOptions, installedApps }, scenario._sortOptions); expect(sortedFilteredApps.map(app => app.name)).toEqual(scenario.expectedApps ? scenario.expectedApps.split(", ") : []); }); }); const appSupportedScenarios = [ { name: "App is a plugin", expected: true, params: { app: { type: "plugin" }, ...mockedFeatureFlags }, }, { name: "App is swap", expected: true, params: { app: { type: "swap" }, ...mockedFeatureFlags }, }, { name: "App has no currencyId", expected: false, params: { app: {}, ...mockedFeatureFlags }, }, { name: "App's associated currency is not supported", expected: false, params: { app: { currencyId: "stellar" }, ...mockedFeatureFlags, }, }, { name: "App's associated currency has no feature flag", expected: true, params: { app: { currencyId: "bitcoin" }, ...mockedFeatureFlags, isFeature: () => false, }, }, { name: "App's associated currency has a feature flag that disables it", expected: false, params: { app: { currencyId: "bitcoin" }, isFeature: () => true, getFeature: (key) => { if (key === "currencyBitcoin") return { enabled: false }; throw new Error("wrong featureId key generated: " + key); }, }, }, { name: "App's associated currency has a feature flag that enables it", expected: true, params: { app: { currencyId: "bitcoin" }, isFeature: () => true, getFeature: (key) => { if (key === "currencyBitcoin") return { enabled: true }; throw new Error("wrong featureId key generate: " + key); }, }, }, { name: "App's associated currency has a feature flag that is null (will never happen but typewise it can happen)", expected: true, params: { app: { currencyId: "bitcoin" }, isFeature: () => true, getFeature: (key) => { if (key === "currencyBitcoin") return null; throw new Error("wrong featureId key generate: " + key); }, }, }, ]; describe("isAppAssociatedCurrencySupported", () => { appSupportedScenarios.forEach(scenario => { test(`Scenario: ${scenario.name} (expect ${scenario.expected})`, () => { expect(isAppAssociatedCurrencySupported(scenario.params)).toBe(scenario.expected); }); }); }); //# sourceMappingURL=filtering.test.js.map