diff --git a/backend/src/federation/client/1_0/SendCoinsClient.ts b/backend/src/federation/client/1_0/SendCoinsClient.ts index 3b3bf4f2c..fe22d036c 100644 --- a/backend/src/federation/client/1_0/SendCoinsClient.ts +++ b/backend/src/federation/client/1_0/SendCoinsClient.ts @@ -6,10 +6,10 @@ import { backendLogger as logger } from '@/server/logger' import { SendCoinsArgs } from './model/SendCoinsArgs' import { SendCoinsResult } from './model/SendCoinsResult' -import { revertSendCoins } from './query/revertSendCoins' -import { revertSettledSendCoins } from './query/revertSettledSendCoins' -import { settleSendCoins } from './query/settleSendCoins' -import { voteForSendCoins } from './query/voteForSendCoins' +import { revertSendCoins as revertSendCoinsQuery } from './query/revertSendCoins' +import { revertSettledSendCoins as revertSettledSendCoinsQuery } from './query/revertSettledSendCoins' +import { settleSendCoins as settleSendCoinsQuery } from './query/settleSendCoins' +import { voteForSendCoins as voteForSendCoinsQuery } from './query/voteForSendCoins' // eslint-disable-next-line camelcase export class SendCoinsClient { @@ -31,16 +31,16 @@ export class SendCoinsClient { }) } - voteForSendCoins = async (args: SendCoinsArgs): Promise => { + async voteForSendCoins(args: SendCoinsArgs): Promise { logger.debug('X-Com: voteForSendCoins against endpoint=', this.endpoint) try { logger.debug(`X-Com: SendCoinsClient: voteForSendCoins with args=`, args) // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data } = await this.client.rawRequest(voteForSendCoins, { args }) + const { data } = await this.client.rawRequest(voteForSendCoinsQuery, { args }) logger.debug(`X-Com: SendCoinsClient: after rawRequest...data:`, data) // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (!data?.voteForSendCoins?.vote) { - logger.warn('X-Com: voteForSendCoins failed with: ', data) + logger.debug('X-Com: voteForSendCoins failed with: ', data) return new SendCoinsResult() } const result = new SendCoinsResult() @@ -56,12 +56,12 @@ export class SendCoinsClient { } } - revertSendCoins = async (args: SendCoinsArgs): Promise => { + async revertSendCoins(args: SendCoinsArgs): Promise { logger.debug('X-Com: revertSendCoins against endpoint=', this.endpoint) try { logger.debug(`X-Com: SendCoinsClient: revertSendCoins with args=`, args) // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data } = await this.client.rawRequest(revertSendCoins, { args }) + const { data } = await this.client.rawRequest(revertSendCoinsQuery, { args }) logger.debug(`X-Com: SendCoinsClient: after revertSendCoins: data=`, data) // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (!data?.revertSendCoins) { @@ -81,12 +81,12 @@ export class SendCoinsClient { } } - settleSendCoins = async (args: SendCoinsArgs): Promise => { + async settleSendCoins(args: SendCoinsArgs): Promise { logger.debug(`X-Com: settleSendCoins against endpoint='${this.endpoint}'...`) try { logger.debug(`X-Com: SendCoinsClient: settleSendCoins with args=`, args) // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data } = await this.client.rawRequest(settleSendCoins, { args }) + const { data } = await this.client.rawRequest(settleSendCoinsQuery, { args }) logger.debug(`X-Com: SendCoinsClient: after settleSendCoins: data=`, data) // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (!data?.settleSendCoins) { @@ -108,12 +108,12 @@ export class SendCoinsClient { } } - revertSettledSendCoins = async (args: SendCoinsArgs): Promise => { + async revertSettledSendCoins(args: SendCoinsArgs): Promise { logger.debug(`X-Com: revertSettledSendCoins against endpoint='${this.endpoint}'...`) try { logger.debug(`X-Com: SendCoinsClient: revertSettledSendCoins with args=`, args) // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { data } = await this.client.rawRequest(revertSettledSendCoins, { args }) + const { data } = await this.client.rawRequest(revertSettledSendCoinsQuery, { args }) logger.debug(`X-Com: SendCoinsClient: after revertSettledSendCoins: data=`, data) // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (!data?.revertSettledSendCoins) { diff --git a/backend/src/graphql/resolver/TransactionResolver.test.ts b/backend/src/graphql/resolver/TransactionResolver.test.ts index 20765e952..e115387cc 100644 --- a/backend/src/graphql/resolver/TransactionResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionResolver.test.ts @@ -1,10 +1,14 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-return */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ import { Connection, In } from '@dbTools/typeorm' import { Community as DbCommunity } from '@entity/Community' import { DltTransaction } from '@entity/DltTransaction' import { Event as DbEvent } from '@entity/Event' +import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity' import { Transaction } from '@entity/Transaction' import { User } from '@entity/User' import { ApolloServerTestClient } from 'apollo-server-testing' @@ -14,6 +18,9 @@ import { cleanDB, testEnvironment } from '@test/helpers' import { logger } from '@test/testSetup' import { EventType } from '@/event/Events' +import { SendCoinsArgs } from '@/federation/client/1_0/model/SendCoinsArgs' +import { SendCoinsResult } from '@/federation/client/1_0/model/SendCoinsResult' +import { SendCoinsClient } from '@/federation/client/1_0/SendCoinsClient' import { userFactory } from '@/seeds/factory/user' import { confirmContribution, @@ -27,6 +34,7 @@ import { bobBaumeister } from '@/seeds/users/bob-baumeister' import { garrickOllivander } from '@/seeds/users/garrick-ollivander' import { peterLustig } from '@/seeds/users/peter-lustig' import { stephenHawking } from '@/seeds/users/stephen-hawking' +import { fullName } from '@/util/utilities' let mutate: ApolloServerTestClient['mutate'], con: Connection let query: ApolloServerTestClient['query'] @@ -47,7 +55,7 @@ beforeAll(async () => { afterAll(async () => { await cleanDB() - await con.close() + await con.destroy() // close() }) let bobData: any @@ -59,6 +67,7 @@ let peter: User let homeCom: DbCommunity let foreignCom: DbCommunity +let fedForeignCom: DbFederatedCommunity describe('send coins', () => { beforeAll(async () => { @@ -67,7 +76,7 @@ describe('send coins', () => { await userFactory(testEnv, stephenHawking) await userFactory(testEnv, garrickOllivander) homeCom = DbCommunity.create() - homeCom.communityUuid = '7f474922-b6d8-4b64-8cd0-ebf0a1d8756e' + homeCom.communityUuid = '7f474922-b6d8-4b64-8cd0-ebf0a1d875aa' homeCom.creationDate = new Date('2000-01-01') homeCom.description = 'homeCom description' homeCom.foreign = false @@ -78,14 +87,15 @@ describe('send coins', () => { homeCom = await DbCommunity.save(homeCom) foreignCom = DbCommunity.create() - foreignCom.communityUuid = '7f474922-b6d8-4b64-8cd0-cea0a1d8756e' + foreignCom.communityUuid = '7f474922-b6d8-4b64-8cd0-cea0a1d875bb' foreignCom.creationDate = new Date('2000-06-06') - foreignCom.description = 'homeCom description' + foreignCom.description = 'foreignCom description' foreignCom.foreign = true foreignCom.name = 'foreignCom name' foreignCom.privateKey = Buffer.from('foreignCom privateKey') foreignCom.publicKey = Buffer.from('foreignCom publicKey') - foreignCom.url = 'foreignCom url' + foreignCom.url = 'foreignCom_url' + foreignCom.authenticatedAt = new Date('2000-06-12') foreignCom = await DbCommunity.save(foreignCom) bobData = { @@ -594,7 +604,45 @@ describe('send coins', () => { }) }) - describe.only('X-Com send coins via gradido ID', () => { + describe('X-Com send coins via gradido ID', () => { + beforeAll(async () => { + fedForeignCom = DbFederatedCommunity.create() + fedForeignCom.apiVersion = '1_0' + fedForeignCom.foreign = true + fedForeignCom.publicKey = Buffer.from('foreignCom publicKey') + fedForeignCom.endPoint = 'http://foreignCom_url/api' + fedForeignCom.lastAnnouncedAt = new Date('2000-06-09') + fedForeignCom.verifiedAt = new Date('2000-06-10') + fedForeignCom = await DbFederatedCommunity.save(fedForeignCom) + + jest + .spyOn(SendCoinsClient.prototype, 'voteForSendCoins') + .mockImplementation(async (args: SendCoinsArgs): Promise => { + // console.log('mock of voteForSendCoins...', args) + return Promise.resolve({ + vote: true, + recipName: fullName(peter.firstName, peter.lastName), + recipGradidoID: args.recipientUserIdentifier, + }) + }) + + jest + .spyOn(SendCoinsClient.prototype, 'settleSendCoins') + .mockImplementation(async (args: SendCoinsArgs): Promise => { + // console.log('mock of settleSendCoins...', args) + return Promise.resolve(true) + }) + + await mutate({ + mutation: login, + variables: bobData, + }) + }) + + afterAll(() => { + jest.clearAllMocks() + }) + it('sends the coins', async () => { await expect( mutate({ diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index a1811daec..990939119 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -38,7 +38,7 @@ import { calculateBalance } from '@/util/validate' import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualTransactions' import { BalanceResolver } from './BalanceResolver' -import { getCommunityName, isCommunityAuthenticated, isHomeCommunity } from './util/communities' +import { isCommunityAuthenticated, isHomeCommunity } from './util/communities' import { findUserByIdentifier } from './util/findUserByIdentifier' import { getLastTransaction } from './util/getLastTransaction' import { getTransactionList } from './util/getTransactionList' @@ -258,7 +258,7 @@ export class TransactionResolver { const remoteUser = new User(null) remoteUser.gradidoID = transaction.linkedUserGradidoID remoteUser.firstName = transaction.linkedUserName - remoteUser.lastName = transaction.linkedUserCommunityUuid + remoteUser.lastName = 'GradidoID: ' + transaction.linkedUserGradidoID involvedRemoteUsers.push(remoteUser) } }) @@ -385,7 +385,7 @@ export class TransactionResolver { { recipientCommunityIdentifier, recipientIdentifier, amount, memo }: TransactionSendArgs, @Ctx() context: Context, ): Promise { - logger.info( + logger.debug( `sendCoins(recipientCommunityIdentifier=${recipientCommunityIdentifier}, recipientIdentifier=${recipientIdentifier}, amount=${amount}, memo=${memo})`, ) const homeCom = await DbCommunity.findOneOrFail({ where: { foreign: false } }) @@ -413,6 +413,7 @@ export class TransactionResolver { const recipCom = await DbCommunity.findOneOrFail({ where: { communityUuid: recipientCommunityIdentifier }, }) + logger.debug('recipient commuity: ', recipCom) let pendingResult: SendCoinsResult let committingResult: SendCoinsResult const creationDate = new Date() @@ -427,7 +428,9 @@ export class TransactionResolver { senderUser, recipientIdentifier, ) + logger.debug('processXComPendingSendCoins result: ', pendingResult) if (pendingResult.vote && pendingResult.recipGradidoID) { + logger.debug('vor processXComCommittingSendCoins... ') committingResult = await processXComCommittingSendCoins( recipCom, homeCom, @@ -437,6 +440,7 @@ export class TransactionResolver { senderUser, pendingResult.recipGradidoID, ) + logger.debug('processXComCommittingSendCoins result: ', committingResult) if (!committingResult.vote) { logger.fatal('FATAL ERROR: on processXComCommittingSendCoins for', committingResult) throw new LogError( diff --git a/backend/src/graphql/resolver/util/processXComSendCoins.ts b/backend/src/graphql/resolver/util/processXComSendCoins.ts index d51d75156..10efe2736 100644 --- a/backend/src/graphql/resolver/util/processXComSendCoins.ts +++ b/backend/src/graphql/resolver/util/processXComSendCoins.ts @@ -87,7 +87,7 @@ export async function processXComPendingSendCoins( args.senderUserName = fullName(sender.firstName, sender.lastName) logger.debug(`X-Com: ready for voteForSendCoins with args=`, args) voteResult = await client.voteForSendCoins(args) - logger.debug(`X-Com: returnd from voteForSendCoins:`, voteResult) + logger.debug(`X-Com: returned from voteForSendCoins:`, voteResult) if (voteResult.vote) { logger.debug(`X-Com: prepare pendingTransaction for sender...`) // writing the pending transaction on receiver-side was successfull, so now write the sender side @@ -138,7 +138,7 @@ export async function processXComPendingSendCoins( } logger.debug(`voteForSendCoins()-1_0... successfull`) } else { - logger.debug( + logger.error( `X-Com: break with error on writing pendingTransaction for recipient...`, voteResult, )