diff --git a/__tests__/aggregate.spec.js b/__tests__/aggregate.spec.js index 0b43f693f937ad3f72476e9220f92431eed00f40..e5a31d1da298ef9a9d344f7863ba1caca8d214bf 100644 --- a/__tests__/aggregate.spec.js +++ b/__tests__/aggregate.spec.js @@ -1,4 +1,4 @@ -const { buildAgregatedData } = require('../src/aggregate') +const { buildAgregatedData } = require('../src/helpers/aggregate') const { cozyClient } = require('cozy-konnector-libs') describe('buildAgregatedData', () => { diff --git a/__tests__/findUserPdl.spec.js b/__tests__/findUserPdl.spec.js index 3d97b2af8de6ff1b3d7778222d15ef17840014b0..6ec8f44f1726a872d76f8da2994cdbf5abba1f47 100644 --- a/__tests__/findUserPdl.spec.js +++ b/__tests__/findUserPdl.spec.js @@ -1,6 +1,6 @@ const xml2js = require('xml2js') const { errors } = require('cozy-konnector-libs') -const { findUserPdl } = require('../src/findUserPdl') +const { findUserPdl } = require('../src/core/findUserPdl') const mockSoapRequest = jest.fn() jest.mock('easy-soap-request', () => async () => mockSoapRequest()) @@ -8,7 +8,7 @@ jest.mock('easy-soap-request', () => async () => mockSoapRequest()) jest.spyOn(xml2js, 'parseStringPromise').mockResolvedValue('response') const mockParseUserPdl = jest.fn() -jest.mock('../src/parsing', () => ({ +jest.mock('../src/helpers/parsing', () => ({ parseUserPdl: () => mockParseUserPdl(), })) diff --git a/__tests__/getContractStartDate.spec.js b/__tests__/getContractStartDate.spec.js index 61fde69b12d74a3256fc7d832e82f223017935b9..5671973e1551ec34ddbd00ee0d0603bd83842e40 100644 --- a/__tests__/getContractStartDate.spec.js +++ b/__tests__/getContractStartDate.spec.js @@ -1,12 +1,39 @@ const { errors } = require('cozy-konnector-libs') -const index = require('../src') +const { getContractStartDate } = require('../src/core/contractStartDate') const mockSoapRequest = jest.fn() jest.mock('easy-soap-request', () => async () => mockSoapRequest()) const responseMock = { response: { - body: 'mockedBody', + body: `<?xml version="1.0" encoding="UTF-8"?> +<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> + <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> + <ns7:consulterDonneesTechniquesContractuellesResponse xmlns:ns0="http://www.erdf.fr/tube/exposition/finalisation" xmlns:ns7="http://www.enedis.fr/sge/b2b/services/consulterdonneestechniquescontractuelles/v1.0"> + <point id="19160781274487"> + <donneesGenerales> + + <dateDerniereModificationFormuleTarifaireAcheminement>2021-08-01+02:00</dateDerniereModificationFormuleTarifaireAcheminement> + <niveauOuvertureServices>2</niveauOuvertureServices> + </donneesGenerales> + </point> + </ns7:consulterDonneesTechniquesContractuellesResponse> + </soap:Body> +</soapenv:Envelope>`, + }, +} + +const responseIssueMock = { + response: { + body: `<?xml version="1.0" encoding="UTF-8"?> +<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> + <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> + <ns7:consulterDonneesTechniquesContractuellesResponse xmlns:ns0="http://www.erdf.fr/tube/exposition/finalisation" xmlns:ns7="http://www.enedis.fr/sge/b2b/services/consulterdonneestechniquescontractuelles/v1.0"> + <point id="19160781274487"> + </point> + </ns7:consulterDonneesTechniquesContractuellesResponse> + </soap:Body> +</soapenv:Envelope>`, }, } @@ -16,10 +43,15 @@ const responseMock = { */ describe('getContractStartDate', () => { it('should return void when successfully got contract start date ✅', async () => { - mockSoapRequest.mockResolvedValue(responseMock) + mockSoapRequest.mockResolvedValueOnce(responseMock) expect.assertions(1) try { - await index.getContractStartDate() + await getContractStartDate( + 'http://pouet.com', + 'apiAuthKey', + 'pouet@pouet.com', + '1111111111' + ) expect(true).toBeTruthy() } catch (error) { expect(true).toBe(false) @@ -30,7 +62,7 @@ describe('getContractStartDate', () => { mockSoapRequest.mockRejectedValueOnce('error') try { - await index.getContractStartDate() + await getContractStartDate() expect(true).toBe(false) } catch (error) { expect(error).toBe(errors.VENDOR_DOWN) @@ -38,10 +70,14 @@ describe('getContractStartDate', () => { }) it('should throw NOT_EXISTING_DIRECTORY when failing parsing 🚫', async () => { - //mock processStartDate - // processStartDate.mockRejectedValueOnce('error') + mockSoapRequest.mockResolvedValueOnce(responseIssueMock) try { - await index.getContractStartDate() + await getContractStartDate( + 'http://pouet.com', + 'apiAuthKey', + 'pouet@pouet.com', + '1111111111' + ) expect(true).toBe(false) } catch (error) { expect(error).toBe(errors.NOT_EXISTING_DIRECTORY) diff --git a/__tests__/requests/bo.spec.js b/__tests__/requests/bo.spec.js index 7e2102956c86c644a604a5de28d3e6aafcbca11b..2a61f80c4f36ab3108d18c22dd79ccce7cbdae6e 100644 --- a/__tests__/requests/bo.spec.js +++ b/__tests__/requests/bo.spec.js @@ -7,27 +7,37 @@ describe('Backoffice routes', () => { describe('createBoConsent', () => { it('should send consent to BO', async () => { axios.post.mockResolvedValueOnce({ id: 1 }) - const consent = await createBoConsent({ - pdl: 11111111111111, - name: 'POUET', - adresse: '20 rue du lac', + const consent = await createBoConsent( + 11111111111111, + 'POUET', + 'mr', + '20 rue du lac', + '69003', + '69383' + ) + expect(consent).toEqual({ + id: 1, + firstname: 'mr', + lastname: 'POUET', + pointId: 11111111111111, postalCode: '69003', + address: '20 rue du lac', inseeCode: '69383', }) - expect(consent).toBe({ id: 1 }) }) it('should handle unavailable BO', async () => { axios.post.mockImplementationOnce(() => Promise.reject(errors.MAINTENANCE) ) try { - await createBoConsent({ - pdl: 11111111111111, - name: 'POUET', - adresse: '20 rue du lac', - postalCode: '69003', - inseeCode: '69383', - }) + await createBoConsent( + 11111111111111, + 'POUET', + 'mr', + '20 rue du lac', + '69003', + '69383' + ) expect(true).toBe(false) } catch (e) { expect(e).toBe(errors.MAINTENANCE) diff --git a/__tests__/requests/sge.spec.js b/__tests__/requests/sge.spec.js index 6d5f1e6f9364ffd8a3cee5dcfb73398a4d2918aa..2a16ca9c49c6610357b94595f7c380c63fbd9a7a 100644 --- a/__tests__/requests/sge.spec.js +++ b/__tests__/requests/sge.spec.js @@ -1,5 +1,5 @@ const xml2js = require('xml2js') -const { parseTags, parseValue } = require('../../src/parsing') +const { parseTags, parseValue } = require('../../src/helpers/parsing') const { consultationMesuresDetaillees, consultationMesuresDetailleesMaxPower, diff --git a/__tests__/verifyUserIdentity.spec.js b/__tests__/verifyUserIdentity.spec.js index 98263253c4a140dee01ec3300581336f4bb762d2..288b9396755d88a15a1c5b3ad18340c060f9d6dc 100644 --- a/__tests__/verifyUserIdentity.spec.js +++ b/__tests__/verifyUserIdentity.spec.js @@ -1,11 +1,11 @@ const { errors } = require('cozy-konnector-libs') -const { verifyUserIdentity } = require('../src/verifyUserIdentity') +const { verifyUserIdentity } = require('../src/core/verifyUserIdentity') jest.mock('../src/requests/insee', () => ({ getInseeCode: jest.fn().mockResolvedValue(69), })) -jest.mock('../src/findUserPdl', () => ({ +jest.mock('../src/core/findUserPdl', () => ({ findUserPdl: jest.fn().mockResolvedValue('12345'), })) diff --git a/src/core/contractStartDate.js b/src/core/contractStartDate.js new file mode 100644 index 0000000000000000000000000000000000000000..cc8770f7e385c15425626a680c7b7d57dd238183 --- /dev/null +++ b/src/core/contractStartDate.js @@ -0,0 +1,49 @@ +// @ts-check +const { log, errors } = require('cozy-konnector-libs') +const soapRequest = require('easy-soap-request') +const { + parseTags, + parseValue, + parseContractStartDate, +} = require('../helpers/parsing') +const xml2js = require('xml2js') +const { consulterDonneesTechniquesContractuelles } = require('../requests/sge') + +/** + * Get user contract start date + * @param {string} url + * @param {string} apiAuthKey + * @param {string} userLogin + * @param {number} pointId + * @returns {Promise<string>} + */ +async function getContractStartDate(url, apiAuthKey, userLogin, pointId) { + log('info', 'Fetching data start date') + const sgeHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', + apikey: apiAuthKey, + } + + const { response } = await soapRequest({ + url: `${url}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`, + headers: sgeHeaders, + xml: consulterDonneesTechniquesContractuelles(pointId, userLogin), + }).catch(err => { + log('error', 'Error while fetching contract start date : ' + err) + throw errors.VENDOR_DOWN + }) + + const result = await xml2js.parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + try { + return parseContractStartDate(result) + } catch (error) { + log('error', 'Error while processing contract start date: ' + error) + throw errors.NOT_EXISTING_DIRECTORY + } +} + +module.exports = { getContractStartDate } diff --git a/src/index.js b/src/index.js index 022bc24469651080453f717824835fd80bfd104f..e3f4794ac5790e4f535df147ce5b3e75921b275d 100644 --- a/src/index.js +++ b/src/index.js @@ -16,10 +16,8 @@ const { formateDataForDoctype, parseTags, parseValue, - parseContractStartDate, } = require('./helpers/parsing') const { - consulterDonneesTechniquesContractuelles, consultationMesuresDetailleesMaxPower, consultationMesuresDetaillees, } = require('./requests/sge') @@ -33,6 +31,7 @@ const { verifyUserIdentity } = require('./core/verifyUserIdentity') const { activateContract } = require('./core/contractActivation') const { verifyContract } = require('./core/contractVerification') const { terminateContract } = require('./core/contractTermination') +const { getContractStartDate } = require('./core/contractStartDate') const { getAccount, saveAccountData } = require('./requests/cozy') const { iSLocal } = require('./helpers/env') @@ -52,7 +51,6 @@ const endDateString = endDate.format('YYYY-MM-DD') const ACCOUNT_ID = iSLocal() ? 'default_account_id' : 'enedis-sge-grandlyon' module.exports = new BaseKonnector(start) -module.exports = { getContractStartDate } /** * The start function is run by the BaseKonnector instance only when it got all the account @@ -102,12 +100,20 @@ async function start(fields, cozyParameters) { user.postalCode, user.inseeCode ) - await getContractStartDate(baseUrl, apiAuthKey, sgeLogin, pointId) + + // handle user contract start date in order to preperly request data + const userContractstartDate = await getContractStartDate( + baseUrl, + apiAuthKey, + sgeLogin, + pointId + ) + startDailyDate = moment(userContractstartDate, 'YYYY-MM-DD') + startDailyDateString = startDailyDate.format('YYYY-MM-DD') const contractStartDate = moment().format('YYYY-MM-DD') - //TODO: consent time ? 5 years? const contractEndDate = moment() - .add(1, 'year') + .add(1, 'year') // SGE force 1 year duration .format('YYYY-MM-DD') let serviceId = await verifyContract( @@ -198,41 +204,6 @@ async function gatherData(baseUrl, apiAuthKey, sgeLogin, pointId) { log('info', 'Querying data: done') } -/** - * //TODO: Move - * @param {string} url - * @param {string} apiAuthKey - * @param {string} userLogin - * @param {number} pointId - * @returns {Promise<void>} - */ -async function getContractStartDate(url, apiAuthKey, userLogin, pointId) { - log('info', 'Fetching data start date') - const sgeHeaders = { - 'Content-Type': 'text/xml;charset=UTF-8', - apikey: apiAuthKey, - } - - const { response } = await soapRequest({ - url: `${url}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`, - headers: sgeHeaders, - xml: consulterDonneesTechniquesContractuelles(pointId, userLogin), - }).catch(err => { - log('error', 'Error while fetching contract start date : ' + err) - throw errors.VENDOR_DOWN - }) - - xml2js.parseString( - response.body, - { - tagNameProcessors: [parseTags], - valueProcessors: [parseValue], - explicitArray: false, - }, - processStartDate() - ) -} - /** * Get hour data * @param {string} url @@ -417,26 +388,6 @@ function processData(doctype = 'com.grandlyon.enedis.day') { } } -/** - * Store an accurate start date based on contrat start - */ -function processStartDate() { - return async (err, result) => { - if (err) { - log('error', err) - throw err - } - // update start Date with contract openning date - try { - startDailyDate = moment(parseContractStartDate(result), 'YYYY-MM-DD') - startDailyDateString = startDailyDate.format('YYYY-MM-DD') - } catch (error) { - log('error', 'Error while processing contract start date: ' + error) - throw errors.NOT_EXISTING_DIRECTORY - } - } -} - /** * Save data in the right doctype db and prevent duplicated keys * @param {EnedisKonnectorData[]} data diff --git a/src/requests/bo.js b/src/requests/bo.js index f60cb49fc23355f2f2760896ea056dab929857bd..6ee4ceca1119296146ac1c1e1cd859b316d13207 100644 --- a/src/requests/bo.js +++ b/src/requests/bo.js @@ -3,7 +3,8 @@ const { log, errors } = require('cozy-konnector-libs') /** * @param {number} pointId - * @param {string} name + * @param {string} lastname + * @param {string} firstname * @param {string} address * @param {string} postalCode * @param {string} inseeCode