import { TicketState } from '../src/enums/ticket-state'; import { TicketDto } from '../src/interfaces/ticket/ticket.dto'; import { getTicketInformation } from '../src/utils/information'; import { TICKET_ABONNEMENT_ANNUEL_MOINS_26_ANS, TICKET_ABONNEMENT_MENSUEL_MOINS_26_ANS_OCTOBRE, TICKET_UNITAIRE_MULHOUSE, VALIDATION_STATE_VALID, } from './test-config'; describe('Ticket Information', () => { beforeAll(async () => { jest .spyOn(global.Date, 'now') .mockImplementation(() => new Date('2022-09-30 16:30:00').valueOf()); }); it('Completed because ticket expired (dateUntil AND validUntil validation expired)', () => { const expiredDate = new Date('2022-09-30 16:00:00'); const firstValidation = { ...VALIDATION_STATE_VALID, createdAt: new Date('2022-09-30 16:30:00'), validUntil: expiredDate, }; const completedTicket = { ...TICKET_UNITAIRE_MULHOUSE, dateUntil: expiredDate, firstValidation, lastValidation: firstValidation, }; const information = getTicketInformation(completedTicket as unknown as TicketDto); expect(information.expireAt).toEqual(expiredDate); expect(information.state).toEqual(TicketState.COMPLETED); }); it('Uncomposted | Yearly subscription ticket', () => { const information = getTicketInformation( TICKET_ABONNEMENT_ANNUEL_MOINS_26_ANS as unknown as TicketDto, ); expect(information.expireAt).toEqual(TICKET_ABONNEMENT_ANNUEL_MOINS_26_ANS.dateUntil); expect(information.countdown).toBeUndefined(); expect(information.state).toEqual(TicketState.UNCOMPOSTED); }); it('Under validation Ticket', () => { const date = new Date('2022-09-30 17:00:00'); const dateUntil = new Date('2022-09-30 17:30:00'); const firstValidation = { ...VALIDATION_STATE_VALID, createdAt: date, validUntil: date, }; const ticketUnderValidation = { ...TICKET_UNITAIRE_MULHOUSE, firstValidation, lastValidation: firstValidation, lastValidValidation: firstValidation, dateUntil, }; const information = getTicketInformation(ticketUnderValidation as unknown as TicketDto); expect(information.countdown).toBeLessThanOrEqual(3600); expect(information.expireAt).toEqual(dateUntil); expect(information.state).toEqual(TicketState.UNDER_VALIDATION); }); it('Completed | 1 hour journey ticket', () => { const expiredDate = new Date('2022-09-30 15:30:00'); const ticketCompleted = { ...TICKET_UNITAIRE_MULHOUSE, dateFrom: new Date('2022-09-30 14:30:00'), dateUntil: expiredDate, firstValidation: { validUntil: expiredDate, }, }; const information = getTicketInformation(ticketCompleted as unknown as TicketDto); expect(information.countdown).toBe(0); expect(information.expireAt?.toISOString()).toEqual(expiredDate.toISOString()); expect(information.state).toEqual(TicketState.COMPLETED); }); it('Completed | Monthly subscription ticket', () => { const untilDate = new Date('2022-09-01 00:00:00'); const ticketAbonnementAout = { ...TICKET_ABONNEMENT_MENSUEL_MOINS_26_ANS_OCTOBRE, dateFrom: new Date('2022-08-01 00:00:00'), dateUntil: untilDate, service: TICKET_UNITAIRE_MULHOUSE.service.id, firstValidation: { validUntil: untilDate, }, }; const information = getTicketInformation(ticketAbonnementAout as unknown as TicketDto); expect(information.countdown).toBe(0); expect(information.state).toEqual('completed'); expect(information.expireAt).toEqual(ticketAbonnementAout.dateUntil); }); it('under-validation | 1 hour journey ticket', () => { const untilDate = new Date('2022-09-30 17:00:00'); const validation = { ...VALIDATION_STATE_VALID, validUntil: untilDate, createdAt: new Date('2022-09-30 16:00:00'), }; const ticket = { ...TICKET_UNITAIRE_MULHOUSE, dateFrom: new Date('2022-09-30 16:00:00'), dateUntil: untilDate, firstValidation: validation, lastValidation: validation, lastValidValidation: validation, service: TICKET_UNITAIRE_MULHOUSE.service.id, }; const information = getTicketInformation(ticket as unknown as TicketDto); expect(information.countdown).toBeLessThanOrEqual(3600); expect(information.state).toEqual('under-validation'); expect(information.expireAt).toEqual(ticket.dateUntil); }); it('Uncomposted | Monthly subscription ticket (no validation yet)', () => { const untilDate = new Date('2022-10-01 00:00:00'); const validation = { ...VALIDATION_STATE_VALID, validUntil: untilDate, createdAt: new Date('2022-09-30 16:00:00'), }; const ticketAbonnementSeptembre = { ...TICKET_ABONNEMENT_MENSUEL_MOINS_26_ANS_OCTOBRE, dateFrom: new Date('2022-09-01 00:00:00'), dateUntil: untilDate, service: TICKET_UNITAIRE_MULHOUSE.service.id, }; const information = getTicketInformation(ticketAbonnementSeptembre as unknown as TicketDto); expect(information.countdown).toBeLessThanOrEqual(27_500); expect(information.countdown).toBeGreaterThanOrEqual(26_500); expect(information.state).toEqual('uncomposted'); expect(information.expireAt).toEqual(ticketAbonnementSeptembre.dateUntil); }); it('Coming-soon | Monthly subcription ticket (no validation yet)', () => { const ticket = { ...TICKET_ABONNEMENT_MENSUEL_MOINS_26_ANS_OCTOBRE, service: TICKET_ABONNEMENT_MENSUEL_MOINS_26_ANS_OCTOBRE.service.id, }; const information = getTicketInformation(ticket as unknown as TicketDto); // coutdown expiration in more than one month (end of october) // Between 09-30 16:30 and 10-31 00:00 there are 31 days and 7 hours 30 minutes = 2,705,400 seconds expect(information.countdown).toBeLessThanOrEqual(2_713_000); expect(information.countdown).toBeGreaterThanOrEqual(2_678_400); expect(information.state).toEqual('coming-soon'); expect(information.expireAt).toEqual(TICKET_ABONNEMENT_MENSUEL_MOINS_26_ANS_OCTOBRE.dateUntil); }); });