import { QuoteClient } from '../clients/QuoteClient'; import { AddressClient } from '../clients/AddressClient'; import { QuoteService } from './QuoteService'; import { AnalyticsService, AnalyticsEvent } from './AnalyticsService' import { UserDataState } from '../state/UserDataState'; import { Mock, It, IMock, Times } from 'typemoq'; import { appConfig } from '../entities/AppConfig.fixture'; import { quote, saveQuoteRequest, quoteWithMeters } from '../entities/Quote.fixture'; import { address, meters } from '../entities/Address.fixture'; import { supplierTariffRequestParams, suppliers, supplierTariffs } from '../entities/Suppliers.fixture'; import { $q } from '../util/PromiseUtils'; import { expect } from 'chai'; describe('Quote service', () => { let quoteClient: IMock; let addressClient: IMock; let userDataState: UserDataState; let quoteService: QuoteService; let analyticsService: IMock; beforeEach(() => { addressClient = Mock.ofType(); quoteClient = Mock.ofType(); userDataState = {} as UserDataState; analyticsService = Mock.ofType(); quoteService = new QuoteService(appConfig, $q, quoteClient.object, addressClient.object, userDataState, analyticsService.object); }); it('returns an existing quote', () => { quoteService.quoteState = quoteWithMeters; return expect(quoteService.getQuote()).to.eventually.equal(quoteWithMeters); }); it('gets a quick quote', () => { userDataState.quoteType = 'Quick'; userDataState.supplyAddress = address; quoteClient.setup(x => x.quickQuote(It.isAny())).returns(() => Promise.resolve({ data: quote })); addressClient.setup(x => x.getMeterDetails(It.isAny())).returns(() => Promise.resolve( { data: [] })); quoteService.getQuote().then( quote => { analyticsService.verify(x => x.push(It.isObjectWith({ event: 'GetQuickQuote' })), Times.once()); return expect(quote).to.eventually.deep.equal(quoteWithMeters); } ); }); it('gets an estimated quote', () => { userDataState.quoteType = 'Estimated'; userDataState.supplyAddress = address; quoteClient.setup(x => x.estimatedQuote(It.isAny())).returns(() => Promise.resolve({ data: quote })); addressClient.setup(x => x.getMeterDetails(It.isAny())).returns(() => Promise.resolve( { data: [] })); return expect(quoteService.getQuote()).to.eventually.deep.equal(quoteWithMeters); }); it('gets a usage-based quote', () => { userDataState.quoteType = 'UsageBased'; userDataState.supplyAddress = address; quoteClient.setup(x => x.usageBasedQuote(It.isAny())).returns(() => Promise.resolve({ data: quote })); addressClient.setup(x => x.getMeterDetails(It.isAny())).returns(() => Promise.resolve( { data: [] })); return expect(quoteService.getQuote()).to.eventually.deep.equal(quoteWithMeters); }); it('gets a move-in quote', () => { userDataState.quoteType = 'MoveIn'; userDataState.supplyAddress = address; quoteClient.setup(x => x.moveInQuote(It.isAny())).returns(() => Promise.resolve({ data: quote })); addressClient.setup(x => x.getMeterDetails(It.isAny())).returns(() => Promise.resolve( { data: [] })); return expect(quoteService.getQuote()).to.eventually.deep.equal(quoteWithMeters); }); it(' gets a move-in quote, when address is on supply', () => { userDataState.quoteType = 'Quick'; userDataState.supplyAddress = address; userDataState.fuel = "Electricity"; quoteClient.setup(x => x.moveInQuote(It.isAny())).returns(() => Promise.resolve({ data: quote })); addressClient.setup(x => x.getMeterDetails(It.isAny())).returns(() => Promise.resolve( { data: meters })); return expect(quoteService.getQuote()).to.eventually.deep.equal({...quote, meters}); }); it(' gets a quick quote, when address is on supply but usage is 0', () => { userDataState.quoteType = 'Quick'; userDataState.supplyAddress = address; userDataState.fuel = "Electricity"; quoteClient.setup(x => x.quickQuote(It.isAny())).returns(() => Promise.resolve({data: quote})); addressClient.setup(x => x.getMeterDetails(It.isAny())).returns(() => Promise.resolve({data: [{...meters[0], eac_qa: 0}]})); quoteService.getQuote().then(quote => { analyticsService.verify(x => x.push(It.isObjectWith({event: 'GetQuickQuote'})), Times.once()); return expect(quote).to.eventually.deep.equal(quoteWithMeters); } ); }); it('forces a new quote even if one already exists', () => { quoteService.quoteState = quoteWithMeters; userDataState.quoteType = 'UsageBased'; userDataState.supplyAddress = address; quoteClient.setup(x => x.usageBasedQuote(It.isAny())).returns(() => Promise.resolve({ data: quote })).verifiable(Times.once()); addressClient.setup(x => x.getMeterDetails(It.isAny())).returns(() => Promise.resolve( { data: [] })); return quoteService.getNewQuote().then(() => quoteClient.verifyAll()); }); it('passes through suppliers', () => { quoteClient.setup(x => x.suppliers('London')).returns(() => Promise.resolve({ data: suppliers })); return expect(quoteService.suppliers('London')).to.eventually.deep.equal({ data: suppliers }); }); it('passes through supplier tariffs', () => { quoteClient.setup(x => x.supplierTariffs(supplierTariffRequestParams)).returns(() => Promise.resolve({ data: supplierTariffs })); return expect(quoteService.supplierTariffs(supplierTariffRequestParams)).to.eventually.deep.equal({ data: supplierTariffs }); }); it('passes through save quote', () => { quoteClient.setup(x => x.saveQuote(saveQuoteRequest)).returns(() => Promise.resolve({ data: { id: '22' } })); return expect(quoteService.saveQuote(saveQuoteRequest)).to.eventually.deep.equal({ data: { id: '22' } }); }); it('passes through retrieve save quote', () => { quoteClient.setup(x => x.retrieveSavedQuote('123')).returns(() => Promise.resolve({ data: quote })); return expect(quoteService.retrieveSavedQuote('123')).to.eventually.deep.equal({ data: quote }); }); });