import { SwitchController } from './Switch'; import { QuoteService } from '../common/services/QuoteService'; import { AcquisitionService } from '../common/services/AcquisitionService'; import { AnalyticsService } from '../common/services/AnalyticsService'; import { EligibilityService } from '../common/services/EligibilityService'; import { PropertyQuestionsService } from '../common/services/PropertyQuestionsService'; import { UserDataState } from '../common/state/UserDataState'; import { AgentState } from '../common/state/AgentState'; import { LayoutState } from '../common/state/LayoutState'; import { ModalService } from '../common/services/ModalService'; import { Mock, IMock, It, Times } from 'typemoq'; import { HostExtractor } from '../common/util/HostExtractor'; import { ErrorScroll } from '../common/util/ErrorScroll'; import { QuoteWithMeters } from '../common/entities/Quote'; import { ServiceError } from '../common/entities/ServiceError'; import { quoteWithMeters} from '../common/entities/Quote.fixture'; import { appConfig } from '../common/entities/AppConfig.fixture'; import { expect } from 'chai'; import { LocalDate } from "js-joda"; import { SuccessState } from '../common/entities/SuccessState'; describe('Switch controller', () => { let quoteService: IMock, acquisitionService: IMock, hostExtractor: IMock, errorScroll: IMock, $state: IMock, modal: IMock, userDataState: UserDataState, agentState: AgentState, layoutState: LayoutState, analyticsService: IMock, eligibilityService: IMock, propertyQuestionsService: IMock; beforeEach(() => { quoteService = Mock.ofType(); acquisitionService = Mock.ofType(); $state = Mock.ofType(); hostExtractor = Mock.ofType(); errorScroll = Mock.ofType(); modal = Mock.ofType(); userDataState = { quoteType: 'MoveIn' } as UserDataState; agentState = new AgentState(); layoutState = new LayoutState(); analyticsService = Mock.ofType(); eligibilityService = Mock.ofType(); propertyQuestionsService = Mock.ofType(); }); function newController() { return new SwitchController(quoteService.object, acquisitionService.object, userDataState, agentState, layoutState, $state.object, hostExtractor.object, errorScroll.object, modal.object, analyticsService.object, appConfig, eligibilityService.object, propertyQuestionsService.object); } it('should navigate to get quote page if quote doesn\'t exist', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.reject("error")); return ctrl.$onInit().then(() => $state.verify(x => x.go(It.isValue("^.get-quote")), Times.once()) ); }); it('should navigate to quote page if tariff is not in the quote', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); return ctrl.$onInit().then(() => $state.verify(x => x.go(It.isValue("^.quote")), Times.once()) ); }); it('should set up the tariff data', () => { const ctrl = newController(); userDataState.tariffId = 'Fixed'; quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); return ctrl.$onInit().then(() => expect(ctrl.tariff.name).to.equal('Better Energy') ); }); it('should navigate to the bank details form', () => { const ctrl = newController(); ctrl.personalDetailsForm = { $valid: true } as ng.IFormController; ctrl.submitPersonalDetails(); expect(ctrl.step).to.equal('BankDetails'); }); it('should navigate to the meter details form if it is move in', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); ctrl.$onInit().then(() => { ctrl.personalDetailsForm = {$valid: true} as ng.IFormController; ctrl.submitPersonalDetails(); ctrl.bankDetailsForm = {$valid: true} as ng.IFormController; ctrl.submitBankDetails(); expect(ctrl.step).to.equal('MeterDetails'); }); }); it('should submit an acquisition', () => { const ctrl = newController(); ctrl.showMeterReadingForm = false; quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); acquisitionService.setup(x => x.acquisition(It.isAny(), It.isAny())).returns(() => Promise.resolve({} as SuccessState)) ctrl.$onInit(); ctrl.bankDetailsForm = { $valid: true } as ng.IFormController; return ctrl.submitBankDetails().then(() => $state.verify(x => x.go(It.isValue("^.success")), Times.once()) ); }); it('should handle a server field validation error', () => { const ctrl = newController(); ctrl.showMeterReadingForm = false; quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); const error: ServiceError = { code: '', errorList: [{ id: 'field', description: 'description' }] }; acquisitionService.setup(x => x.acquisition(It.isAny(), It.isAny())).returns(() => Promise.reject({ data: error })) ctrl.$onInit(); ctrl.personalDetailsForm = {} as ng.IFormController; ctrl.bankDetailsForm = { $valid: true } as ng.IFormController; ctrl.bankDetailsForm.field = {} as ng.INgModelController; return ctrl.submitBankDetails().then(() => expect(ctrl.step).to.equal('BankDetails') ); }); it('should save move in date in user data state', () => { const ctrl = newController(); ctrl.moveInDate = new Date(2017, 8, 12); ctrl.saveMoveInDate(); expect(ctrl.userDataState.moveInDate).to.deep.equal(LocalDate.of(2017,9,12)); }); });