From 67fdf32a602f564c26b36b1647a2917758b787b9 Mon Sep 17 00:00:00 2001 From: Toni Tabak Date: Wed, 27 Nov 2024 23:24:00 +0900 Subject: [PATCH] test: custom machers + event custom macher --- __tests__/cairo1v2.test.ts | 53 ++++-------------------------- __tests__/cairo1v2_typed.test.ts | 52 ++++------------------------- __tests__/config/customMatchers.ts | 32 ++++++++++++++++++ __tests__/config/jest.setup.ts | 6 ++++ __tests__/contract.test.ts | 11 ++----- 5 files changed, 53 insertions(+), 101 deletions(-) create mode 100644 __tests__/config/customMatchers.ts diff --git a/__tests__/cairo1v2.test.ts b/__tests__/cairo1v2.test.ts index 0a4b1c45b..4624abc37 100644 --- a/__tests__/cairo1v2.test.ts +++ b/__tests__/cairo1v2.test.ts @@ -1,5 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; + import { Account, BigNumberish, @@ -872,14 +873,7 @@ describe('Cairo 1', () => { ]; const tx = await provider.waitForTransaction(transaction_hash); const myEvents = eventContract.parseEvents(tx); - const event0 = myEvents[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - return expect([event0]).toStrictEqual(shouldBe); + expect(myEvents[0]).toMatchEventStructure(shouldBe[0]); }); test('parse event returning a nested struct', async () => { @@ -897,14 +891,7 @@ describe('Cairo 1', () => { ]; const tx = await provider.waitForTransaction(transaction_hash); const myEvents = eventContract.parseEvents(tx); - const event0 = myEvents[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - return expect([event0]).toStrictEqual(shouldBe); + expect(myEvents[0]).toMatchEventStructure(shouldBe[0]); }); test('parse tx returning multiple similar events', async () => { @@ -950,21 +937,8 @@ describe('Cairo 1', () => { const { transaction_hash } = await account.execute([callData1, callData2]); const tx = await provider.waitForTransaction(transaction_hash); const myEvents = eventContract.parseEvents(tx); - const event0 = myEvents[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - const event1 = myEvents[1]; - expect(event1.block_hash).toBeDefined(); - expect(event1.block_number).toBeDefined(); - expect(event1.transaction_hash).toBeDefined(); - delete event1.block_hash; - delete event1.block_number; - delete event1.transaction_hash; - return expect([event0, event1]).toStrictEqual(shouldBe); + expect(myEvents[0]).toMatchEventStructure(shouldBe[0]); + expect(myEvents[1]).toMatchEventStructure(shouldBe[1]); }); test('parse tx returning multiple different events', async () => { const shouldBe: types.ParsedEvents = [ @@ -1000,21 +974,8 @@ describe('Cairo 1', () => { const { transaction_hash } = await account.execute([callData1, callData2]); const tx = await provider.waitForTransaction(transaction_hash); const myEvents = eventContract.parseEvents(tx); - const event0 = myEvents[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - const event1 = myEvents[1]; - expect(event1.block_hash).toBeDefined(); - expect(event1.block_number).toBeDefined(); - expect(event1.transaction_hash).toBeDefined(); - delete event1.block_hash; - delete event1.block_number; - delete event1.transaction_hash; - return expect([event0, event1]).toStrictEqual(shouldBe); + expect(myEvents[0]).toMatchEventStructure(shouldBe[0]); + expect(myEvents[1]).toMatchEventStructure(shouldBe[1]); }); test('parsing nested events from Cairo components', () => { diff --git a/__tests__/cairo1v2_typed.test.ts b/__tests__/cairo1v2_typed.test.ts index 243575a1b..3fe5f21ef 100644 --- a/__tests__/cairo1v2_typed.test.ts +++ b/__tests__/cairo1v2_typed.test.ts @@ -815,14 +815,7 @@ describe('Cairo 1', () => { ]; const tx = await provider.waitForTransaction(transaction_hash); const events = eventContract.parseEvents(tx); - const event0 = events[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - return expect([event0]).toStrictEqual(shouldBe); + expect(events[0]).toMatchEventStructure(shouldBe[0]); }); test('parse event returning a nested struct', async () => { @@ -840,14 +833,7 @@ describe('Cairo 1', () => { ]; const tx = await provider.waitForTransaction(transaction_hash); const events = eventContract.parseEvents(tx); - const event0 = events[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - return expect([event0]).toStrictEqual(shouldBe); + expect(events[0]).toMatchEventStructure(shouldBe[0]); }); test('parse tx returning multiple similar events', async () => { @@ -893,21 +879,8 @@ describe('Cairo 1', () => { const { transaction_hash } = await account.execute([callData1, callData2]); const tx = await provider.waitForTransaction(transaction_hash); const events = eventContract.parseEvents(tx); - const event0 = events[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - const event1 = events[1]; - expect(event1.block_hash).toBeDefined(); - expect(event1.block_number).toBeDefined(); - expect(event1.transaction_hash).toBeDefined(); - delete event1.block_hash; - delete event1.block_number; - delete event1.transaction_hash; - return expect([event0, event1]).toStrictEqual(shouldBe); + expect(events[0]).toMatchEventStructure(shouldBe[0]); + expect(events[1]).toMatchEventStructure(shouldBe[1]); }); test('parse tx returning multiple different events', async () => { const shouldBe: types.ParsedEvents = [ @@ -943,21 +916,8 @@ describe('Cairo 1', () => { const { transaction_hash } = await account.execute([callData1, callData2]); const tx = await provider.waitForTransaction(transaction_hash); const events = eventContract.parseEvents(tx); - const event0 = events[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - const event1 = events[1]; - expect(event1.block_hash).toBeDefined(); - expect(event1.block_number).toBeDefined(); - expect(event1.transaction_hash).toBeDefined(); - delete event1.block_hash; - delete event1.block_number; - delete event1.transaction_hash; - return expect([event0, event1]).toStrictEqual(shouldBe); + expect(events[0]).toMatchEventStructure(shouldBe[0]); + expect(events[1]).toMatchEventStructure(shouldBe[1]); }); }); diff --git a/__tests__/config/customMatchers.ts b/__tests__/config/customMatchers.ts new file mode 100644 index 000000000..32cc0db51 --- /dev/null +++ b/__tests__/config/customMatchers.ts @@ -0,0 +1,32 @@ +// @ts-nocheck + +declare global { + namespace jest { + interface Matchers { + toMatchEventStructure(expected: any): R; + } + } +} + +const customMatchers = { + toMatchEventStructure(received: any, expected: any): any { + const { block_hash, block_number, transaction_hash, ...eventData } = received; + + // Check if required properties exist + const hasRequiredProps = block_hash && block_number && transaction_hash; + + // Check if event data matches + const eventDataMatches = this.equals(eventData, expected); + + return { + actual: received, + pass: hasRequiredProps && eventDataMatches, + message: () => + `Expected event to match structure with dynamic properties.\n\n` + + `Expected: ${this.utils.printExpected(expected)}\n` + + `Received: ${this.utils.printReceived(eventData)}`, + }; + }, +}; + +export default customMatchers; diff --git a/__tests__/config/jest.setup.ts b/__tests__/config/jest.setup.ts index 21078680d..b6c79fb8a 100644 --- a/__tests__/config/jest.setup.ts +++ b/__tests__/config/jest.setup.ts @@ -9,6 +9,12 @@ import 'isomorphic-fetch'; /* eslint-disable no-console */ import { register } from 'fetch-intercept'; +import customMatchers from './customMatchers'; + +beforeAll(() => { + expect.extend(customMatchers); +}); + const util = require('util'); jest.setTimeout(50 * 60 * 1000); diff --git a/__tests__/contract.test.ts b/__tests__/contract.test.ts index 622d2ce46..b8f44d7c2 100644 --- a/__tests__/contract.test.ts +++ b/__tests__/contract.test.ts @@ -4,10 +4,10 @@ import { ContractFactory, ParsedEvents, RawArgs, + SuccessfulTransactionReceiptResponse, json, shortString, stark, - SuccessfulTransactionReceiptResponse, } from '../src'; import { CallData } from '../src/utils/calldata'; import { felt, isCairo1Abi, tuple, uint256 } from '../src/utils/calldata/cairo'; @@ -152,14 +152,7 @@ describe('contract module', () => { }, }, ]; - const event0 = events[0]; - expect(event0.block_hash).toBeDefined(); - expect(event0.block_number).toBeDefined(); - expect(event0.transaction_hash).toBeDefined(); - delete event0.block_hash; - delete event0.block_number; - delete event0.transaction_hash; - return expect([event0]).toStrictEqual(shouldBe); + expect(events[0]).toMatchEventStructure(shouldBe[0]); }); });