@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
118 lines • 6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const _1 = require(".");
const cryptoassets_1 = require("@ledgerhq/cryptoassets");
const currencies_1 = require("../../currencies");
const account_1 = require("../../mock/account");
jest.mock("@ledgerhq/logs", () => ({
log: jest.fn(),
}));
(0, currencies_1.setSupportedCurrencies)(["bitcoin", "ethereum"]);
describe("syncSessionManager", () => {
afterEach(() => {
jest.clearAllMocks();
jest.useRealTimers();
});
test("tracks SyncSuccessAllAccounts with correct aggregates when all accounts complete", () => {
const trackAnalytics = jest.fn();
const session = (0, _1.createSyncSessionManager)(trackAnalytics);
const BTC = (0, cryptoassets_1.getCryptoCurrencyById)("bitcoin");
const ETH = (0, cryptoassets_1.getCryptoCurrencyById)("ethereum");
const a1 = (0, account_1.genAccount)("a1", { currency: BTC, operationsSize: 3 });
const a2 = (0, account_1.genAccount)("a2", { currency: BTC, operationsSize: 5 });
const a3 = (0, account_1.genAccount)("a3", { currency: ETH, operationsSize: 7 });
const accounts = [a1, a2, a3];
const nowSpy = jest
.spyOn(Date, "now")
// start time
.mockReturnValueOnce(1_000)
// end time (when last account completes)
.mockReturnValueOnce(5_000);
session.start(["a1", "a2", "a3"], "initial");
// Completing accounts one by one should only trigger analytics on last one
session.onAccountSyncDone("a1", accounts);
expect(trackAnalytics).not.toHaveBeenCalled();
session.onAccountSyncDone("a2", accounts);
expect(trackAnalytics).not.toHaveBeenCalled();
session.onAccountSyncDone("a3", accounts);
expect(trackAnalytics).toHaveBeenCalledTimes(1);
expect(trackAnalytics).toHaveBeenCalledWith("SyncSuccessAllAccounts", expect.objectContaining({
duration: 4,
accountsCount: accounts.length,
operationsCount: a1.operationsCount + a2.operationsCount + a3.operationsCount,
chains: ["Bitcoin", "Ethereum"],
reason: "initial",
}));
nowSpy.mockRestore();
});
test("ignores subsequent 'initial' sessions after the first completion", () => {
const trackAnalytics = jest.fn();
const session = (0, _1.createSyncSessionManager)(trackAnalytics);
const BTC = (0, cryptoassets_1.getCryptoCurrencyById)("bitcoin");
const ETH = (0, cryptoassets_1.getCryptoCurrencyById)("ethereum");
const a1 = (0, account_1.genAccount)("a1", { currency: BTC });
const a2 = (0, account_1.genAccount)("a2", { currency: ETH });
a1.operationsCount = 2;
a2.operationsCount = 1;
const accounts = [a1, a2];
const nowSpy = jest
.spyOn(Date, "now")
.mockReturnValueOnce(10_000) // first start
.mockReturnValueOnce(14_000); // first completion
// First initial session completes => tracked once
session.start(["a1", "a2"], "initial");
session.onAccountSyncDone("a1", accounts);
session.onAccountSyncDone("a2", accounts);
expect(trackAnalytics).toHaveBeenCalledTimes(1);
expect(trackAnalytics.mock.calls[0][0]).toBe("SyncSuccessAllAccounts");
// Next initial session should be ignored entirely
session.start(["a1"], "initial");
session.onAccountSyncDone("a1", accounts);
expect(trackAnalytics).toHaveBeenCalledTimes(1);
nowSpy.mockRestore();
});
test("does nothing if onAccountSyncDone is called without a started session", () => {
const trackAnalytics = jest.fn();
const session = (0, _1.createSyncSessionManager)(trackAnalytics);
const BTC = (0, cryptoassets_1.getCryptoCurrencyById)("bitcoin");
const acc = (0, account_1.genAccount)("x1", { currency: BTC });
acc.operationsCount = 1;
const accounts = [acc];
session.onAccountSyncDone("x1", accounts);
expect(trackAnalytics).not.toHaveBeenCalled();
});
test("tracks SyncSuccessAllAccounts with correct aggregates when all accounts complete and errors", () => {
const trackAnalytics = jest.fn();
const session = (0, _1.createSyncSessionManager)(trackAnalytics);
const BTC = (0, cryptoassets_1.getCryptoCurrencyById)("bitcoin");
const ETH = (0, cryptoassets_1.getCryptoCurrencyById)("ethereum");
const a1 = (0, account_1.genAccount)("a1", { currency: BTC, operationsSize: 3 });
const a2 = (0, account_1.genAccount)("a2", { currency: BTC, operationsSize: 5 });
const a3 = (0, account_1.genAccount)("a3", { currency: ETH, operationsSize: 7 });
const accounts = [a1, a2, a3];
const nowSpy = jest
.spyOn(Date, "now")
// start time
.mockReturnValueOnce(1_000)
// end time (when last account completes)
.mockReturnValueOnce(5_000);
session.start(["a1", "a2", "a3"], "initial");
// Completing accounts one by one should only trigger analytics on last one
session.onAccountSyncDone("a1", accounts);
expect(trackAnalytics).not.toHaveBeenCalled();
session.onAccountSyncDone("a2", accounts, true);
expect(trackAnalytics).not.toHaveBeenCalled();
session.onAccountSyncDone("a3", accounts, true);
expect(trackAnalytics).toHaveBeenCalledTimes(1);
expect(trackAnalytics).toHaveBeenCalledWith("SyncSuccessAllAccounts", expect.objectContaining({
duration: 4,
accountsCount: accounts.length,
operationsCount: a1.operationsCount + a2.operationsCount + a3.operationsCount,
chains: ["Bitcoin", "Ethereum"],
reason: "initial",
syncWithErrors: 2,
}));
nowSpy.mockRestore();
});
});
//# sourceMappingURL=index.test.js.map