import { RefineQuoteController } from './RefineQuote'; import { QuoteService } from '../common/services/QuoteService'; import { UserDataState } from '../common/state/UserDataState'; import { Mock, IMock, It, Times } from 'typemoq'; import {Quote, QuoteWithMeters} from '../common/entities/Quote'; import { Utility, Region } from '../common/entities/Enums'; import { Suppliers } from '../common/entities/Suppliers'; import {quote, quoteWithMeters} from '../common/entities/Quote.fixture'; import { suppliers, supplierTariffs } from '../common/entities/Suppliers.fixture'; import { expect } from 'chai'; describe('Refine quote controller', () => { let userDataState: UserDataState, quoteService: IMock, $state: IMock, mixpanel: IMock; beforeEach(() => { userDataState = {} as UserDataState; quoteService = Mock.ofType(); $state = Mock.ofType(); mixpanel = Mock.ofType(); }); function newController() { const ctrl = new RefineQuoteController(userDataState, quoteService.object, $state.object, mixpanel.object); mixpanel.setup(x => x.people).returns(() => Mock.ofType().object); return ctrl; } it('should navigate to get quote page if quote errors', () => { 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 get quote page if suppliers call errors', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); quoteService.setup(x => x.suppliers(It.isValue('London'))).returns(() => Promise.reject("error")); return ctrl.$onInit().then(() => $state.verify(x => x.go(It.isValue("^.get-quote")), Times.once()) ); }); it('should load the supplier details', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); quoteService.setup(x => x.suppliers(It.isValue('London'))).returns(() => Promise.resolve({ data: suppliers })); expect(ctrl.$onInit().then(() => ctrl.suppliers)).to.eventually.equal(suppliers); }); it('should load the supplier tariffs', () => { const ctrl = newController(); quoteService.setup(x => x.getQuote()).returns(() => Promise.resolve(quoteWithMeters)); quoteService.setup(x => x.supplierTariffs(It.isValue({ region: 'London' as Region, supplierId: '234', utility: 'Gas' as Utility }))).returns(() => Promise.resolve({ data: supplierTariffs })); expect(ctrl.getTariffs('234', 'Gas')).to.eventually.equal(supplierTariffs); }); it('should handle an invalid tariff selection', () => { const ctrl = newController(); ctrl.estimatedForm = {} as ng.IFormController; quoteService.setup(x => x.getNewQuote()).returns(() => Promise.reject({ status: 409 })); expect(ctrl.submitEstimated().then(() => ctrl.error.code)).to.eventually.equal('The supplier/tariff combination you have entered is not valid. Please check and re-submit. If you are unsure, please call us for help.'); }); it('should handle a timeout', () => { const ctrl = newController(); ctrl.usageBasedForm = {} as ng.IFormController; quoteService.setup(x => x.getNewQuote()).returns(() => Promise.reject({ status: 503 })); expect(ctrl.submitUsageBased().then(() => ctrl.error.code)).to.eventually.equal('Sorry, we are having some trouble with your request. Please try again in a few minutes'); }); });