From 183c05dfcbbe84b88e1caf49aea7431ec538525e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 7 Nov 2026 16:48:13 +0000 Subject: [PATCH] fix: stop treating pool errors as missing addresses addressExists was catching every failure from findUniqueOrThrow and mapping it to NO_ADDRESS_FOUND, which made connection-pool timeouts look like new addresses and kicked off unnecessary sync work. Co-authored-by: David --- services/addressService.ts | 16 ++++++------ tests/unittests/addressService.test.ts | 34 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/services/addressService.ts b/services/addressService.ts index 8b2ff273..40e30d99 100644 --- a/services/addressService.ts +++ b/services/addressService.ts @@ -125,13 +125,15 @@ export async function fetchAddressBySubstring (substring: string, includeTransac } export async function addressExists (addressString: string, raise = false): Promise { - try { - await prisma.address.findUniqueOrThrow({ - where: { - address: addressString - } - }) - } catch (err: any) { + const address = await prisma.address.findUnique({ + where: { + address: addressString + }, + select: { + id: true + } + }) + if (address === null) { if (raise) { throw new Error(RESPONSE_MESSAGES.NO_ADDRESS_FOUND_404.message) } diff --git a/tests/unittests/addressService.test.ts b/tests/unittests/addressService.test.ts index aba26953..f281a18d 100644 --- a/tests/unittests/addressService.test.ts +++ b/tests/unittests/addressService.test.ts @@ -58,3 +58,37 @@ describe('Create by substring', () => { expect(result).toEqual(mockedBCHAddress) }) }) + +describe('addressExists', () => { + it('returns true when the address exists', async () => { + prismaMock.address.findUnique.mockResolvedValue({ id: mockedBCHAddress.id } as any) + prisma.address.findUnique = prismaMock.address.findUnique + + await expect(addressService.addressExists(mockedBCHAddress.address)).resolves.toBe(true) + }) + + it('returns false when the address is missing', async () => { + prismaMock.address.findUnique.mockResolvedValue(null) + prisma.address.findUnique = prismaMock.address.findUnique + + await expect(addressService.addressExists(mockedBCHAddress.address)).resolves.toBe(false) + }) + + it('throws NO_ADDRESS_FOUND when raise is true and the address is missing', async () => { + prismaMock.address.findUnique.mockResolvedValue(null) + prisma.address.findUnique = prismaMock.address.findUnique + + await expect(addressService.addressExists(mockedBCHAddress.address, true)).rejects.toThrow( + RESPONSE_MESSAGES.NO_ADDRESS_FOUND_404.message + ) + }) + + it('propagates database errors instead of treating them as missing addresses', async () => { + const poolTimeout = new Error('Timed out fetching a new connection from the connection pool.') + prismaMock.address.findUnique.mockRejectedValue(poolTimeout) + prisma.address.findUnique = prismaMock.address.findUnique + + await expect(addressService.addressExists(mockedBCHAddress.address, true)).rejects.toThrow(poolTimeout) + await expect(addressService.addressExists(mockedBCHAddress.address)).rejects.toThrow(poolTimeout) + }) +})