import { Test, TestingModule } from '@nestjs/testing' import { LanguageCountryCode } from '../../../utils/countries' import { Competition, Patient } from '../../../models' import { MockedModule } from '../../../../test/types' import { factory } from '../../../../test/factories' import { NotificationService } from '../notification.service' import { AwsService } from '../../aws/aws.service' import { Push } from '../../../typings/global' import { TranslateNotificationServiceHelper } from '../i18n' import { RankingNotificationService } from './ranking_notification.service' describe('RankingNotificationService', () => { let subject: RankingNotificationService let notificationService: NotificationService let awsService: MockedModule const translateNotificationServiceHelper = new TranslateNotificationServiceHelper() beforeAll(async () => { notificationService = new NotificationService() awsService = { sendSQS: jest.fn(), } const app: TestingModule = await Test.createTestingModule({ controllers: [], providers: [ { provide: NotificationService, useValue: notificationService, }, { provide: AwsService, useValue: awsService, }, { provide: TranslateNotificationServiceHelper, useValue: translateNotificationServiceHelper, }, RankingNotificationService, ], }).compile() subject = app.get(RankingNotificationService) }) afterEach(() => { jest.clearAllMocks() }) afterAll(() => { jest.restoreAllMocks() }) describe('#sendNotificaton', () => { global.secret = { push_notifications: { ranking_invite_accepted_msg: { pt_BR: { title: 'Convite aceito!', body: 'Seu amigo aceitou participar da competição. Acesse o app e confira a seção do ranking', page: '/ranking', }, es_MX: { title: 'Convite aceito!', body: 'Seu amigo aceitou participar da competição. Acesse o app e confira a seção do ranking', page: '/ranking', }, }, }, } as any global.secret.push_notifications.ranking_friend_did_bio_msg = { pt_BR: { title: 'Não fique para trás!', body: 'Um competidor acaba de fazer uma bio.! E aí, vai ficar para trás? Faça um novo exame agora mesmo!', page: '/ranking', }, es_MX: { title: 'Não fique para trás!', body: 'Um competidor acaba de fazer uma bio.! E aí, vai ficar para trás? Faça um novo exame agora mesmo!', page: '/ranking', }, } as any global.secret.push_notifications.ranking_finished_won_msg = { pt_BR: { title: 'Competição finalizada!', body: 'Sua competição chegou ao fim. Acesse já e confira quem foi o vencedor.', page: '/ranking/won/{{competition_id}}', }, es_MX: { title: 'Competição finalizada!', body: 'Sua competição chegou ao fim. Acesse já e confira quem foi o vencedor.', page: '/ranking/won/{{competition_id}}', }, } as any global.secret.push_notifications.ranking_finished_lose_msg = { pt_BR: { title: 'Competição finalizada!', body: 'Sua competição chegou ao fim. Acesse já e confira quem foi o vencedor.', page: '/ranking/lost', }, es_MX: { title: 'Competição finalizada!', body: 'Sua competição chegou ao fim. Acesse já e confira quem foi o vencedor.', page: '/ranking/lost', }, } as any let patient: Patient let competition: Competition let expectedNotification: any describe('when frient accepted invite', () => { beforeEach(async () => { patient = await factory.build('patient') competition = await factory.build('competition') patient.country_code = LanguageCountryCode.PT_BR }) it('send invite accepted push', async () => { expectedNotification = { QueueUrl: undefined, DelaySeconds: 0, MessageBody: JSON.stringify({ msg: (global.secret.push_notifications.ranking_invite_accepted_msg.pt_BR as Push).body, type: 'push', additional_data: { document_number: patient.document_number, email: patient.email, patient_id: patient.id, device_id: patient.device_id, country_code: LanguageCountryCode.PT_BR, cell_phone: patient.cell_phone, winner: false, competition_id: competition.id, flutter_page: (global.secret.push_notifications.ranking_invite_accepted_msg.pt_BR as Push).page, }, }), } await subject.send(patient, 'ranking_invite_accepted_push', competition) expect(awsService.sendSQS).toBeCalledWith(expectedNotification) }) it('send friend did bio push', async () => { expectedNotification = { QueueUrl: undefined, DelaySeconds: 0, MessageBody: JSON.stringify({ msg: (global.secret.push_notifications.ranking_friend_did_bio_msg.pt_BR as Push).body, type: 'push', additional_data: { document_number: patient.document_number, email: patient.email, patient_id: patient.id, device_id: patient.device_id, country_code: LanguageCountryCode.PT_BR, cell_phone: patient.cell_phone, winner: false, competition_id: competition.id, flutter_page: (global.secret.push_notifications.ranking_friend_did_bio_msg.pt_BR as Push).page, }, }), } await subject.send(patient, 'ranking_friend_did_bio_push', competition) expect(awsService.sendSQS).toBeCalledWith(expectedNotification) }) it('send finished ranking to winner push', async () => { competition.winner_id = patient.id expectedNotification = { QueueUrl: undefined, DelaySeconds: 0, MessageBody: JSON.stringify({ msg: (global.secret.push_notifications.ranking_finished_won_msg.pt_BR as Push).body, type: 'push', additional_data: { document_number: patient.document_number, email: patient.email, patient_id: patient.id, device_id: patient.device_id, country_code: LanguageCountryCode.PT_BR, cell_phone: patient.cell_phone, winner: true, competition_id: competition.id, flutter_page: (global.secret.push_notifications.ranking_finished_won_msg.pt_BR as Push).page.replace( '{{competition_id}}', competition.id, ), }, }), } await subject.send(patient, 'ranking_finished_won_push', competition) expect(awsService.sendSQS).toBeCalledWith(expectedNotification) }) it('send finished ranking to looser push', async () => { expectedNotification = { QueueUrl: undefined, DelaySeconds: 0, MessageBody: JSON.stringify({ msg: (global.secret.push_notifications.ranking_finished_lose_msg.pt_BR as Push).body, type: 'push', additional_data: { document_number: patient.document_number, email: patient.email, patient_id: patient.id, device_id: patient.device_id, country_code: LanguageCountryCode.PT_BR, cell_phone: patient.cell_phone, winner: false, competition_id: competition.id, flutter_page: (global.secret.push_notifications.ranking_finished_lose_msg.pt_BR as Push).page, }, }), } await subject.send(patient, 'ranking_finished_lose_push', competition) expect(awsService.sendSQS).toBeCalledWith(expectedNotification) }) }) }) })