From 6cc462a4150937b2b59490cc723cd6e78b9ee5d6 Mon Sep 17 00:00:00 2001 From: matias martinez Date: Tue, 28 Nov 2023 16:53:17 -0300 Subject: [PATCH] remove duplicated tests --- blockchain-watcher/jest.config.js | 2 +- .../test/domain/HandleEvmLogs.test.ts | 98 ---------- .../test/domain/PollEvmLogs.test.ts | 180 ------------------ 3 files changed, 1 insertion(+), 279 deletions(-) delete mode 100644 blockchain-watcher/test/domain/HandleEvmLogs.test.ts delete mode 100644 blockchain-watcher/test/domain/PollEvmLogs.test.ts diff --git a/blockchain-watcher/jest.config.js b/blockchain-watcher/jest.config.js index aa5f5840..4c34f282 100644 --- a/blockchain-watcher/jest.config.js +++ b/blockchain-watcher/jest.config.js @@ -13,7 +13,7 @@ module.exports = { coverageDirectory: "./coverage", coverageThreshold: { global: { - lines: 63, + lines: 58.5, }, }, }; diff --git a/blockchain-watcher/test/domain/HandleEvmLogs.test.ts b/blockchain-watcher/test/domain/HandleEvmLogs.test.ts deleted file mode 100644 index 5ea99017..00000000 --- a/blockchain-watcher/test/domain/HandleEvmLogs.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { afterEach, describe, it, expect, jest } from "@jest/globals"; -import { HandleEvmLogs, HandleEvmLogsConfig } from "../../src/domain/actions/HandleEvmLogs"; -import { EvmLog, LogFoundEvent } from "../../src/domain/entities"; - -const ABI = - "event SendEvent(uint64 indexed sequence, uint256 deliveryQuote, uint256 paymentForExtraReceiverValue)"; -const mapper = (log: EvmLog, args: ReadonlyArray) => { - return { - name: "send-event", - address: log.address, - chainId: 1, - txHash: "0x0", - blockHeight: 0n, - blockTime: 0, - attributes: { - sequence: args[0].toString(), - deliveryQuote: args[1].toString(), - paymentForExtraReceiverValue: args[2].toString(), - }, - }; -}; -const targetRepo = { - save: async (events: LogFoundEvent>[]) => { - Promise.resolve(); - }, - failingSave: async (events: LogFoundEvent>[]) => { - Promise.reject(); - }, -}; - -let targetRepoSpy: jest.SpiedFunction<(typeof targetRepo)["save"]>; - -let evmLogs: EvmLog[]; -let cfg: HandleEvmLogsConfig; -let handleEvmLogs: HandleEvmLogs>>; - -describe("HandleEvmLogs", () => { - afterEach(async () => {}); - - it("should be able to map logs", async () => { - const expectedLength = 5; - givenConfig(ABI); - givenEvmLogs(expectedLength, expectedLength); - givenHandleEvmLogs(); - - const result = await handleEvmLogs.handle(evmLogs); - - expect(result).toHaveLength(expectedLength); - expect(result[0].attributes.sequence).toBe("3389"); - expect(result[0].attributes.deliveryQuote).toBe("75150000000000000"); - expect(result[0].attributes.paymentForExtraReceiverValue).toBe("0"); - expect(targetRepoSpy).toBeCalledWith(result); - }); -}); - -const givenHandleEvmLogs = (targetFn: "save" | "failingSave" = "save") => { - targetRepoSpy = jest.spyOn(targetRepo, targetFn); - handleEvmLogs = new HandleEvmLogs(cfg, mapper, targetRepo[targetFn]); -}; - -const givenConfig = (abi: string) => { - cfg = { - filter: { - addresses: ["0x28D8F1Be96f97C1387e94A53e00eCcFb4E75175a"], - topics: ["0xda8540426b64ece7b164a9dce95448765f0a7263ef3ff85091c9c7361e485364"], - }, - abi, - }; -}; - -const givenEvmLogs = (length: number, matchingFilterOnes: number) => { - evmLogs = []; - let matchingCount = 0; - for (let i = 0; i < length; i++) { - let address = "0x392f472048681816e91026cd768c60958b55352add2837adea9ea6249178b8a8"; - let topic: string | undefined = undefined; - if (matchingCount < matchingFilterOnes) { - address = cfg.filter.addresses![0].toUpperCase(); - topic = cfg.filter.topics![0]; - matchingCount++; - } - - evmLogs.push({ - blockTime: 0, - blockNumber: BigInt(i + 1), - blockHash: "0x1a07d0bd31c84f0dab36eac31a2f3aa801852bf8240ffba19113c62463f694fa", - address: address, - removed: false, - data: "0x000000000000000000000000000000000000000000000000010afc86dedee0000000000000000000000000000000000000000000000000000000000000000000", - transactionHash: "0x2077dbd0c685c264dfa4e8e048ff15b03775043070216644258bf1bd3e419aa8", - transactionIndex: "0x4", - topics: topic - ? [topic, "0x0000000000000000000000000000000000000000000000000000000000000d3d"] - : [], - logIndex: 0, - }); - } -}; diff --git a/blockchain-watcher/test/domain/PollEvmLogs.test.ts b/blockchain-watcher/test/domain/PollEvmLogs.test.ts deleted file mode 100644 index f9fd0c08..00000000 --- a/blockchain-watcher/test/domain/PollEvmLogs.test.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { afterEach, describe, it, expect, jest } from "@jest/globals"; -import { setTimeout } from "timers/promises"; -import { - PollEvmLogsMetadata, - PollEvmLogs, - PollEvmLogsConfig, -} from "../../src/domain/actions/PollEvmLogs"; -import { - EvmBlockRepository, - MetadataRepository, - StatRepository, -} from "../../src/domain/repositories"; -import { EvmBlock, EvmLog } from "../../src/domain/entities"; - -let cfg = PollEvmLogsConfig.fromBlock(0n); - -let getBlocksSpy: jest.SpiedFunction; -let getLogsSpy: jest.SpiedFunction; -let handlerSpy: jest.SpiedFunction<(logs: EvmLog[]) => Promise>; -let metadataSaveSpy: jest.SpiedFunction["save"]>; - -let metadataRepo: MetadataRepository; -let evmBlockRepo: EvmBlockRepository; -let statsRepo: StatRepository; - -let handlers = { - working: (logs: EvmLog[]) => Promise.resolve(), - failing: (logs: EvmLog[]) => Promise.reject(), -}; -let pollEvmLogs: PollEvmLogs; - -describe("PollEvmLogs", () => { - afterEach(async () => { - await pollEvmLogs.stop(); - }); - - it("should be able to read logs from latest block when no fromBlock is configured", async () => { - const currentHeight = 10n; - const blocksAhead = 1n; - givenEvmBlockRepository(currentHeight, blocksAhead); - givenMetadataRepository(); - givenStatsRepository(); - givenPollEvmLogs(); - - await whenPollEvmLogsStarts(); - - await thenWaitForAssertion( - () => expect(getBlocksSpy).toHaveReturnedTimes(1), - () => expect(getBlocksSpy).toHaveBeenCalledWith(new Set([currentHeight, currentHeight + 1n])), - () => - expect(getLogsSpy).toBeCalledWith({ - addresses: cfg.addresses, - topics: cfg.topics, - fromBlock: currentHeight + blocksAhead, - toBlock: currentHeight + blocksAhead, - }) - ); - }); - - it("should be able to read logs from last known block when configured from is before", async () => { - const lastExtractedBlock = 10n; - const blocksAhead = 10n; - givenEvmBlockRepository(lastExtractedBlock, blocksAhead); - givenMetadataRepository({ lastBlock: lastExtractedBlock }); - givenStatsRepository(); - givenPollEvmLogs(lastExtractedBlock - 10n); - - await whenPollEvmLogsStarts(); - - await thenWaitForAssertion( - () => () => - expect(getBlocksSpy).toHaveBeenCalledWith( - new Set([lastExtractedBlock, lastExtractedBlock + 1n]) - ), - () => - expect(getLogsSpy).toBeCalledWith({ - addresses: cfg.addresses, - topics: cfg.topics, - fromBlock: lastExtractedBlock + 1n, - toBlock: lastExtractedBlock + blocksAhead, - }) - ); - }); - - it("should pass logs to handlers and persist metadata", async () => { - const currentHeight = 10n; - const blocksAhead = 1n; - givenEvmBlockRepository(currentHeight, blocksAhead); - givenMetadataRepository(); - givenStatsRepository(); - givenPollEvmLogs(currentHeight); - - await whenPollEvmLogsStarts(); - - await thenWaitForAssertion( - () => expect(handlerSpy).toHaveBeenCalledWith(expect.any(Array)), - () => - expect(metadataSaveSpy).toBeCalledWith("watch-evm-logs", { - lastBlock: currentHeight + blocksAhead, - }) - ); - }); -}); - -const givenEvmBlockRepository = (height?: bigint, blocksAhead?: bigint) => { - const logsResponse: EvmLog[] = []; - const blocksResponse: Record = {}; - if (height) { - for (let index = 0n; index <= (blocksAhead ?? 1n); index++) { - logsResponse.push({ - blockNumber: height + index, - blockHash: `0x0${index}`, - blockTime: 0, - address: "", - removed: false, - data: "", - transactionHash: "", - transactionIndex: "", - topics: [], - logIndex: 0, - }); - blocksResponse[`0x0${index}`] = { - timestamp: 0, - hash: `0x0${index}`, - number: height + index, - }; - } - } - - evmBlockRepo = { - getBlocks: () => Promise.resolve(blocksResponse), - getBlockHeight: () => Promise.resolve(height ? height + (blocksAhead ?? 10n) : 10n), - getFilteredLogs: () => Promise.resolve(logsResponse), - }; - - getBlocksSpy = jest.spyOn(evmBlockRepo, "getBlocks"); - getLogsSpy = jest.spyOn(evmBlockRepo, "getFilteredLogs"); - handlerSpy = jest.spyOn(handlers, "working"); -}; - -const givenMetadataRepository = (data?: PollEvmLogsMetadata) => { - metadataRepo = { - get: () => Promise.resolve(data), - save: () => Promise.resolve(), - }; - metadataSaveSpy = jest.spyOn(metadataRepo, "save"); -}; - -const givenStatsRepository = () => { - statsRepo = { - count: () => {}, - measure: () => {}, - report: () => Promise.resolve(""), - }; -}; - -const givenPollEvmLogs = (from?: bigint) => { - cfg.setFromBlock(from); - pollEvmLogs = new PollEvmLogs(evmBlockRepo, metadataRepo, statsRepo, cfg); -}; - -const whenPollEvmLogsStarts = async () => { - pollEvmLogs.run([handlers.working]); -}; - -const thenWaitForAssertion = async (...assertions: (() => void)[]) => { - for (let index = 1; index < 5; index++) { - try { - for (const assertion of assertions) { - assertion(); - } - break; - } catch (error) { - if (index === 4) { - throw error; - } - await setTimeout(10, undefined, { ref: false }); - } - } -};