I'm unable to mock the Firebase Messaging functions in Typescript for Firebase Cloud Functions. I'm using firebase-functions-test Companion SDK to build Online Tests as mentioned in the docs. I'm using jest mocks to mock the admin.messaging().sendToDevice function.
const fcmMock = jest.spyOn(admin.messaging(),'sendToDevice');
fcmMock.mockImplementation(async (registrationToken: string | string[], payload: admin.messaging.MessagingPayload, options?: admin.messaging.MessagingOptions)=>{
console.log('FCM Mock called with message: '+payload.notification+'\nToken ids:'+registrationToken);
return new Promise<admin.messaging.MessagingDevicesResponse>(undefined);
});
Running this gets the following error because the return type object MessagingDevicesResponse>(undefined) requires a complex argument:
Argument of type 'undefined' is not assignable to parameter of type '(resolve: (value?: MessagingDevicesResponse | PromiseLike | undefined) => void, reject: (reason?: any) => void) => void'.
The code I'm going to test:
export async function cleanupToken(response: admin.messaging.MessagingDevicesResponse, userDataSnapshot:FirebaseFirestore.DocumentSnapshot) {
// For each notification we check if there was an error.
if(response.results.length>0){
const error = response.results[0].error;
if (error) {
// Cleanup the tokens who are not registered anymore.
// Error Codes: https://firebase.google.com/docs/cloud-messaging/send-message#admin_sdk_error_reference
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
// Some Logic here to cleanup the token and mark the user
}
}
}
}
}
looking at your code there are a few things missing/incorrect:
pass in mock objects, in this case response and snapshot
you dont return a promise in a jest test case, instead you use the jest test method (in this case expect).
Normally the jest test (expect in this case) can be done in the function but we are doing it in the response since that is the callback hence it takes place right at the end.
You test case should look something like this: