import { GCMockModule } from '@core/mocks/gc-module.mock'; import { Spec, TestCase } from '@yourcause/test-decorators'; import { DescribeAngularService } from '@yourcause/test-decorators/angular'; import { expect } from 'chai'; import { mockTokenResponse } from './token-test-helpers.mock'; import { TokenTimeoutService } from './token-timeout.service'; @DescribeAngularService(TokenTimeoutService, { imports: [GCMockModule] }) export class TokenTimeoutServiceSpec implements Spec { private dateOffset = 30999; @TestCase('should be able to calculate time remaining') testShouldCalculateTimeRemaining (service: TokenTimeoutService) { const token = mockTokenResponse( {}, new Date(Date.now() + (this.dateOffset)), new Date(Date.now() + (this.dateOffset)) ); service['tokenStorage'].jwt = token; service['calculateTimeRemaining'](); const timeRemainingInSeconds = service['_timeRemaining$'].value; expect(timeRemainingInSeconds).to.equal(30); } @TestCase('should be able to count down time remaining') async testShouldCountDown (service: TokenTimeoutService) { service['loopDuration'] = 10; let timeRemaining = 30; service['_timeRemaining$'].next(timeRemaining); service['calculateTimeRemaining'] = () => { service['_timeRemaining$'].next(--timeRemaining); }; expect(service['_timeRemaining$'].value).to.equal(30); service.start(); expect(service['_timeRemaining$'].value).to.equal(29); await new Promise((r) => setTimeout(() => r(), 10)); expect(service['_timeRemaining$'].value).to.equal(28); await new Promise((r) => setTimeout(() => r(), 10)); expect(service['_timeRemaining$'].value).to.equal(27); service.stop(); } }