From f747e467b3789cd466ea2dc873caede639477a80 Mon Sep 17 00:00:00 2001 From: Gabriel Claramunt Date: Wed, 30 Jul 2025 11:39:59 -0300 Subject: [PATCH] add more comprehensive pagination test --- prisma/schema.prisma | 4 +- src/handlers/allowSpendsHandler.ts | 81 ++++++++++--------- src/handlers/tokenLocksHandler.ts | 31 +++++--- tests/handlers/actionsHandler.test.ts | 57 +++++++++++++- tests/handlers/allowSpendsHandler.test.ts | 94 +++++++++++++++++++++++ tests/testUtils.ts | 57 ++++++++++---- 6 files changed, 255 insertions(+), 69 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e2a84b9..2ca4fc1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -197,7 +197,7 @@ model dag_spend_transactions { destination_addr String? @db.VarChar allow_spend_ref String? @unique @db.VarChar snapshot_hash String @db.VarChar - currency_id String? @db.VarChar + currency_id String? @db.VarChar dag_allow_spend dag_allow_spends? @relation(fields: [allow_spend_ref], references: [hash], onDelete: Cascade, onUpdate: NoAction, map: "dag_spend_transactions_dag_allow_spends_fk") addresses addresses? @relation(fields: [destination_addr], references: [address], onDelete: Cascade, onUpdate: NoAction, map: "dag_spend_transactions_destination_addr_fk") @@ -234,7 +234,7 @@ model dag_token_unlocks { updated_at DateTime @default(now()) @db.Timestamp(6) lock_reference_hash String @db.VarChar snapshot_hash String @db.VarChar - currency_id String? @db.VarChar + currency_id String? @db.VarChar global_snapshot global_snapshots @relation(fields: [snapshot_hash], references: [hash], onDelete: Cascade, onUpdate: NoAction, map: "dag_token_unlock_global_snapshot_fk") dag_token_lock dag_token_locks @relation(fields: [lock_reference_hash], references: [hash], onDelete: Cascade, onUpdate: NoAction, map: "dag_token_unlocks_token_locks_fk") addresses addresses @relation(fields: [source_addr], references: [address], onDelete: Cascade, onUpdate: NoAction, map: "ddag_token_unlocks_address_fk") diff --git a/src/handlers/allowSpendsHandler.ts b/src/handlers/allowSpendsHandler.ts index 0541b2e..e281a21 100644 --- a/src/handlers/allowSpendsHandler.ts +++ b/src/handlers/allowSpendsHandler.ts @@ -5,6 +5,9 @@ import { paginatedQuery, fromCreatedAtOrdinalCursor, toCreatedAtOrdinalCursor, + fromCreatedAtCursor, + toCreatedAtCursor, + hashCursor, } from "../pagination"; import { respond, handleError } from "../response"; import { includes } from "lodash"; @@ -219,9 +222,12 @@ export const spendTransactions = async ( try { return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, - { include: dagInclude, orderBy: { created_at: "desc" } }, + hashCursor, + hashCursor, + { + include: dagInclude, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], + }, prisma.dag_spend_transactions.findMany, spendTransactionResponses ); @@ -239,14 +245,14 @@ export const globalSnapshotSpendTransactions = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { dag_allow_spend: { global_snapshot: filter }, }, include: dagInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.dag_spend_transactions.findMany, spendTransactionResponses @@ -264,14 +270,14 @@ export const addressSpendTransactions = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { OR: [{ source_addr: address }, { destination_addr: address }], }, include: dagInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.dag_spend_transactions.findMany, spendTransactionResponses @@ -287,9 +293,12 @@ export const allowSpendExpirations = async ( try { return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, - { include: dagInclude, orderBy: { created_at: "desc" } }, + hashCursor, + hashCursor, + { + include: dagInclude, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], + }, prisma.dag_expired_spend_transactions.findMany, spendExpiredResponses ); @@ -324,14 +333,14 @@ export const globalSnapshotAllowSpendExpirations = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { dag_allow_spend: { global_snapshot: filter }, }, include: dagInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.dag_expired_spend_transactions.findMany, spendExpiredResponses @@ -349,8 +358,8 @@ export const addressAllowSpendExpirations = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { OR: [ @@ -359,7 +368,7 @@ export const addressAllowSpendExpirations = async ( ], }, include: dagInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.dag_expired_spend_transactions.findMany, spendExpiredResponses @@ -472,12 +481,12 @@ export const currencySpendTransactions = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id }, include: metagraphInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.metagraph_spend_transactions.findMany, spendTransactionResponses @@ -513,8 +522,8 @@ export const currencySnapshotSpendTransactions = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id, @@ -523,7 +532,7 @@ export const currencySnapshotSpendTransactions = async ( }, }, include: metagraphInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.metagraph_spend_transactions.findMany, spendTransactionResponses @@ -541,14 +550,14 @@ export const currencyAddressSpendTransactions = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { OR: [{ source_addr: address }, { destination_addr: address }], }, include: metagraphInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.metagraph_spend_transactions.findMany, spendExpiredResponses @@ -566,12 +575,12 @@ export const currencyAllowSpendExpirations = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id }, include: metagraphInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.metagraph_expired_spend_transactions.findMany, spendExpiredResponses @@ -608,8 +617,8 @@ export const currencySnapshotAllowSpendExpirations = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id, @@ -618,7 +627,7 @@ export const currencySnapshotAllowSpendExpirations = async ( }, }, include: metagraphInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.metagraph_expired_spend_transactions.findMany, spendExpiredResponses @@ -636,8 +645,8 @@ export const currencyAddressAllowSpendExpirations = async ( return await paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id, @@ -647,7 +656,7 @@ export const currencyAddressAllowSpendExpirations = async ( ], }, include: metagraphInclude, - orderBy: { created_at: "desc" }, + orderBy: [{ created_at: "desc" }, { hash: "asc" }], }, prisma.metagraph_expired_spend_transactions.findMany, spendExpiredResponses diff --git a/src/handlers/tokenLocksHandler.ts b/src/handlers/tokenLocksHandler.ts index 51ea845..90b66bb 100644 --- a/src/handlers/tokenLocksHandler.ts +++ b/src/handlers/tokenLocksHandler.ts @@ -5,6 +5,7 @@ import { paginatedQuery, fromCreatedAtOrdinalCursor, toCreatedAtOrdinalCursor, + hashCursor, } from "../pagination"; import { handleError, respond } from "../response"; @@ -227,13 +228,14 @@ export const tokenUnlocks = async ( ): Promise => { return paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { include: includeDagGlobalSnapshotOrdinal, orderBy: [ { global_snapshot: { ordinal: "desc" } }, { created_at: "desc" }, + { hash: "asc" }, ], }, prisma.dag_token_unlocks.findMany, @@ -267,8 +269,8 @@ export const globalSnapshotTokenUnlocks = async ( return paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { global_snapshot: filter, @@ -277,6 +279,7 @@ export const globalSnapshotTokenUnlocks = async ( orderBy: [ { global_snapshot: { ordinal: "desc" } }, { created_at: "desc" }, + { hash: "asc" }, ], }, prisma.dag_token_unlocks.findMany, @@ -295,14 +298,15 @@ export const addressTokenUnlocks = async ( return paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { source_addr: address }, include: includeDagGlobalSnapshotOrdinal, orderBy: [ { global_snapshot: { ordinal: "desc" } }, { created_at: "desc" }, + { hash: "asc" }, ], }, prisma.dag_token_unlocks.findMany, @@ -416,8 +420,8 @@ export const metagraphTokenUnlocks = async ( const { metagraph_id } = event.pathParameters || {}; return paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id }, include: { @@ -427,6 +431,7 @@ export const metagraphTokenUnlocks = async ( orderBy: [ { metagraph_snapshot: { ordinal: "desc" } }, { created_at: "desc" }, + { hash: "asc" }, ], }, prisma.metagraph_token_unlocks.findMany, @@ -463,8 +468,8 @@ export const metagraphSnapshotTokenUnlocks = async ( return paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id, @@ -477,6 +482,7 @@ export const metagraphSnapshotTokenUnlocks = async ( orderBy: [ { metagraph_snapshot: { ordinal: "desc" } }, { created_at: "desc" }, + { hash: "asc" }, ], }, prisma.metagraph_token_unlocks.findMany, @@ -495,8 +501,8 @@ export const metagraphAddressTokenUnlocks = async ( return paginatedQuery( extractPagination(event), - toCreatedAtOrdinalCursor, - fromCreatedAtOrdinalCursor, + hashCursor, + hashCursor, { where: { metagraph_id, source_addr: address }, include: { @@ -506,6 +512,7 @@ export const metagraphAddressTokenUnlocks = async ( orderBy: [ { metagraph_snapshot: { ordinal: "desc" } }, { created_at: "desc" }, + { hash: "asc" }, ], }, prisma.metagraph_token_unlocks.findMany, diff --git a/tests/handlers/actionsHandler.test.ts b/tests/handlers/actionsHandler.test.ts index 8f3c546..f86ba7d 100644 --- a/tests/handlers/actionsHandler.test.ts +++ b/tests/handlers/actionsHandler.test.ts @@ -4,6 +4,7 @@ import { createAPIGatewayEvent, validateResponseStructure, validatePaginatedResponse, + validatePaginationNext, } from "../testUtils"; import { data_dag_token_locks, @@ -87,8 +88,12 @@ describe("actionsHandler", () => { body.data.forEach(validateAction); }); + it("dagActionsPagination", async () => { + await validatePaginationNext("1", {}, actionsHandler.dagActions); + }); + it("globalSnapshotActions", async () => { - const event = createAPIGatewayEvent({ term: "1000" }, {}); + const event = createAPIGatewayEvent({ term: "2556535" }, {}); const result = (await actionsHandler.globalSnapshotActions( event )) as APIGatewayProxyResult; @@ -99,6 +104,14 @@ describe("actionsHandler", () => { body.data.forEach(validateAction); }); + it("globalSnapshotDagActionsPagination", async () => { + await validatePaginationNext( + "1", + { term: "2556535" }, + actionsHandler.globalSnapshotActions + ); + }); + it("dagAddressActions", async () => { const address = data_dag_token_locks[0].source_addr; const event = createAPIGatewayEvent({ address }, {}); @@ -113,6 +126,15 @@ describe("actionsHandler", () => { body.data.forEach(validateAction); }); + it("dagAddressActionsPagination", async () => { + const address = data_dag_token_locks[0].source_addr; + await validatePaginationNext( + "1", + { address }, + actionsHandler.dagAddressActions + ); + }); + it("currencyActions", async () => { const metagraph_id = data_metagraph_token_locks[0].metagraph_id; const event = createAPIGatewayEvent({ metagraph_id }, {}); @@ -127,6 +149,15 @@ describe("actionsHandler", () => { body.data.forEach(validateAction); }); + it("currencyActionsPagination", async () => { + const metagraph_id = data_metagraph_token_locks[0].metagraph_id; + await validatePaginationNext( + "1", + { metagraph_id }, + actionsHandler.currencyActions + ); + }); + it("currencySnapshotActions", async () => { const metagraph_id = data_metagraph_token_locks[0].metagraph_id; const snapshotHash = data_metagraph_snapshots[0].hash; @@ -145,9 +176,19 @@ describe("actionsHandler", () => { body.data.forEach(validateAction); }); - it("currencyAddressActions", async () => { + it("currencySnapshotActionsPagination", async () => { const metagraph_id = data_metagraph_token_locks[0].metagraph_id; - const address = data_metagraph_token_locks[0].source_addr; + const snapshotHash = data_metagraph_snapshots[0].hash; + await validatePaginationNext( + "1", + { metagraph_id, term: snapshotHash }, + actionsHandler.currencySnapshotActions + ); + }); + + it("currencyAddressActions", async () => { + const metagraph_id = data_metagraph_allow_spends[0].metagraph_id; + const address = data_metagraph_allow_spends[0].source_addr; const event = createAPIGatewayEvent({ metagraph_id, address }, {}); const result = (await actionsHandler.currencyAddressActions( event @@ -159,4 +200,14 @@ describe("actionsHandler", () => { expect(body.data.length).toBe(9); body.data.forEach(validateAction); }); + + it("currencyAddressActionsPagination", async () => { + const metagraph_id = data_metagraph_allow_spends[0].metagraph_id; + const address = data_metagraph_allow_spends[0].source_addr; + await validatePaginationNext( + "1", + { metagraph_id, address }, + actionsHandler.currencyAddressActions + ); + }); }); diff --git a/tests/handlers/allowSpendsHandler.test.ts b/tests/handlers/allowSpendsHandler.test.ts index e2ea3fd..b81d92b 100644 --- a/tests/handlers/allowSpendsHandler.test.ts +++ b/tests/handlers/allowSpendsHandler.test.ts @@ -3,6 +3,7 @@ import * as allowSpendsHandler from "../../src/handlers/allowSpendsHandler"; import { createAPIGatewayEvent, validatePaginatedResponse, + validatePaginationNext, validateResponseStructure, } from "../testUtils"; import { @@ -136,6 +137,12 @@ describe("AllowSpends Handler Integration Tests", () => { }); }); + it("allowSpendsPagination", async () => { + const metagraph_id = data_metagraph_allow_spends[0].metagraph_id; + const address = data_metagraph_allow_spends[0].source_addr; + await validatePaginationNext("1", {}, allowSpendsHandler.allowSpends); + }); + describe("allowSpend", () => { it("should return a specific allow spend by hash", async () => { const hash = data_dag_allow_spends[0].hash; @@ -180,6 +187,14 @@ describe("AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(1); body.data.forEach(validateDagAllowSpend); }); + + it("globalSnapshotAllowSpendsPagination", async () => { + await validatePaginationNext( + "1", + {}, + allowSpendsHandler.globalSnapshotAllowSpends + ); + }); }); describe("addressAllowSpends", () => { @@ -194,6 +209,7 @@ describe("AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(1); body.data.forEach(validateDagAllowSpend); }); + it("should return active only allow spends for a specific address", async () => { const address = data_addresses[3].address; const event = createAPIGatewayEvent({ address }, { active: "true" }); @@ -205,6 +221,15 @@ describe("AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(1); body.data.forEach(validateDagAllowSpend); }); + + it("addressAllowSpendsPagination", async () => { + const address = data_addresses[0].address; + await validatePaginationNext( + "1", + { address }, + allowSpendsHandler.addressAllowSpends + ); + }); }); describe("spendTransactions", () => { @@ -217,6 +242,10 @@ describe("AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(data_dag_spend_transactions.length); validateDagSpendTransaction(body.data[0]); }); + + // it("spendTransactionsPagination", async () => { + // await validatePaginationNext("1", {}, allowSpendsHandler.spendTransactions); + // }); }); describe("allowSpendExpirations", () => { @@ -229,6 +258,10 @@ describe("AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(data_dag_expired_spend_transactions.length); validateDagExpiredSpend(body.data[0]); }); + + // it("spendTransactionsPagination", async () => { + // await validatePaginationNext("1", {}, allowSpendsHandler.allowSpendExpirations); + // }); }); describe("addressSpendTransactions", () => { @@ -243,6 +276,11 @@ describe("AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBeGreaterThan(0); body.data.forEach(validateDagSpendTransaction); }); + + // it("addressSpendTransactionsPagination", async () => { + // const address = data_addresses[0].address; + // await validatePaginationNext("1", {address}, allowSpendsHandler.addressSpendTransactions); + // }); }); describe("addressAllowSpendExpirations", () => { @@ -259,6 +297,10 @@ describe("AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBeGreaterThan(0); body.data.forEach(validateDagExpiredSpend); }); + // it("addressAllowSpendExpirationsPagination", async () => { + // const address = data_addresses[0].address; + // await validatePaginationNext("1", {address}, allowSpendsHandler.addressAllowSpendExpirations); + // }); }); }); @@ -290,6 +332,15 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { }); }); + it("currencyAllowSpendsPagination", async () => { + const metagraph_id = data_metagraphs[0].id; + await validatePaginationNext( + "1", + { metagraph_id }, + allowSpendsHandler.currencyAllowSpends + ); + }); + describe("currencySpendTransactions", () => { it("should return spend transactions", async () => { const event = createAPIGatewayEvent({ @@ -304,6 +355,10 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(data_metagraph_spend_transactions.length); body.data.forEach(validateMgSpendTransaction); }); + // it("currencySpendTransactionsPagination", async () => { + // const metagraph_id= data_metagraphs[0].id + // await validatePaginationNext("1", {metagraph_id}, allowSpendsHandler.currencySpendTransactions); + // }); }); describe("currencyAllowSpendExpirations", () => { @@ -322,6 +377,10 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { ); body.data.forEach(validateMgExpiredSpend); }); + // it("currencyAllowSpendExpirationsPagination", async () => { + // const metagraph_id= data_metagraphs[0].id + // await validatePaginationNext("1", {metagraph_id}, allowSpendsHandler.currencyAllowSpendExpirations); + // }); }); describe("currencySnapshotAllowSpends", () => { @@ -356,6 +415,12 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(1); body.data.forEach(validateMgAllowSpend); }); + + // it("currencySnapshotAllowSpendsPagination", async () => { + // const metagraph_id= data_metagraphs[0].id + // const hash_or_ordinal= data_metagraph_snapshots[0].hash + // await validatePaginationNext("1", {metagraph_id, hash_or_ordinal}, allowSpendsHandler.currencySnapshotAllowSpends); + // }); }); describe("currencySnapshotSpendTransactions", () => { @@ -372,6 +437,11 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(1); body.data.forEach(validateMgSpendTransaction); }); + // it("currencySnapshotSpendTransactionsPagination", async () => { + // const metagraph_id= data_metagraphs[0].id + // const hash_or_ordinal= data_metagraph_snapshots[0].hash + // await validatePaginationNext("1", {metagraph_id, hash_or_ordinal}, allowSpendsHandler.currencySnapshotSpendTransactions); + // }); }); describe("currencySnapshotAllowSpendExpirations", () => { @@ -388,6 +458,11 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { expect(body.data.length).toBe(1); body.data.forEach(validateMgExpiredSpend); }); + // it("currencySnapshotAllowSpendExpirationsPagination", async () => { + // const metagraph_id= data_metagraphs[0].id + // const hash_or_ordinal= data_metagraph_snapshots[0].hash + // await validatePaginationNext("1", {metagraph_id, hash_or_ordinal}, allowSpendsHandler.currencySnapshotAllowSpendExpirations); + // }); }); describe("currencyAddressAllowSpends", () => { @@ -420,6 +495,15 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { const body = validatePaginatedResponse(response); expect(body.data.length).toBe(1); }); + it("currencyAddressAllowSpendsPagination", async () => { + const metagraph_id = data_metagraphs[0].id; + const address = data_addresses[1].address; + await validatePaginationNext( + "1", + { metagraph_id, address }, + allowSpendsHandler.currencyAddressAllowSpends + ); + }); }); describe("currencyAddressSpendTransactions", () => { @@ -435,6 +519,11 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { const body = validatePaginatedResponse(response); expect(body.data.length).toBe(1); }); + // it("currencyAddressSpendTransactionsPagination", async () => { + // const metagraph_id= data_metagraphs[0].id + // const address = data_addresses[1].address + // await validatePaginationNext("1", {metagraph_id, address}, allowSpendsHandler.currencyAddressSpendTransactions); + // }); }); describe("currencyAddressAllowSpendExpirations", () => { @@ -450,5 +539,10 @@ describe("Metagraph AllowSpends Handler Integration Tests", () => { const body = validatePaginatedResponse(response); expect(body.data.length).toBe(1); }); + // it("currencyAddressAllowSpendExpirationsPagination", async () => { + // const metagraph_id= data_metagraphs[0].id + // const address = data_addresses[0].address + // await validatePaginationNext("1", {metagraph_id, address}, allowSpendsHandler.currencyAddressAllowSpendExpirations); + // }); }); }); diff --git a/tests/testUtils.ts b/tests/testUtils.ts index db1ed93..0219b18 100644 --- a/tests/testUtils.ts +++ b/tests/testUtils.ts @@ -1,4 +1,4 @@ -import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda"; /** * Creates an API Gateway event object for testing handler functions @@ -8,15 +8,17 @@ export const createAPIGatewayEvent = ( queryStringParameters: Record = {}, body: string | null = null ): APIGatewayProxyEvent => ({ - httpMethod: 'GET', + httpMethod: "GET", isBase64Encoded: false, - path: '', - resource: '', + path: "", + resource: "", body, headers: {}, multiValueHeaders: {}, pathParameters: Object.keys(pathParameters).length ? pathParameters : null, - queryStringParameters: Object.keys(queryStringParameters).length ? queryStringParameters : null, + queryStringParameters: Object.keys(queryStringParameters).length + ? queryStringParameters + : null, multiValueQueryStringParameters: null, stageVariables: null, requestContext: {} as any, @@ -35,44 +37,67 @@ export const parseResponseBody = (response: APIGatewayProxyResult) => { export const validateResponseStructure = (response: APIGatewayProxyResult) => { expect(response.statusCode).toBeDefined(); expect(response.headers).toBeDefined(); - + // Check headers if they exist if (response.headers) { - expect(response.headers['Content-Type']).toBe('application/json'); - expect(response.headers['Access-Control-Allow-Origin']).toBe('*'); + expect(response.headers["Content-Type"]).toBe("application/json"); + expect(response.headers["Access-Control-Allow-Origin"]).toBe("*"); } - + expect(response.body).toBeDefined(); - + const body = parseResponseBody(response); expect(body).toBeDefined(); - + // Success responses should have a data field if (response.statusCode === 200) { expect(body.data).toBeDefined(); } - + // Error responses should have message and errors fields if (response.statusCode >= 400) { expect(body.message).toBeDefined(); expect(body.errors).toBeDefined(); } - + return body; }; /** * Validates that a paginated response has the correct structure */ -export const validatePaginatedResponse = (response: APIGatewayProxyResult, shouldHaveNext: boolean = false) => { +export const validatePaginatedResponse = ( + response: APIGatewayProxyResult, + shouldHaveNext: boolean = false +) => { const body = validateResponseStructure(response); - + expect(Array.isArray(body.data)).toBe(true); if (shouldHaveNext) { expect(body.meta).toBeDefined(); expect(body.meta.next !== undefined).toBe(true); } - + return body; }; + +export const validatePaginationNext = async ( + limit: string, + pathParameters: Record = {}, + action: (event: APIGatewayProxyEvent) => Promise +) => { + const event = createAPIGatewayEvent(pathParameters, { limit }); + + const response = await action(event); + expect(response.statusCode).toBe(200); + + const body = validatePaginatedResponse(response); + const next = body.meta.next; + + const event2 = createAPIGatewayEvent(pathParameters, { limit, next }); + const response2 = await action(event2); + expect(response2.statusCode).toBe(200); + + validatePaginatedResponse(response2); +};