From 68c6b519e881c7acb11b19dc04d5a39c2ac38ebd Mon Sep 17 00:00:00 2001 From: Pranav Chatur Date: Sat, 25 Jan 2025 12:49:06 +0100 Subject: [PATCH] Add test cases for RecipientStatsCalculator --- .../stats/RecipientStatsCalculator.test.ts | 87 +++++++++++++++++++ .../utils/stats/RecipientStatsCalculator.ts | 4 +- 2 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 shared/src/utils/stats/RecipientStatsCalculator.test.ts diff --git a/shared/src/utils/stats/RecipientStatsCalculator.test.ts b/shared/src/utils/stats/RecipientStatsCalculator.test.ts new file mode 100644 index 000000000..a1176bdcc --- /dev/null +++ b/shared/src/utils/stats/RecipientStatsCalculator.test.ts @@ -0,0 +1,87 @@ +import { DocumentReference, Timestamp } from 'firebase-admin/firestore'; +import functions from 'firebase-functions-test'; +import { FirestoreAdmin } from '../../firebase/admin/FirestoreAdmin'; +import { getOrInitializeFirebaseAdmin } from '../../firebase/admin/app'; +import { PARTNER_ORGANISATION_FIRESTORE_PATH, PartnerOrganisation } from '../../types/partner-organisation'; +import { + RECIPIENT_FIRESTORE_PATH, + Recipient, + RecipientMainLanguage, + RecipientProgramStatus, +} from '../../types/recipient'; +import { RecipientStatsCalculator } from './RecipientStatsCalculator'; + +const projectId = 'contribution-stats-calculator-test'; +const testEnv = functions({ projectId: projectId }); +const firestoreAdmin = new FirestoreAdmin(getOrInitializeFirebaseAdmin({ projectId: projectId })); +let calculator: RecipientStatsCalculator; + +beforeAll(async () => { + await testEnv.firestore.clearFirestoreData({ projectId: projectId }); + await insertTestData(); + calculator = await RecipientStatsCalculator.build(firestoreAdmin); +}); + +test('totalRecipients(): Calculate total recipients', async () => { + expect(calculator.allStats().totalRecipients.total).toEqual(1); +}); + +test('totalRecipients(): Calculate active recipients', async () => { + expect(calculator.allStats().totalRecipients.active).toEqual(1); +}); + +test('totalRecipientsByOrganization(): Calculate total recipients for a particular organisation', async () => { + expect(calculator.allStats('socialincome').totalRecipientsByOrganization.total).toEqual(1); +}); + +test('totalRecipientsByOrganization(): Calculate active recipients for a particular organisation', async () => { + expect(calculator.allStats('socialincome').totalRecipientsByOrganization.active).toEqual(1); +}); + +const org1: PartnerOrganisation = { + name: 'socialincome', + contactName: 'test1', + contactNumber: '123', +}; + +const recipient1: Recipient = { + birth_date: new Date('1990-05-15'), + calling_name: 'John', + communication_mobile_phone: { + phone: 1234567890, + has_whatsapp: true, + whatsapp_activated: true, + }, + email: 'john.doe@example.com', + first_name: 'John', + gender: 'male', + insta_handle: '@john_doe', + last_name: 'Doe', + main_language: RecipientMainLanguage.English, + mobile_money_phone: { + phone: 9876543210, + has_whatsapp: true, + }, + organisation: { id: 'socialincome' } as DocumentReference, + om_uid: 12345, + profession: 'Software Engineer', + progr_status: RecipientProgramStatus.Active, + si_start_date: new Timestamp(1609459200, 0), + test_recipient: false, + twitter_handle: '@john_doe_tech', + successor: 'Jane Doe', +}; + +const insertTestData = async () => { + await firestoreAdmin + .collection(PARTNER_ORGANISATION_FIRESTORE_PATH) + .doc('socialincome') + .set(org1); + const recipientWithOrgRef: Recipient = { + ...recipient1, + organisation: firestoreAdmin + .collection(PARTNER_ORGANISATION_FIRESTORE_PATH) + .doc('socialincome') as DocumentReference, + }; + await firestoreAdmin.collection(RECIPIENT_FIRESTORE_PATH).add(recipientWithOrgRef); +}; diff --git a/shared/src/utils/stats/RecipientStatsCalculator.ts b/shared/src/utils/stats/RecipientStatsCalculator.ts index 8a3877c78..3ab63e98c 100644 --- a/shared/src/utils/stats/RecipientStatsCalculator.ts +++ b/shared/src/utils/stats/RecipientStatsCalculator.ts @@ -34,10 +34,10 @@ export class RecipientStatsCalculator { const completeRecipientsData = await firestoreAdmin.collection(RECIPIENT_FIRESTORE_PATH).get(); const recipientStatsEntries = await Promise.all( completeRecipientsData.docs.map(async (recipientData) => { - const organisationSnapshot = await recipientData.data().organisation.get(); + const organisationSnapshot = await recipientData.data().organisation?.get(); return { progr_status: recipientData.data().progr_status, - organisation: organisationSnapshot.id, + organisation: organisationSnapshot?.id, test_recipient: recipientData.data().test_recipient ?? false, }; }),