@ledgerhq/live-countervalues 0.8.0-nightly.7 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +29 -60
  3. package/lib/helpers.d.ts.map +1 -1
  4. package/lib/helpers.js +3 -0
  5. package/lib/helpers.js.map +1 -1
  6. package/lib/logic.integ.test.d.ts +2 -0
  7. package/lib/logic.integ.test.d.ts.map +1 -0
  8. package/lib/logic.integ.test.js +274 -0
  9. package/lib/logic.integ.test.js.map +1 -0
  10. package/lib/logic.test.d.ts +2 -0
  11. package/lib/logic.test.d.ts.map +1 -0
  12. package/lib/logic.test.js +29 -0
  13. package/lib/logic.test.js.map +1 -0
  14. package/lib/mock.test.d.ts +2 -0
  15. package/lib/mock.test.d.ts.map +1 -0
  16. package/lib/mock.test.js +253 -0
  17. package/lib/mock.test.js.map +1 -0
  18. package/lib/portfolio.test.d.ts +2 -0
  19. package/lib/portfolio.test.d.ts.map +1 -0
  20. package/lib/portfolio.test.js +280 -0
  21. package/lib/portfolio.test.js.map +1 -0
  22. package/lib-es/helpers.d.ts.map +1 -1
  23. package/lib-es/helpers.js +3 -0
  24. package/lib-es/helpers.js.map +1 -1
  25. package/lib-es/logic.integ.test.d.ts +2 -0
  26. package/lib-es/logic.integ.test.d.ts.map +1 -0
  27. package/lib-es/logic.integ.test.js +269 -0
  28. package/lib-es/logic.integ.test.js.map +1 -0
  29. package/lib-es/logic.test.d.ts +2 -0
  30. package/lib-es/logic.test.d.ts.map +1 -0
  31. package/lib-es/logic.test.js +27 -0
  32. package/lib-es/logic.test.js.map +1 -0
  33. package/lib-es/mock.test.d.ts +2 -0
  34. package/lib-es/mock.test.d.ts.map +1 -0
  35. package/lib-es/mock.test.js +225 -0
  36. package/lib-es/mock.test.js.map +1 -0
  37. package/lib-es/portfolio.test.d.ts +2 -0
  38. package/lib-es/portfolio.test.d.ts.map +1 -0
  39. package/lib-es/portfolio.test.js +278 -0
  40. package/lib-es/portfolio.test.js.map +1 -0
  41. package/package.json +7 -7
  42. package/src/helpers.ts +2 -0
@@ -0,0 +1,269 @@
1
+ import { initialState, loadCountervalues, calculate, exportCountervalues, importCountervalues, } from "./logic";
2
+ import { findCurrencyByTicker } from "./findCurrencyByTicker";
3
+ import { getFiatCurrencyByTicker, getCryptoCurrencyById, findTokenById, } from "@ledgerhq/cryptoassets";
4
+ import { getBTCValues } from "./mock";
5
+ import Prando from "prando";
6
+ import api from "./api";
7
+ import { setEnv } from "@ledgerhq/live-env";
8
+ import { pairId } from "./helpers";
9
+ const value = "ll-ci/0.0.0";
10
+ setEnv("LEDGER_CLIENT_VERSION", value);
11
+ const ethereum = getCryptoCurrencyById("ethereum");
12
+ const bitcoin = getCryptoCurrencyById("bitcoin");
13
+ const usd = getFiatCurrencyByTicker("USD");
14
+ const now = Date.now();
15
+ const DAY = 24 * 60 * 60 * 1000;
16
+ jest.setTimeout(60000);
17
+ describe("API sanity", () => {
18
+ test("recent days have rate for BTC USD", async () => {
19
+ const state = await loadCountervalues(initialState, {
20
+ trackingPairs: [
21
+ {
22
+ from: bitcoin,
23
+ to: usd,
24
+ startDate: new Date(now - 200 * DAY),
25
+ },
26
+ ],
27
+ autofillGaps: false,
28
+ refreshRate: 60000,
29
+ marketCapBatchingAfterRank: 20,
30
+ disableAutoRecoverErrors: true,
31
+ });
32
+ for (let i = 0; i < 7; i++) {
33
+ const value = calculate(state, {
34
+ date: new Date(now - i * DAY),
35
+ disableRounding: true,
36
+ from: bitcoin,
37
+ to: usd,
38
+ value: 1000000,
39
+ });
40
+ expect(value).toBeDefined();
41
+ }
42
+ });
43
+ test("recent days have different rates for BTC USD", async () => {
44
+ const state = await loadCountervalues(initialState, {
45
+ trackingPairs: [
46
+ {
47
+ from: bitcoin,
48
+ to: usd,
49
+ startDate: new Date(now - 200 * DAY),
50
+ },
51
+ ],
52
+ autofillGaps: true,
53
+ refreshRate: 60000,
54
+ marketCapBatchingAfterRank: 20,
55
+ disableAutoRecoverErrors: true,
56
+ });
57
+ const currentValue = calculate(state, {
58
+ disableRounding: true,
59
+ from: bitcoin,
60
+ to: usd,
61
+ value: 1000000,
62
+ });
63
+ for (let i = 1; i < 7; i++) {
64
+ const value = calculate(state, {
65
+ date: new Date(now - i * DAY),
66
+ disableRounding: true,
67
+ from: bitcoin,
68
+ to: usd,
69
+ value: 1000000,
70
+ });
71
+ expect(value).not.toEqual(currentValue);
72
+ }
73
+ });
74
+ });
75
+ describe("extreme cases", () => {
76
+ const universe = Object.keys(getBTCValues())
77
+ .filter(t => t !== "USD")
78
+ .map(findCurrencyByTicker)
79
+ .filter(Boolean);
80
+ universe.sort((a, b) => a.ticker.localeCompare(b.ticker));
81
+ const prando = new Prando("orderingrng");
82
+ const sampleCount = Math.min(120, universe.length);
83
+ const i = prando.nextInt(0, universe.length - sampleCount);
84
+ const currencies = universe.slice(i, i + sampleCount);
85
+ test("all tickers against USD", async () => {
86
+ const state = await loadCountervalues(initialState, {
87
+ trackingPairs: currencies.map(from => ({
88
+ from,
89
+ to: usd,
90
+ startDate: new Date(),
91
+ })),
92
+ autofillGaps: true,
93
+ refreshRate: 60000,
94
+ marketCapBatchingAfterRank: 20,
95
+ disableAutoRecoverErrors: true,
96
+ });
97
+ const currenciesWithCVs = currencies
98
+ .map(from => calculate(state, {
99
+ date: new Date(),
100
+ from,
101
+ to: usd,
102
+ value: 1000000,
103
+ }))
104
+ .filter(v => v && v > 0);
105
+ expect(currenciesWithCVs.length).toBeGreaterThan(0);
106
+ });
107
+ test("all tickers against BTC", async () => {
108
+ const state = await loadCountervalues(initialState, {
109
+ trackingPairs: currencies.map(from => ({
110
+ from,
111
+ to: bitcoin,
112
+ startDate: new Date(),
113
+ })),
114
+ autofillGaps: true,
115
+ refreshRate: 60000,
116
+ marketCapBatchingAfterRank: 20,
117
+ disableAutoRecoverErrors: true,
118
+ });
119
+ const currenciesWithCVs = currencies
120
+ .map(from => calculate(state, {
121
+ date: new Date(),
122
+ from,
123
+ to: bitcoin,
124
+ value: 1000000,
125
+ }))
126
+ .filter(v => v && v > 0);
127
+ expect(currenciesWithCVs.length).toBeGreaterThan(0);
128
+ });
129
+ });
130
+ describe("WETH rules", () => {
131
+ // this test is created to confirm the recent removal of weth/eth specific management is still functional in v3 context
132
+ test("ethereum WETH have countervalues", async () => {
133
+ const weth = findTokenById("ethereum/erc20/weth");
134
+ if (!weth)
135
+ throw new Error("WETH token not found");
136
+ const state = await loadCountervalues(initialState, {
137
+ trackingPairs: [
138
+ {
139
+ from: weth,
140
+ to: usd,
141
+ startDate: new Date(now - 10 * DAY),
142
+ },
143
+ ],
144
+ autofillGaps: true,
145
+ refreshRate: 60000,
146
+ marketCapBatchingAfterRank: 20,
147
+ disableAutoRecoverErrors: true,
148
+ });
149
+ const value = calculate(state, {
150
+ disableRounding: true,
151
+ from: weth,
152
+ to: usd,
153
+ value: 1000000,
154
+ });
155
+ expect(value).toBeGreaterThan(0);
156
+ });
157
+ });
158
+ describe("HTTP 422 management of unsupported rates", () => {
159
+ // context of this test: https://ledgerhq.atlassian.net/browse/LIVE-11339
160
+ test("a cache that was accumulated needs to be cleared when a coin becomes disabled", async () => {
161
+ // for this test, we start with weth
162
+ const weth = findTokenById("ethereum/erc20/weth");
163
+ if (!weth)
164
+ throw new Error("WETH token not found");
165
+ let state = await loadCountervalues(initialState, {
166
+ trackingPairs: [
167
+ {
168
+ from: weth,
169
+ to: usd,
170
+ startDate: new Date(now - 10 * DAY),
171
+ },
172
+ ],
173
+ autofillGaps: true,
174
+ refreshRate: 60000,
175
+ marketCapBatchingAfterRank: 20,
176
+ });
177
+ let value = calculate(state, {
178
+ disableRounding: true,
179
+ from: weth,
180
+ to: usd,
181
+ value: 1000000,
182
+ });
183
+ expect(value).toBeGreaterThan(0);
184
+ // we will now alter the state to replace the weth token to sether that we know has been disabled by the api
185
+ const sether = findTokenById("ethereum/erc20/sether");
186
+ if (!sether)
187
+ throw new Error("sETHER token not found");
188
+ const prevKey = pairId({ from: weth, to: usd });
189
+ const nextKey = pairId({ from: sether, to: usd });
190
+ function mutateVisit(o) {
191
+ // we traverse all Object and replace keys
192
+ if (typeof o === "object" && o !== null) {
193
+ for (const k in o) {
194
+ if (k === prevKey) {
195
+ const v = o[prevKey];
196
+ delete o[prevKey];
197
+ o[nextKey] = v;
198
+ }
199
+ else {
200
+ mutateVisit(o[k]);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ mutateVisit(state);
206
+ // at the moment, we still can calculate the value because we didn't refreshed yet
207
+ value = calculate(state, {
208
+ disableRounding: true,
209
+ from: sether,
210
+ to: usd,
211
+ value: 1000000,
212
+ });
213
+ expect(value).toBeGreaterThan(0);
214
+ state = await loadCountervalues(state, {
215
+ trackingPairs: [
216
+ {
217
+ from: sether,
218
+ to: usd,
219
+ startDate: new Date(now - 100 * DAY),
220
+ },
221
+ ],
222
+ autofillGaps: true,
223
+ refreshRate: 60000,
224
+ marketCapBatchingAfterRank: 20,
225
+ });
226
+ value = calculate(state, {
227
+ disableRounding: true,
228
+ from: sether,
229
+ to: usd,
230
+ value: 1000000,
231
+ });
232
+ expect(value).toBe(undefined);
233
+ });
234
+ });
235
+ test("fetchIdsSortedByMarketcap", async () => {
236
+ const ids = await api.fetchIdsSortedByMarketcap();
237
+ expect(ids).toContain("bitcoin");
238
+ });
239
+ test("export and import it back", async () => {
240
+ const settings = {
241
+ trackingPairs: [
242
+ {
243
+ from: bitcoin,
244
+ to: usd,
245
+ startDate: new Date(now - 10 * DAY),
246
+ },
247
+ {
248
+ from: ethereum,
249
+ to: usd,
250
+ startDate: new Date(now - 100 * DAY),
251
+ },
252
+ ],
253
+ autofillGaps: true,
254
+ refreshRate: 60000,
255
+ marketCapBatchingAfterRank: 20,
256
+ disableAutoRecoverErrors: true,
257
+ };
258
+ const state = await loadCountervalues(initialState, settings);
259
+ const exported = exportCountervalues(state);
260
+ const imported = importCountervalues(exported, settings);
261
+ expect(imported).toEqual(state);
262
+ });
263
+ describe("API specific unit tests", () => {
264
+ test("fetchLatest with empty pairs", async () => {
265
+ const rates = await api.fetchLatest([]);
266
+ expect(rates).toEqual([]);
267
+ });
268
+ });
269
+ //# sourceMappingURL=logic.integ.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.integ.test.js","sourceRoot":"","sources":["../src/logic.integ.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.test.d.ts","sourceRoot":"","sources":["../src/logic.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { genAccount } from "@ledgerhq/coin-framework/mocks/account";
2
+ import { getCryptoCurrencyById, getFiatCurrencyByTicker } from "@ledgerhq/cryptoassets";
3
+ import { inferTrackingPairForAccounts } from "./logic";
4
+ describe("inferTrackingPairForAccounts", () => {
5
+ const accounts = Array(20)
6
+ .fill(null)
7
+ .map((_, i) => genAccount("test" + i));
8
+ const usd = getFiatCurrencyByTicker("USD");
9
+ test("trackingPairs have a deterministic order regardless of accounts order", () => {
10
+ const trackingPairs = inferTrackingPairForAccounts(accounts, usd);
11
+ const accounts2 = accounts.slice(10).concat(accounts.slice(0, 10));
12
+ const trackingPairs2 = inferTrackingPairForAccounts(accounts2, usd);
13
+ expect(trackingPairs).toEqual(trackingPairs2);
14
+ });
15
+ test("trackingPairs with same from and to are filtered out", () => {
16
+ const first = genAccount("test1", { currency: getCryptoCurrencyById("bitcoin") });
17
+ const trackingPairs = inferTrackingPairForAccounts([first], first.currency);
18
+ expect(trackingPairs).toEqual([]);
19
+ });
20
+ test("trackingPairs with 2 accounts of same coin yield one tracking pair", () => {
21
+ const first = genAccount("test1", { currency: getCryptoCurrencyById("bitcoin") });
22
+ const second = genAccount("test2", { currency: getCryptoCurrencyById("bitcoin") });
23
+ const trackingPairs = inferTrackingPairForAccounts([first, second], usd);
24
+ expect(trackingPairs.length).toBe(1);
25
+ });
26
+ });
27
+ //# sourceMappingURL=logic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.test.js","sourceRoot":"","sources":["../src/logic.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,CAAC,uEAAuE,EAAE,GAAG,EAAE;QACjF,MAAM,aAAa,GAAG,4BAA4B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,cAAc,GAAG,4BAA4B,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpE,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,aAAa,GAAG,4BAA4B,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,aAAa,GAAG,4BAA4B,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "@ledgerhq/coin-framework/test-helpers/staticTime";
2
+ //# sourceMappingURL=mock.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.test.d.ts","sourceRoot":"","sources":["../src/mock.test.ts"],"names":[],"mappings":"AAAA,OAAO,kDAAkD,CAAC"}
@@ -0,0 +1,225 @@
1
+ import "@ledgerhq/coin-framework/test-helpers/staticTime";
2
+ import { initialState, loadCountervalues, calculate } from "./logic";
3
+ import CountervaluesAPI from "./api";
4
+ import { setEnv } from "@ledgerhq/live-env";
5
+ import { getFiatCurrencyByTicker, findTokenById, getCryptoCurrencyById, } from "@ledgerhq/cryptoassets";
6
+ import { formatCounterValueDay, formatCounterValueHour, parseFormattedDate } from "./helpers";
7
+ import api from "./api";
8
+ import * as cryptoAssets from "@ledgerhq/coin-framework/crypto-assets/index";
9
+ setEnv("MOCK", "1");
10
+ setEnv("MOCK_COUNTERVALUES", "1");
11
+ const DAY = 24 * 60 * 60 * 1000;
12
+ test("helpers", () => {
13
+ expect(formatCounterValueDay(new Date())).toBe("2018-03-14");
14
+ expect(formatCounterValueHour(new Date())).toBe("2018-03-14T17");
15
+ expect(formatCounterValueDay(parseFormattedDate("2018-03-14"))).toBe("2018-03-14");
16
+ expect(formatCounterValueHour(parseFormattedDate("2018-03-14T17"))).toBe("2018-03-14T17");
17
+ });
18
+ test("mock load with nothing to track", async () => {
19
+ const state = await loadCountervalues(initialState, {
20
+ trackingPairs: [],
21
+ autofillGaps: true,
22
+ refreshRate: 60000,
23
+ marketCapBatchingAfterRank: 20,
24
+ });
25
+ expect(state).toBeDefined();
26
+ expect(calculate(state, {
27
+ value: 100000000,
28
+ from: getCryptoCurrencyById("bitcoin"),
29
+ to: getFiatCurrencyByTicker("USD"),
30
+ })).toBeUndefined();
31
+ });
32
+ test("mock fetchIdsSortedByMarketcap", async () => {
33
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
34
+ jest.spyOn(cryptoAssets, "getCryptoAssetsStore").mockReturnValue({});
35
+ expect(await CountervaluesAPI.fetchIdsSortedByMarketcap()).toBeDefined();
36
+ });
37
+ test("mock load with btc-usd to track", async () => {
38
+ const state = await loadCountervalues(initialState, {
39
+ trackingPairs: [
40
+ {
41
+ from: getCryptoCurrencyById("bitcoin"),
42
+ to: getFiatCurrencyByTicker("USD"),
43
+ startDate: new Date(Date.now() - 200 * DAY),
44
+ },
45
+ ],
46
+ autofillGaps: false,
47
+ refreshRate: 60000,
48
+ marketCapBatchingAfterRank: 20,
49
+ });
50
+ expect(state).toBeDefined();
51
+ expect(calculate(state, {
52
+ value: 100000000,
53
+ from: getCryptoCurrencyById("bitcoin"),
54
+ to: getFiatCurrencyByTicker("USD"),
55
+ date: new Date(Date.now() - 210 * DAY),
56
+ })).toBeUndefined();
57
+ expect(calculate(state, {
58
+ value: 100000000,
59
+ from: getCryptoCurrencyById("bitcoin"),
60
+ to: getFiatCurrencyByTicker("USD"),
61
+ })).toBe(261944);
62
+ expect(calculate(state, {
63
+ value: 10000000,
64
+ from: getCryptoCurrencyById("bitcoin"),
65
+ to: getFiatCurrencyByTicker("USD"),
66
+ })).toBe(26194);
67
+ expect(calculate(state, {
68
+ value: 10000000,
69
+ to: getCryptoCurrencyById("bitcoin"),
70
+ from: getCryptoCurrencyById("bitcoin"),
71
+ })).toBe(10000000);
72
+ expect(calculate(state, {
73
+ value: 100000000,
74
+ from: getCryptoCurrencyById("bitcoin"),
75
+ to: getFiatCurrencyByTicker("EUR"),
76
+ })).toBeUndefined();
77
+ });
78
+ test("mock load with eth-btc to track", async () => {
79
+ const state = await loadCountervalues(initialState, {
80
+ trackingPairs: [
81
+ {
82
+ from: getCryptoCurrencyById("ethereum"),
83
+ to: getCryptoCurrencyById("bitcoin"),
84
+ startDate: new Date(Date.now() - 200 * DAY),
85
+ },
86
+ ],
87
+ autofillGaps: false,
88
+ refreshRate: 60000,
89
+ marketCapBatchingAfterRank: 20,
90
+ });
91
+ expect(state).toBeDefined();
92
+ expect(calculate(state, {
93
+ value: 10e18,
94
+ from: getCryptoCurrencyById("ethereum"),
95
+ to: getCryptoCurrencyById("bitcoin"),
96
+ })).toBe(6715906);
97
+ });
98
+ test("mock load with btc-eth to track", async () => {
99
+ const state = await loadCountervalues(initialState, {
100
+ trackingPairs: [
101
+ {
102
+ from: getCryptoCurrencyById("bitcoin"),
103
+ to: getCryptoCurrencyById("ethereum"),
104
+ startDate: new Date(Date.now() - 200 * DAY),
105
+ },
106
+ ],
107
+ autofillGaps: false,
108
+ refreshRate: 60000,
109
+ marketCapBatchingAfterRank: 20,
110
+ });
111
+ expect(state).toBeDefined();
112
+ expect(calculate(state, {
113
+ value: 10e8,
114
+ from: getCryptoCurrencyById("bitcoin"),
115
+ to: getCryptoCurrencyById("ethereum"),
116
+ })).toBe(1.4890024626718706e21);
117
+ });
118
+ test("DAI EUR latest price", async () => {
119
+ const dai = findTokenById("ethereum/erc20/dai_stablecoin_v2_0");
120
+ if (!dai)
121
+ throw new Error("DAI token not found");
122
+ const state = await loadCountervalues(initialState, {
123
+ trackingPairs: [
124
+ {
125
+ from: dai,
126
+ to: getFiatCurrencyByTicker("EUR"),
127
+ startDate: new Date(),
128
+ },
129
+ ],
130
+ autofillGaps: false,
131
+ refreshRate: 60000,
132
+ marketCapBatchingAfterRank: 20,
133
+ });
134
+ expect(state).toBeDefined();
135
+ expect(calculate(state, {
136
+ value: 100000000,
137
+ from: dai,
138
+ to: getFiatCurrencyByTicker("EUR"),
139
+ })).toBeUndefined();
140
+ });
141
+ test("calculate(now()) is calculate(null)", async () => {
142
+ const dai = findTokenById("ethereum/erc20/dai_stablecoin_v2_0");
143
+ if (!dai)
144
+ throw new Error("DAI token not found");
145
+ const state = await loadCountervalues(initialState, {
146
+ trackingPairs: [
147
+ {
148
+ from: dai,
149
+ to: getFiatCurrencyByTicker("EUR"),
150
+ startDate: new Date(),
151
+ },
152
+ ],
153
+ autofillGaps: false,
154
+ refreshRate: 60000,
155
+ marketCapBatchingAfterRank: 20,
156
+ });
157
+ expect(state).toBeDefined();
158
+ expect(calculate(state, {
159
+ value: 100000000,
160
+ from: dai,
161
+ to: getFiatCurrencyByTicker("EUR"),
162
+ })).toEqual(calculate(state, {
163
+ value: 100000000,
164
+ from: dai,
165
+ to: getFiatCurrencyByTicker("EUR"),
166
+ date: new Date(),
167
+ }));
168
+ });
169
+ test("missing rate in mock", async () => {
170
+ const state = await loadCountervalues(initialState, {
171
+ trackingPairs: [
172
+ {
173
+ from: getCryptoCurrencyById("bitcoin"),
174
+ to: getFiatCurrencyByTicker("USD"),
175
+ startDate: new Date(Date.now() - 200 * DAY),
176
+ },
177
+ ],
178
+ autofillGaps: false,
179
+ refreshRate: 60000,
180
+ marketCapBatchingAfterRank: 20,
181
+ });
182
+ expect(state).toBeDefined();
183
+ expect(calculate(state, {
184
+ value: 100000000,
185
+ from: getCryptoCurrencyById("bitcoin"),
186
+ to: getFiatCurrencyByTicker("USD"),
187
+ date: new Date("2018-01-07T19:00"),
188
+ })).toBeUndefined();
189
+ });
190
+ test("missing rate in mock is filled by autofillGaps", async () => {
191
+ const state = await loadCountervalues(initialState, {
192
+ trackingPairs: [
193
+ {
194
+ from: getCryptoCurrencyById("bitcoin"),
195
+ to: getFiatCurrencyByTicker("USD"),
196
+ startDate: new Date(Date.now() - 200 * DAY),
197
+ },
198
+ ],
199
+ autofillGaps: true,
200
+ refreshRate: 60000,
201
+ marketCapBatchingAfterRank: 20,
202
+ });
203
+ expect(state).toBeDefined();
204
+ // shifting rates to the right. hole in data looks up in older datapoint
205
+ expect(calculate(state, {
206
+ value: 100000000,
207
+ from: getCryptoCurrencyById("bitcoin"),
208
+ to: getFiatCurrencyByTicker("USD"),
209
+ date: new Date("2018-01-07T19:00"),
210
+ })).toBe(calculate(state, {
211
+ value: 100000000,
212
+ from: getCryptoCurrencyById("bitcoin"),
213
+ to: getFiatCurrencyByTicker("USD"),
214
+ date: new Date("2018-01-06T19:00"),
215
+ }));
216
+ });
217
+ test("fetchIdsSortedByMarketcap", async () => {
218
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
219
+ jest
220
+ .spyOn(cryptoAssets, "getCryptoAssetsStore")
221
+ .mockReturnValue({});
222
+ const ids = await api.fetchIdsSortedByMarketcap();
223
+ expect(ids).toContain("bitcoin");
224
+ });
225
+ //# sourceMappingURL=mock.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.test.js","sourceRoot":"","sources":["../src/mock.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import "@ledgerhq/coin-framework/test-helpers/staticTime";
2
+ //# sourceMappingURL=portfolio.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.test.d.ts","sourceRoot":"","sources":["../src/portfolio.test.ts"],"names":[],"mappings":"AAAA,OAAO,kDAAkD,CAAC"}