import { GetQuoteController } from './GetQuote'; import { HostExtractor } from '../common/util/HostExtractor'; import { QuoteService } from '../common/services/QuoteService'; import { EligibilityService } from '../common/services/EligibilityService'; import { OptimizelyService } from '../common/services/OptimizelyService'; import { AnalyticsService } from '../common/services/AnalyticsService'; import { UserDataState } from '../common/state/UserDataState'; import { LayoutState } from '../common/state/LayoutState'; import { Mock, IMock, It, Times } from 'typemoq'; import { QuoteWithMeters } from '../common/entities/Quote'; import { Retailer } from '../common/entities/Enums'; import { config } from '../common/entities/ApplicationConfig.fixture'; import { paygQuoteWithMeters, quoteWithMeters} from '../common/entities/Quote.fixture'; import { address } from '../common/entities/Address.fixture'; import { Eligibility } from '../common/entities/Eligibility'; import { expect } from 'chai'; describe('Get quote controller', () => { let host: IMock, userDataState: UserDataState, layoutState: LayoutState, quoteService: IMock, eligibilityService: IMock, $state: IMock, $anchorScroll: IMock, optimizelyService: IMock, analyticsService: IMock; beforeEach(() => { host = Mock.ofType(); userDataState = {} as UserDataState; layoutState = {} as LayoutState; quoteService = Mock.ofType(); eligibilityService = Mock.ofType(); $state = Mock.ofType(); $anchorScroll = Mock.ofType(); optimizelyService = Mock.ofType(); analyticsService = Mock.ofType(); }); function newController(retailer: Retailer = 'OVO') { const ctrl = new GetQuoteController(config, host.object, userDataState, quoteService.object, eligibilityService.object, $state.object, $anchorScroll.object, layoutState, optimizelyService.object, analyticsService.object); ctrl.quoteForm = {} as ng.IFormController; host.setup(x => x.retailer).returns(() => retailer); eligibilityService.setup(x => x.checkSupplyAddress()).returns(() => Promise.resolve({status:'Eligible', isIGT: false, smartMeterRequired: true})).verifiable(Times.once()); return ctrl; } it('should clear the existing quote and set quoteType to quick', () => { userDataState.postcode = 'XY1 2ZD'; const ctrl = newController(); expect(userDataState.postcode).to.equal('XY1 2ZD'); expect(userDataState.paymentMethod).to.equal('Paym'); expect(userDataState.quoteType).to.equal('Quick'); quoteService.verify(x => x.clear(), Times.once()); }); it('should parse the URL parameters', () => { $state.setup(x => x.params).returns(() => ({ postcode: 'AB1 2CD', paymentMethod: 'Payg' })); const ctrl = newController(); expect(userDataState.postcode).to.equal('AB1 2CD'); expect(userDataState.paymentMethod).to.equal('Payg'); }); it('should return immediately if form is invalid', () => { const ctrl = newController(); ctrl.quoteForm = { $invalid: true } as ng.IFormController; ctrl.submit(); quoteService.verify(x => x.getQuote(), Times.never()); }); it('should get a quote', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)).verifiable(Times.once()); return ctrl.submit().then(() => { $state.verify(x => x.go(It.isValue("^.quote")), Times.once()); quoteService.verifyAll(); }); }); it('should navigate to quote page for Paym', () =>{ userDataState.paymentMethod = 'Paym'; const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)).verifiable(Times.once()); return ctrl.submit().then(() => { $state.verify(x => x.go(It.isValue("^.quote")), Times.once()); }); }); it('should navigate to quote page for Payg', () => { userDataState.paymentMethod = 'Payg'; const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(paygQuoteWithMeters)).verifiable(Times.once()); return ctrl.submit().then(() => { $state.verify(x => x.go(It.isValue("^.plan-payg")), Times.once()); eligibilityService.verifyAll(); }); }); it('should not call the eligibility service for communities', () => { const ctrl = newController('Fairerpower'); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)).verifiable(Times.once()); return ctrl.submit().then(() => { eligibilityService.verify(x => x.checkSupplyAddress(), Times.never()); }); }); it('should handle a region error', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.reject({ status: 428 })); return ctrl.submit().then(() => { $state.verify(x => x.go(It.isAnyString()), Times.never()); expect(ctrl.regionRequired).to.be.true; }); }); it('should update the address and postcode', () => { const ctrl = newController(); ctrl.updateAddress(address); expect(userDataState.supplyAddress).to.deep.equal(address); expect(userDataState.postcode).to.equal(address.postcode); }); it('should check if the address is eligible', () => { const ctrl = newController(); userDataState.paymentMethod = 'Payg'; ctrl.quoteForm = {} as ng.IFormController; host.setup(x => x.retailer).returns(() => 'OVO'); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)).verifiable(Times.once()); return ctrl.submit().then(() => { eligibilityService.verify(x => x.checkSupplyAddress(), Times.once()); }); }); });