const { expect } = require('chai'); import { startOfDay, subDays, addDays } from 'date-fns'; const { Suspension } = require('../../../src/models/suspension'); describe('Suspension', () => { let item: any; let suspension: any; beforeEach(() => { item = { suspensionId: 'suspensionId', subscriptionNumber: 'suspensionNumber', startDate: subDays(new Date(), 3), endDate: addDays(new Date(), 3), credits: 4, editions: 4, }; suspension = new Suspension(item); }); describe('on initialisation', () => { it('sets suspension.id', () => { expect(suspension.id).to.equal(item.suspensionId); }); it('sets suspension.subscriptionNumber', () => { expect(suspension.subscriptionNumber).to.equal(item.subscriptionNumber); }); it('sets suspension.startDate', () => { expect(suspension.startDate).to.equal(item.startDate); }); it('sets suspension.endDate', () => { expect(suspension.endDate).to.equal(item.endDate); }); it('sets suspension.credits', () => { expect(suspension.credits).to.equal(item.credits); }); it('sets suspension.editions', () => { expect(suspension.editions).to.equal(item.editions); }); it('suspension.isActive is TRUE', () => { expect(suspension.isActive).to.be.true; }); it('suspension.isFuture is FALSE', () => { expect(suspension.isFuture).to.be.false; }); it('suspension.hasPast is FALSE', () => { expect(suspension.hasPast).to.be.false; }); }); describe('isActive', () => { let item: any; beforeEach(() => { item = {}; }); it('returns TRUE when suspension end date is in the future and start date is in the past', () => { item.startDate = '2019-09-17'; item.endDate = '2019-09-19'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isActive).to.be.true; }); it('returns TRUE when suspension end date is today and start date is in the past', () => { item.startDate = '2019-09-17'; item.endDate = '2019-09-18'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isActive).to.be.true; }); it('returns TRUE when suspension end date is in the future and start date is today', () => { item.startDate = '2019-09-18'; item.endDate = '2019-09-19'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isActive).to.be.true; }); it('returns TRUE when suspension end date and start date is today', () => { item.startDate = '2019-09-18'; item.endDate = '2019-09-18'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isActive).to.be.true; }); it('returns FALSE when suspension is in the past', () => { item.startDate = '2019-09-15'; item.endDate = '2019-09-17'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isActive).to.be.false; }); it('returns FALSE when suspension is in the future', () => { item.startDate = '2019-09-19'; item.endDate = '2019-09-23'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isActive).to.be.false; }); }); describe('isFuture', () => { let item: any; beforeEach(() => { item = {}; }); it('returns TRUE when suspension is in the future', () => { item.startDate = '2019-09-19'; item.endDate = '2019-09-23'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isFuture).to.be.true; }); it('returns FALSE when suspension is in the past', () => { item.startDate = '2019-09-15'; item.endDate = '2019-09-17'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.isFuture).to.be.false; }); it('returns FALSE when suspension is active', () => { item.startDate = '2019-09-17'; item.endDate = '2019-09-19'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); suspension.startDate = startOfDay(new Date()); expect(suspension.isFuture).to.be.false; }); }); describe('hasPast', () => { let item: any; beforeEach(() => { item = {}; }); it('returns TRUE when suspension is in the past', () => { item.startDate = '2019-09-15'; item.endDate = '2019-09-17'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.hasPast).to.be.true; }); it('returns FALSE when suspension is active', () => { item.startDate = '2019-09-17'; item.endDate = '2019-09-19'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); suspension.startDate = startOfDay(new Date()); expect(suspension.hasPast).to.be.false; }); it('returns FALSE when suspension is in the future', () => { item.startDate = '2019-09-19'; item.endDate = '2019-09-23'; const suspension = new Suspension(item); suspension.todaysDate = startOfDay(new Date('2019-09-18')); expect(suspension.hasPast).to.be.false; }); }); describe('canEndActiveSuspension', () => { it('returns TRUE when the first suspension date is less than the suspension end date', () => { const firstSuspensionDate = subDays(suspension.endDateStartOfDay, 1); expect(suspension.canEndActiveSuspension(firstSuspensionDate)).to.be.true; }); it('returns FALSE when the first suspension date is more than the suspension end date', () => { const firstSuspensionDate = addDays(suspension.endDateStartOfDay, 1); expect(suspension.canEndActiveSuspension(firstSuspensionDate)).to.be.false; }); it('returns FALSE when the first suspension date is equal to the suspension end date', () => { expect(suspension.canEndActiveSuspension(suspension.endDateStartOfDay)).to.be.false; }); it('returns FALSE if there is no active suspension', () => { // The only suspension is in the future suspension.endDateStartOfDay = addDays(new Date(), 3); suspension.startDateStartOfDay = addDays(new Date(), 5); expect(suspension.canEndActiveSuspension('2019-09-21')).to.be.false; }); }); describe('canDeleteFutureSuspension', () => { let item: any; let suspension: any; beforeEach(() => { item = { suspensionId: 'suspensionId', subscriptionNumber: 'suspensionNumber', startDate: addDays(new Date(), 1), endDate: addDays(new Date(), 3), credits: 4, editions: 4, }; suspension = new Suspension(item); }); it('returns TRUE when the first suspension date is before the suspension start date', () => { const firstSuspensionDate = subDays(suspension.startDateStartOfDay, 1); expect(suspension.canDeleteFutureSuspension(firstSuspensionDate)).to.be.true; }); it('returns FALSE when the first suspension date is after the suspension start date', () => { const firstSuspensionDate = addDays(suspension.startDateStartOfDay, 1); expect(suspension.canDeleteFutureSuspension(firstSuspensionDate)).to.be.false; }); it('returns TRUE when the first suspension date is equal to the suspension start date', () => { expect(suspension.canDeleteFutureSuspension(suspension.startDateStartOfDay)).to.be.true; }); it('returns FALSE if there is no future suspension', () => { // The only suspension is in the past suspension.endDateStartOfDay = subDays(new Date(), 3); suspension.startDateStartOfDay = subDays(new Date(), 5); expect(suspension.canDeleteFutureSuspension('2019-09-21')).to.be.false; }); }); describe('canEndFutureSuspension', () => { let item: any; let suspension: any; beforeEach(() => { item = { suspensionId: 'suspensionId', subscriptionNumber: 'suspensionNumber', credits: 4, editions: 4, }; suspension = new Suspension(item); }); it('returns FALSE when the suspension can be deleted', () => { const firstSuspensionDate = addDays(new Date(), 2); suspension.startDate = addDays(new Date(), 26); suspension.startDateStartOfDay = startOfDay(addDays(new Date(), 26)); suspension.endDate = addDays(new Date(), 30); suspension.endDateStartOfDay = startOfDay(addDays(new Date(), 30)); expect(suspension.canEndFutureSuspension(firstSuspensionDate)).to.be.false; }); it('returns FALSE when the start date is the same as firstPossibleSuspension date', () => { const firstSuspensionDate = addDays(new Date(), 2); suspension.startDate = addDays(new Date(), 2); suspension.startDateStartOfDay = startOfDay(addDays(new Date(), 2)); suspension.endDate = addDays(new Date(), 4); suspension.endDateStartOfDay = startOfDay(addDays(new Date(), 4)); expect(suspension.canEndFutureSuspension(firstSuspensionDate)).to.be.false; }); it('returns TRUE when the suspension has started (the print data for its start date has already been generated) but ends after the LDD', () => { const firstSuspensionDate = addDays(new Date(), 2); suspension.startDate = addDays(new Date(), 1); suspension.startDateStartOfDay = startOfDay(addDays(new Date(), 1)); suspension.endDate = addDays(new Date(), 5); suspension.endDateStartOfDay = addDays(new Date(), 5); expect(suspension.canEndFutureSuspension(firstSuspensionDate)).to.be.true; }); it('returns FALSE when a one day suspension has started (the print data for its start date has already been generated)', () => { const firstSuspensionDate = addDays(new Date(), 2); suspension.startDate = addDays(new Date(), 1); suspension.startDateStartOfDay = startOfDay(addDays(new Date(), 1)); suspension.endDate = addDays(new Date(), 1); suspension.endDateStartOfDay = addDays(new Date(), 1); expect(suspension.canEndFutureSuspension(firstSuspensionDate)).to.be.false; }); it('returns FALSE when a suspension is over a longer non-publishing period', () => { const firstSuspensionDate = addDays(new Date(), 8); suspension.startDate = addDays(new Date(), 3); suspension.startDateStartOfDay = startOfDay(addDays(new Date(), 3)); suspension.endDate = addDays(new Date(), 6); suspension.endDateStartOfDay = addDays(new Date(), 6); expect(suspension.canEndFutureSuspension(firstSuspensionDate)).to.be.false; }); }); });