From 95b25b3d3bb1fab9ad4e2d7a6bceeb929dae090c Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Thu, 20 Jul 2023 23:32:10 +0200 Subject: [PATCH] add Darios TestClient --- backend/src/apis/DltConnectorClientTest.ts | 166 +++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 backend/src/apis/DltConnectorClientTest.ts diff --git a/backend/src/apis/DltConnectorClientTest.ts b/backend/src/apis/DltConnectorClientTest.ts new file mode 100644 index 000000000..3512a1633 --- /dev/null +++ b/backend/src/apis/DltConnectorClientTest.ts @@ -0,0 +1,166 @@ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable security/detect-object-injection */ +/* eslint-disable @typescript-eslint/no-unsafe-return */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ + +import { Connection } from '@dbTools/typeorm' +import { Transaction as DbTransaction } from '@entity/Transaction' +import { Decimal } from 'decimal.js-light' + +import { cleanDB, testEnvironment } from '@test/helpers' + +import { CONFIG } from '@/config' +import { LogError } from '@/server/LogError' +import { backendLogger as logger } from '@/server/logger' + +import { DltConnectorClient } from './DltConnectorClient' + +let con: Connection + +let testEnv: { + con: Connection +} + +// Mock the GraphQLClient +jest.mock('graphql-request', () => { + const originalModule = jest.requireActual('graphql-request') + + let testCursor = 0 + + return { + __esModule: true, + ...originalModule, + GraphQLClient: jest.fn().mockImplementation((url: string) => { + if (url === 'invalid') { + throw new Error('invalid url') + } + return { + // why not using mockResolvedValueOnce or mockReturnValueOnce? + // I have tried, but it didn't work and return every time the first value + request: jest.fn().mockImplementation(() => { + testCursor++ + if (testCursor === 4) { + return Promise.resolve( + // invalid, is 33 Bytes long as binary + { + transmitTransaction: { + dltTransactionIdHex: + '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516212A', + }, + }, + ) + } else if (testCursor === 5) { + throw Error('Connection error') + } else { + return Promise.resolve( + // valid, is 32 Bytes long as binary + { + transmitTransaction: { + dltTransactionIdHex: + '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc51621', + }, + }, + ) + } + }), + } + }), + } +}) + +describe('undefined DltConnectorClient', () => { + it('invalid url', () => { + CONFIG.DLT_CONNECTOR_URL = 'invalid' + CONFIG.DLT_CONNECTOR = true + const result = DltConnectorClient.getInstance() + expect(result).toBeUndefined() + CONFIG.DLT_CONNECTOR_URL = 'http://dlt-connector:6010' + }) + + it('DLT_CONNECTOR is false', () => { + CONFIG.DLT_CONNECTOR = false + const result = DltConnectorClient.getInstance() + expect(result).toBeUndefined() + CONFIG.DLT_CONNECTOR = true + }) +}) + +describe('transmitTransaction, without db connection', () => { + const transaction = new DbTransaction() + transaction.typeId = 2 // Example transaction type ID + transaction.amount = new Decimal('10.00') // Example amount + transaction.balanceDate = new Date() // Example creation date + transaction.id = 1 // Example transaction ID + + it('cannot query for transaction id', async () => { + const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) + expect(result).toBe(false) + }) +}) + +describe('transmitTransaction', () => { + beforeAll(async () => { + testEnv = await testEnvironment(logger) + con = testEnv.con + await cleanDB() + }) + + afterAll(async () => { + await cleanDB() + await con.close() + }) + + const transaction = new DbTransaction() + transaction.typeId = 2 // Example transaction type ID + transaction.amount = new Decimal('10.00') // Example amount + transaction.balanceDate = new Date() // Example creation date + transaction.id = 1 // Example transaction ID + + // data needed to let save succeed + transaction.memo = "I'm a dummy memo" + transaction.userId = 1 + transaction.userGradidoID = 'dummy gradido id' + + it('cannot find transaction in db', async () => { + const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) + expect(result).toBe(false) + }) + + it('invalid transaction type', async () => { + const localTransaction = new DbTransaction() + localTransaction.typeId = 12 + try { + await DltConnectorClient.getInstance()?.transmitTransaction(localTransaction) + } catch (e) { + expect(e).toMatchObject( + new LogError('invalid transaction type id: ' + localTransaction.typeId.toString()), + ) + } + }) + + it('should transmit the transaction and update the dltTransactionId in the database', async () => { + await transaction.save() + + const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) + expect(result).toBe(true) + }) + + it('invalid dltTransactionId (maximal 32 Bytes in Binary)', async () => { + await transaction.save() + + const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) + expect(result).toBe(false) + }) +}) + +describe('try transmitTransaction but graphql request failed', () => { + it('graphql request should throw', async () => { + const transaction = new DbTransaction() + transaction.typeId = 2 // Example transaction type ID + transaction.amount = new Decimal('10.00') // Example amount + transaction.balanceDate = new Date() // Example creation date + transaction.id = 1 // Example transaction ID + const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) + expect(result).toBe(false) + }) +})