diff --git a/src/resolvers/donationResolver.test.ts b/src/resolvers/donationResolver.test.ts index 39eed727b..a9e963460 100644 --- a/src/resolvers/donationResolver.test.ts +++ b/src/resolvers/donationResolver.test.ts @@ -657,6 +657,74 @@ function donationsTestCases() { allDonationsCount, ); }); + it('should get result with recurring donations joined (for streamed mini donations)', async () => { + const project = await saveProjectDirectlyToDb(createProjectData()); + const user = await saveUserDirectlyToDb(generateRandomEtheriumAddress()); + + const anchorAddress = generateRandomEtheriumAddress(); + + const anchorContractAddress = await addNewAnchorAddress({ + project, + owner: user, + creator: user, + address: anchorAddress, + networkId: NETWORK_IDS.OPTIMISTIC, + txHash: generateRandomEvmTxHash(), + }); + const currency = 'USD'; + + const recurringDonation = await createNewRecurringDonation({ + txHash: generateRandomEvmTxHash(), + networkId: NETWORK_IDS.OPTIMISTIC, + donor: user, + anchorContractAddress, + flowRate: '100', + currency, + project, + anonymous: false, + isBatch: false, + totalUsdStreamed: 1, + }); + recurringDonation.status = RECURRING_DONATION_STATUS.ACTIVE; + await recurringDonation.save(); + const donation = await saveDonationDirectlyToDb( + { + ...createDonationData(), + }, + user.id, + project.id, + ); + donation.recurringDonation = recurringDonation; + await donation.save(); + + // Use moment to parse the createdAt string + const momentDate = moment(donation.createdAt, 'YYYYMMDD HH:mm:ss'); + + // Create fromDate as one second before + const fromDate = momentDate + .clone() + .subtract(1, 'seconds') + .format('YYYYMMDD HH:mm:ss'); + + // Create toDate as one second after + const toDate = momentDate + .clone() + .add(1, 'seconds') + .format('YYYYMMDD HH:mm:ss'); + const donationsResponse = await axios.post(graphqlUrl, { + query: fetchAllDonationsQuery, + variables: { + fromDate, + toDate, + }, + }); + assert.isOk(donationsResponse.data.data.donations); + assert.equal(donationsResponse.data.data.donations.length, 1); + assert.equal( + Number(donationsResponse.data.data.donations[0].recurringDonation.id), + recurringDonation.id, + ); + }); it('should get result when sending fromDate', async () => { const oldDonation = await saveDonationDirectlyToDb( createDonationData(), @@ -817,6 +885,16 @@ function donationsTestCases() { assert.isArray(donation.project.categories); }); }); + it('should project include categories', async () => { + const donationsResponse = await axios.post(graphqlUrl, { + query: fetchAllDonationsQuery, + variables: {}, + }); + assert.isOk(donationsResponse.data.data.donations); + donationsResponse.data.data.donations.forEach(donation => { + assert.isArray(donation.project.categories); + }); + }); } function createDonationTestCases() { diff --git a/src/resolvers/donationResolver.ts b/src/resolvers/donationResolver.ts index 57c665513..ae61d40ba 100644 --- a/src/resolvers/donationResolver.ts +++ b/src/resolvers/donationResolver.ts @@ -237,6 +237,7 @@ export class DonationResolver { .leftJoin('donation.user', 'user') .addSelect(publicSelectionFields) .leftJoinAndSelect('donation.project', 'project') + .leftJoinAndSelect('donation.recurringDonation', 'recurringDonation') .leftJoinAndSelect('project.categories', 'categories') .leftJoin('project.projectPower', 'projectPower') .addSelect([ diff --git a/test/graphqlQueries.ts b/test/graphqlQueries.ts index 3e9146d6a..9b8c288aa 100644 --- a/test/graphqlQueries.ts +++ b/test/graphqlQueries.ts @@ -672,6 +672,10 @@ export const fetchAllDonationsQuery = ` anonymous valueUsd amount + recurringDonation{ + id + txHash + } user { id walletAddress