import chai from 'chai'; import chaiAsPromised from 'chai-as-promised'; import fs from 'fs'; import puppeteer from 'puppeteer'; import path from 'path'; import sinon from 'sinon'; // tslint:disable-next-line: import-name import spies from 'chai-spies'; chai.use(spies); chai.use(chaiAsPromised); const expect = chai.expect; import { GetDataPayload } from '../../src/typings'; // tslint:disable-next-line: max-line-length import { SRPUtilityDataService } from '../../src/services/srp-utility-data/srp-utility-data-service'; import { MockBrowser } from '../mocks/mock-utility-data/mock-browser'; import { MockLogger } from '../mocks/mock-utility-data/mock-logger'; import axios from 'axios'; describe('SRP Data API', () => { let sandbox: sinon.SinonSandbox; let logger: MockLogger; let srpData: SRPUtilityDataService; before(async () => { logger = new MockLogger(); srpData = new SRPUtilityDataService(); srpData.logger = logger; }); beforeEach(() => { sandbox = sinon.createSandbox(); }); afterEach(() => { sandbox.restore(); }); // tslint:disable-next-line: max-line-length it('Should return utility user service accounts if correct credentials are provided', async () => { // tslint:disable-next-line: no-angle-bracket-type-assertion sandbox.stub(puppeteer, 'launch').returns(new MockBrowser()); sandbox.stub(axios, 'get').returns({data: { pipe: ()=>{ const mockPath = path.resolve('test/mocks/fixtures', 'srp.pdf'); const tempPath = path.resolve( `/tmp/downloads/service_acccounts/bills`, ); const mockFile = fs.readFileSync(mockPath); fs.mkdirSync(tempPath, { recursive: true }); fs.writeFileSync(`${tempPath}/srp.pdf`, mockFile); } }}); const payload: GetDataPayload = { username: 'user_good', password: 'pass_good', }; const res = await srpData.getServiceAccounts(payload); expect(res).to.include.all.keys('id', 'name', 'serviceAccounts'); expect(res.serviceAccounts[0]).to.include.all.keys( 'id', 'address', 'legalNames', 'meterNumber', ); }); it('Should return error message if incorrect credentials are provided for getting service accounts', async () => { // tslint:disable-next-line: no-angle-bracket-type-assertion sandbox.stub(puppeteer, 'launch').returns(new MockBrowser()); const payload: GetDataPayload = { username: 'Naval', password: 'Guru', }; const res = await expect(srpData.getServiceAccounts(payload)).to.be .rejected; expect(res.statusCode).equals(401); expect(res.message).equals('The user name or password is incorrect.'); }); it('Should return error message if correct credentials are provided but data extraction failed for getting service accounts', async () => { // tslint:disable-next-line: no-angle-bracket-type-assertion sandbox.stub(puppeteer, 'launch').returns(new MockBrowser()); const payload: GetDataPayload = { username: 'Naval', password: 'Gurukant', }; const res = await expect(srpData.getServiceAccounts(payload)).to.be .rejected; expect(res.statusCode).equals(500); expect(res.message.startsWith('[SRP] Failed to extract data')).to.equal( true, ); }); it('Should return error message if incorrect credentials are provided for getting monthly utility data', async () => { // tslint:disable-next-line: no-angle-bracket-type-assertion sandbox.stub(puppeteer, 'launch').returns(new MockBrowser()); const payload: GetDataPayload = { username: 'Naval', password: 'Guru', }; const res = await expect(srpData.getMonthlyUtilityData(payload)).to.be .rejected; expect(res.statusCode).equals(401); expect(res.message).equals('The user name or password is incorrect.'); }); it('Should return error message if correct credentials are provided but data extraction failed for monthly utility data', async () => { // tslint:disable-next-line: no-angle-bracket-type-assertion sandbox.stub(puppeteer, 'launch').returns(new MockBrowser()); const payload: GetDataPayload = { username: 'Naval', password: 'Gurukant', }; const res = await expect(srpData.getMonthlyUtilityData(payload)).to.be .rejected; expect(res.statusCode).equals(500); expect(res.message.startsWith('[SRP] Failed to extract data')).to.equal( true, ); }); it('Should return monthly utility data of given service account', async () => { // tslint:disable-next-line: no-angle-bracket-type-assertion sandbox.stub(puppeteer, 'launch').returns(new MockBrowser()); const payload: GetDataPayload = { username: 'user_good', password: 'pass_good', }; const res = await srpData.getMonthlyUtilityData(payload); const monthlyUtilityData = res[0]; const amountIncents: number = monthlyUtilityData.amountInCents; expect(monthlyUtilityData).to.have.property('amountInCents'); expect(monthlyUtilityData).to.have.property('energyConsumptionInWatts'); expect(monthlyUtilityData).to.have.property('_id'); expect(monthlyUtilityData).to.have.property('month'); expect(monthlyUtilityData).to.have.property('offPeakUsageInWatts'); expect(monthlyUtilityData).to.have.property('onPeakUsageInWatts'); expect(monthlyUtilityData).to.have.property('serviceAccountId'); expect(monthlyUtilityData).to.have.property('year'); expect(monthlyUtilityData) .to.have.property('amountInCents') .to.be.a('number'); expect(amountIncents % 1).to.equal(0); }); });