From 402ee17e11d28d2fc5db5f2eec5414e1d4508204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Abadesso?= Date: Tue, 30 Jul 2024 11:39:06 -0300 Subject: [PATCH] fix: returning empty object on db utils and added test for services including db --- .../services/services_with_db.test.ts | 64 +++++++++++++++++++ packages/daemon/src/db/index.ts | 8 +++ packages/daemon/src/utils/wallet.ts | 4 ++ 3 files changed, 76 insertions(+) create mode 100644 packages/daemon/__tests__/services/services_with_db.test.ts diff --git a/packages/daemon/__tests__/services/services_with_db.test.ts b/packages/daemon/__tests__/services/services_with_db.test.ts new file mode 100644 index 00000000..76c11a5b --- /dev/null +++ b/packages/daemon/__tests__/services/services_with_db.test.ts @@ -0,0 +1,64 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import * as db from '../../src/db'; +import { handleVoidedTx } from '../../src/services'; +import { LRU } from '../../src/utils'; + +/** + * @jest-environment node + */ + +describe('handleVoidedTx (db)', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should handle transactions with an empty list of inputs', async () => { + const voidTxSpy = jest.spyOn(db, 'voidTransaction'); + voidTxSpy.mockResolvedValue(); + + const context = { + socket: expect.any(Object), + healthcheck: expect.any(Object), + retryAttempt: expect.any(Number), + initialEventId: expect.any(Number), + txCache: expect.any(LRU), + event: { + stream_id: 'stream-id', + peer_id: 'peer_id', + network: 'testnet', + type: 'FULLNODE_EVENT', + latest_event_id: 4, + event: { + id: 5, + data: { + hash: 'random-hash', + outputs: [], + inputs: [], + tokens: [], + }, + }, + }, + }; + + const mysql = await db.getDbConnection(); + const lastEvent = await db.getLastSyncedEvent(mysql); + + await expect(handleVoidedTx(context as any)).resolves.not.toThrow(); + expect(db.voidTransaction).toHaveBeenCalledWith( + expect.any(Object), + 'random-hash', + expect.any(Object), + ); + expect(lastEvent).toStrictEqual({ + id: expect.any(Number), + last_event_id: 5, + updated_at: expect.any(String), + }); + }); +}); diff --git a/packages/daemon/src/db/index.ts b/packages/daemon/src/db/index.ts index d0ec6f7a..1367514d 100644 --- a/packages/daemon/src/db/index.ts +++ b/packages/daemon/src/db/index.ts @@ -1413,6 +1413,10 @@ export const fetchAddressBalance = async ( mysql: MysqlConnection, addresses: string[], ): Promise => { + if (addresses.length === 0) { + return []; + } + const [results] = await mysql.query( `SELECT * FROM \`address_balance\` @@ -1443,6 +1447,10 @@ export const fetchAddressTxHistorySum = async ( mysql: MysqlConnection, addresses: string[], ): Promise => { + if (addresses.length === 0) { + return []; + } + const [results] = await mysql.query( `SELECT address, token_id, diff --git a/packages/daemon/src/utils/wallet.ts b/packages/daemon/src/utils/wallet.ts index 1ff43b1a..d9b6a34c 100644 --- a/packages/daemon/src/utils/wallet.ts +++ b/packages/daemon/src/utils/wallet.ts @@ -58,6 +58,10 @@ import { stringMapIterator } from './helpers'; * metadata. */ export const prepareOutputs = (outputs: EventTxOutput[], tokens: string[]): TxOutputWithIndex[] => { + if (outputs.length === 0) { + return []; + } + const preparedOutputs: [number, TxOutputWithIndex[]] = outputs.reduce( ([currIndex, newOutputs]: [number, TxOutputWithIndex[]], _output: EventTxOutput): [number, TxOutputWithIndex[]] => { const output = new Output(_output.value, Buffer.from(_output.script, 'base64'), {