From a1c564b8d890cd833b03c3ac201aff1a069b31b1 Mon Sep 17 00:00:00 2001
From: Hugo SUBTIL <ext.sopra.husubtil@grandlyon.com>
Date: Tue, 9 Aug 2022 17:14:52 +0200
Subject: [PATCH] fix: TU and clean code

---
 __tests__/aggregate.spec.js            |  2 +-
 __tests__/findUserPdl.spec.js          |  4 +-
 __tests__/getContractStartDate.spec.js | 52 +++++++++++++++---
 __tests__/requests/bo.spec.js          | 34 +++++++-----
 __tests__/requests/sge.spec.js         |  2 +-
 __tests__/verifyUserIdentity.spec.js   |  4 +-
 src/core/contractStartDate.js          | 49 +++++++++++++++++
 src/index.js                           | 73 +++++---------------------
 src/requests/bo.js                     |  3 +-
 9 files changed, 135 insertions(+), 88 deletions(-)
 create mode 100644 src/core/contractStartDate.js

diff --git a/__tests__/aggregate.spec.js b/__tests__/aggregate.spec.js
index 0b43f69..e5a31d1 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 3d97b2a..6ec8f44 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 61fde69..5671973 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 7e21029..2a61f80 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 6d5f1e6..2a16ca9 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 9826325..288b939 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 0000000..cc8770f
--- /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 022bc24..e3f4794 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 f60cb49..6ee4cec 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
-- 
GitLab