diff --git a/cypress/fixtures/mock_files/file-1.jpg b/cypress/fixtures/mock_files/file-1.jpg
new file mode 100644
index 000000000..adb6d17bd
Binary files /dev/null and b/cypress/fixtures/mock_files/file-1.jpg differ
diff --git a/cypress/fixtures/mock_files/file-2.txt b/cypress/fixtures/mock_files/file-2.txt
new file mode 100644
index 000000000..3ee896a17
--- /dev/null
+++ b/cypress/fixtures/mock_files/file-2.txt
@@ -0,0 +1 @@
+txtaa
\ No newline at end of file
diff --git a/cypress/integration/modDistAgreement/modDistAgreement.spec.js b/cypress/integration/modDistAgreement/modDistAgreement.spec.js
new file mode 100644
index 000000000..2277ae209
--- /dev/null
+++ b/cypress/integration/modDistAgreement/modDistAgreement.spec.js
@@ -0,0 +1,104 @@
+///
+
+describe('Update distribution agreement form', () => {
+ const filepathJpg = 'mock_files/file-1.jpg'
+ const filepathTxt = 'mock_files/file-2.txt'
+ const jpgFileName = 'file-1.jpg'
+ const txtFileName = 'file-2.txt'
+ const urlTxt = '/form/upload_txt_attachment/1'
+ const urlAttachment = '/form/upload_attachment/0'
+ const modAgreementUrl = '/procedures/distribution_agreement'
+
+ Cypress.on('uncaught:exception', (error, runnable) => {
+ console.error(error)
+ return false
+ })
+
+ beforeEach(() => {
+ cy.visit('/mod-distribution-agreement')
+ })
+
+ describe('Update the distribution agreement', function () {
+ function uploadFile(fileName, url) {
+ cy.intercept('POST', url, {
+ data: { code: 'UPLOAD_OK', file_hash: fileName }
+ }).as('uploadFile')
+
+ cy.wait('@uploadFile').then((interception) => {
+ assert.isNotNull(interception.response.body.data.code, 'UPLOAD_OK')
+ })
+ }
+
+ it('Upload correct files', function () {
+ cy.get('#type9-input-file').attachFile({
+ filePath: filepathJpg
+ })
+
+ uploadFile(jpgFileName, urlAttachment)
+
+ cy.get('#type12-input-file').attachFile({
+ filePath: filepathTxt
+ })
+
+ uploadFile(txtFileName, urlTxt)
+
+ cy.intercept('POST', modAgreementUrl, { data: { statusCode: 200 } })
+ cy.get('#submit-button').click()
+ })
+
+ it('Upload incorrect files', function () {
+ cy.get('#type9-input-file').attachFile({
+ filePath: filepathTxt
+ })
+
+ uploadFile(txtFileName, urlAttachment)
+
+ cy.get('#type12-input-file').attachFile({
+ filePath: filepathJpg
+ })
+
+ uploadFile(jpgFileName, urlTxt)
+
+ cy.intercept('POST', modAgreementUrl, { data: { statusCode: 200 } })
+ cy.get('#submit-button').click()
+ cy.get('#accept-button').click()
+ })
+
+ it('Upload only one file and accept', function () {
+ cy.get('#type9-input-file').attachFile({
+ filePath: filepathJpg
+ })
+
+ uploadFile(jpgFileName, urlAttachment)
+
+ cy.intercept('POST', modAgreementUrl, { data: { statusCode: 200 } })
+ cy.get('#submit-button').click()
+ cy.get('#accept-button').click()
+ })
+
+ it('Upload only one file and decline', function () {
+ cy.get('#type9-input-file').attachFile({
+ filePath: filepathJpg
+ })
+
+ uploadFile(jpgFileName, urlAttachment)
+
+ cy.intercept('POST', modAgreementUrl, { data: { statusCode: 200 } })
+ cy.get('#submit-button').click()
+ cy.get('#decline-button').click()
+
+ })
+
+ it('Upload without files and accept', function () {
+ cy.intercept('POST', modAgreementUrl, { data: { statusCode: 200 } })
+ cy.get('#submit-button').click()
+ cy.get('#accept-button').click()
+ })
+
+ it('Upload without files and decline', function () {
+ cy.intercept('POST', modAgreementUrl, { data: { statusCode: 200 } })
+ cy.get('#submit-button').click()
+ cy.get('#decline-button').click()
+ })
+ })
+})
diff --git a/package.json b/package.json
index 8c6ac0d5f..f772fd451 100644
--- a/package.json
+++ b/package.json
@@ -59,6 +59,7 @@
]
},
"devDependencies": {
+ "axios-mock-adapter": "^1.21.2",
"cypress": "^9.5.1",
"cypress-file-upload": "^5.0.8",
"eslint-plugin-cypress": "^2.12.1",
diff --git a/src/App.js b/src/App.js
index 061ec2471..72c347ffd 100644
--- a/src/App.js
+++ b/src/App.js
@@ -66,6 +66,7 @@ const App = (props) => {
const ModifyContract = lazy(() => import('./containers/ModifyContract'))
const Tariff = lazy(() => import('./containers/Tariff'))
const MailSubscriptions = lazy(() => import('./containers/MailSubscriptions'))
+ const ModDistAgreement = lazy(() => import('./containers/ModDistAgreement/ModDistAgreement'))
const loadContractData = () => {
const contractData =
@@ -323,6 +324,15 @@ const App = (props) => {
/>
}
/>
+ }
+ />
+ }
+ />
diff --git a/src/App.test.js b/src/App.test.js
deleted file mode 100644
index 4db7ebc25..000000000
--- a/src/App.test.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import { render } from '@testing-library/react';
-import App from './App';
-
-test('renders learn react link', () => {
- const { getByText } = render();
- const linkElement = getByText(/learn react/i);
- expect(linkElement).toBeInTheDocument();
-});
diff --git a/src/components/TermsDialog.js b/src/components/TermsDialog.js
index 50e40d466..a6182ae8f 100644
--- a/src/components/TermsDialog.js
+++ b/src/components/TermsDialog.js
@@ -31,10 +31,10 @@ const TermsDialog = (props) => {
-
diff --git a/src/components/Uploader.js b/src/components/Uploader.js
index aabe4af79..eda28dc3a 100644
--- a/src/components/Uploader.js
+++ b/src/components/Uploader.js
@@ -32,15 +32,31 @@ const useStyles = makeStyles((theme) => ({
}
}))
+/**
+ * testingCustomError : Variable to force the error for testing (not delete)
+ *
+ */
+
const Uploader = (props) => {
- const { name, callbackFn, fieldError, values, maxFiles } = props
+ const {
+ id,
+ name,
+ callbackFn,
+ fieldError,
+ values,
+ maxFiles,
+ validationFileFunction,
+ testingCustomError
+ } = props
+
const { t } = useTranslation()
const classes = useStyles()
+ const validTypeFiles = props.validTypeFiles || 'INSTALL_TYPE_ATTACHMENTS_INFO'
const [uploads, setUploads] = useState([...values])
const [inputKey, setInputKey] = useState(Date.now())
const [isUploading, setUploading] = useState(false)
- const [error, setError] = useState(false)
+ const [error, setError] = useState(testingCustomError || false)
useEffect(() => {
callbackFn(uploads)
@@ -48,26 +64,34 @@ const Uploader = (props) => {
const upload = useCallback(
async (name, file) => {
- return uploadFile(name, file)
- .then((response) => {
- if (response?.data?.code === 'UPLOAD_OK') {
- setUploads([...uploads, response?.data?.file_hash])
- setInputKey(Date.now())
- } else {
- const errorMsg = response?.data?.code
- ? response?.data?.code
+ let validation = validationFileFunction
+ ? validationFileFunction(file.name)
+ : null
+ if (!validation || validation.result) {
+ setError('')
+ return uploadFile(name, file, props.uploadUrl)
+ .then((response) => {
+ if (response?.data?.code === 'UPLOAD_OK') {
+ setUploads([...uploads, response?.data?.file_hash])
+ setInputKey(Date.now())
+ } else {
+ const errorMsg = response?.data?.code
+ ? response?.data?.code
+ : 'MODIFY_POTTAR_UNEXPECTED'
+ setError(errorMsg)
+ }
+ })
+ .catch((error) => {
+ const errorMsg = error?.response?.data?.code
+ ? error.response.data.code
: 'MODIFY_POTTAR_UNEXPECTED'
setError(errorMsg)
- }
- })
- .catch((error) => {
- const errorMsg = error?.response?.data?.code
- ? error.response.data.code
- : 'MODIFY_POTTAR_UNEXPECTED'
- setError(errorMsg)
- })
+ })
+ } else {
+ setError(validation.msg)
+ }
},
- [uploads]
+ [uploads, props.uploadUrl]
)
const handleChange = useCallback(
@@ -99,6 +123,7 @@ const Uploader = (props) => {
return (
<>
{
endAdornment: (
{isUploading ? (
-
+
) : error ? (
-
+
) : (
@@ -126,11 +151,7 @@ const Uploader = (props) => {
}}
error={(error || fieldError) && true}
helperText={
- error
- ? t(error)
- : fieldError
- ? t(fieldError)
- : t('INSTALL_TYPE_ATTACHMENTS_INFO')
+ error ? t(error) : fieldError ? t(fieldError) : t(validTypeFiles)
}
/>
@@ -142,6 +163,7 @@ const Uploader = (props) => {
{upload} handleDelete(event, index)}>
diff --git a/src/containers/Home.js b/src/containers/Home.js
index ef0aea83c..bb19fe571 100644
--- a/src/containers/Home.js
+++ b/src/containers/Home.js
@@ -62,6 +62,7 @@ const options = [
{ title: 'Contractació 20', href: `${language}/contract-20` },
{ title: 'Contractació 30', href: '/contract-30' },
{ title: 'Modificació contractual', href: '/modify-contract' },
+ { title: 'Modificació acord de repartiment', href: '/mod-distribution-agreement' },
]
const Home = (props) => {
diff --git a/src/containers/ModDistAgreement/ModDistAgreement.js b/src/containers/ModDistAgreement/ModDistAgreement.js
new file mode 100644
index 000000000..1cab82532
--- /dev/null
+++ b/src/containers/ModDistAgreement/ModDistAgreement.js
@@ -0,0 +1,77 @@
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useLocation, useParams } from 'react-router-dom'
+import { distribution_agreement } from '../../services/api'
+import ModDistAgreementData from './ModDistAgreementData'
+
+const ModDistAgreement = (props) => {
+ const { i18n } = useTranslation()
+ const { state } = useLocation()
+ const { language } = useParams()
+
+ const templateProps = JSON.parse(props.d1)
+ const [type9Attachment, setType9Attachment] = useState([])
+ const [type12Attachment, setType12Attachment] = useState([])
+ const [error, setError] = useState('')
+ const [completed, setCompleted] = useState(false)
+ const [isSendingData, setSendingData] = useState(false)
+ const [isDialogOpen, setDialogOpen] = useState(false)
+
+ const [data] = useState(state?.d1CaseData || templateProps)
+
+ const handleSubmit = async () => {
+ setSendingData(true)
+ await distribution_agreement(
+ {
+ ...data,
+ rich_attachments: [...type9Attachment, ...type12Attachment]
+ },
+ data.token
+ )
+ .then(() => {
+ setCompleted(true)
+ setSendingData(false)
+ })
+ .catch(() => {
+ setSendingData(false)
+ setError('UPDATE_DIST_AGREEMENT_ERROR')
+ })
+ }
+
+ const updateAttachment = (values, type) => {
+ type === '09'
+ ? setType9Attachment(values.map((el) => ({ type: type, data: el })))
+ : setType12Attachment(values.map((el) => ({ type: type, data: el })))
+ }
+
+ useEffect(() => {
+ i18n.changeLanguage(language)
+ }, [language, i18n])
+
+
+ const handleSubmitButton = () => {
+ if ([...type9Attachment, ...type12Attachment].length < 2) {
+ setDialogOpen(true)
+ } else {
+ handleSubmit()
+ }
+ }
+
+ return (
+
+ )
+}
+
+export default React.memo(ModDistAgreement)
diff --git a/src/containers/ModDistAgreement/ModDistAgreementData.js b/src/containers/ModDistAgreement/ModDistAgreementData.js
new file mode 100644
index 000000000..66703879b
--- /dev/null
+++ b/src/containers/ModDistAgreement/ModDistAgreementData.js
@@ -0,0 +1,149 @@
+import React from 'react'
+import Button from '@material-ui/core/Button'
+import { useTranslation } from 'react-i18next'
+import { makeStyles } from '@material-ui/core/styles'
+import Box from '@material-ui/core/Box'
+import Paper from '@material-ui/core/Paper'
+import Typography from '@material-ui/core/Typography'
+import Uploader from '../../components/Uploader'
+import StepHeader from 'components/StepHeader'
+import Success from '../Success'
+import {
+ allExtensionsValidation,
+ isTextFile
+} from '../../validators/FileTypeValidator'
+import TermsDialog from 'components/TermsDialog'
+import Alert from '@material-ui/lab/Alert'
+import CircularProgress from '@material-ui/core/CircularProgress'
+
+const URL_TEXT = '/form/upload_txt_attachment/1'
+
+const useStyles = makeStyles((theme) => ({
+ buttonContainer: {
+ display: 'flex',
+ justifyContent: 'flex-end'
+ },
+ button: {
+ marginTop: theme.spacing(1),
+ marginRight: theme.spacing(1)
+ },
+ paperContainer: {
+ marginTop: theme.spacing(2),
+ padding: theme.spacing(2)
+ }
+}))
+
+const ModDistAgreementData = (props) => {
+ const classes = useStyles()
+ const { t } = useTranslation()
+
+
+ const {
+ isDialogOpen,
+ setDialogOpen,
+ type9Attachment,
+ type12Attachment,
+ error,
+ isSendingData,
+ completed,
+ data,
+ updateAttachment,
+ handleSubmitButton,
+ handleSubmit
+ } = props
+
+ return (
+
+ {completed ? (
+
+ ) : (
+ <>
+
+
+
+
+
+
+
+
+ updateAttachment(values,'09')}
+ values={type9Attachment}
+ validTypeFiles={'UPDATE_DIST_ALL_ATTACHMENTS_INFO'}
+ maxFiles={1}
+ validationFileFunction={allExtensionsValidation}
+ />
+
+
+
+
+ updateAttachment(values, '12')}
+ values={type12Attachment}
+ validTypeFiles={'INSTALL_TXT_TYPE_ATTACHMENTS_INFO'}
+ uploadUrl={URL_TEXT}
+ maxFiles={1}
+ validationFileFunction={isTextFile}
+ />
+
+ {error ? {t(error)} : null}
+
+ {!isSendingData ? (
+ handleSubmitButton()}
+ className={classes.button}
+ variant="contained"
+ color="primary"
+ endIcon={''}>
+ {t('ENVIAR')}
+
+ ) : (
+
+ )}
+
+ {
+ setDialogOpen(false)
+ handleSubmit()
+ }}
+ onClose={() => setDialogOpen(false)}>
+
+
+ >
+ )}
+
+ )
+}
+
+export default React.memo(ModDistAgreementData)
diff --git a/src/i18n/locale-ca.json b/src/i18n/locale-ca.json
index ed1016719..efaaf27f5 100644
--- a/src/i18n/locale-ca.json
+++ b/src/i18n/locale-ca.json
@@ -69,6 +69,7 @@
"MODIFY_POTTAR_UNEXPECTED": "S'ha produït un error inesperat",
"MODIFY_POTTAR_UNEXPECTED_DETAILS": "Posa't en contacte amb modifica@somenergia.coop perquè et puguem donar un cop de mà. Per identificar-te, necessitarem saber el teu NIF i el número del contracte que vols modificar.",
"INSTALL_TYPE_ATTACHMENTS_INFO": "Formats permesos: pdf, jpg, jpeg. Mida màxima permesa: 5 MB.",
+ "INSTALL_TXT_TYPE_ATTACHMENTS_INFO": "Formats permesos: txt. Mida màxima permesa: 5 MB.",
"UNEXPECTED": "S'ha produït un error inesperat",
"UNEXPECTED_ERROR": "S'ha produït un error inesperat",
"INVALID_FILETYPE": "Format de fitxer no permès. Formats permesos: pdf, jpg, jpeg.",
@@ -524,5 +525,17 @@
"CANCELLATION_IN_PROGRESS": "El contracte ja té una petició de baixa en procés (revisa el teu correu electrònic)",
"BAD_TOKEN": "El token no és correcte",
"NOT_FOUND": "Petició de baixa no trobada",
- "DESCRIPTION_MAJ_ALERT": "A més del preu fix associat al cost de l'energia, establert per Som Energia i publicat a la nostra pàgina web, a partir de l'1 d'octubre la factura inclourà un import variable associat al mecanisme d'ajust establert al RDL 10/2022. Aquest import el calcularem per a cada període de facturació. Ponderarem el preu de cada hora del mecanisme d'ajust (publicat per OMIE) en funció del repartiment horari energètic d'un consumidor/a tipus (publicat per Red Eléctrica de España segons la Resolució de 23/12/2021). El preu obtingut el multiplicarem, en cada factura, per l'energia total consumida en el període de facturació. El mecanisme d’ajust al gas no aplica per als contractes de les Illes Canàries ni Balears."
+ "DESCRIPTION_MAJ_ALERT": "A més del preu fix associat al cost de l'energia, establert per Som Energia i publicat a la nostra pàgina web, a partir de l'1 d'octubre la factura inclourà un import variable associat al mecanisme d'ajust establert al RDL 10/2022. Aquest import el calcularem per a cada període de facturació. Ponderarem el preu de cada hora del mecanisme d'ajust (publicat per OMIE) en funció del repartiment horari energètic d'un consumidor/a tipus (publicat per Red Eléctrica de España segons la Resolució de 23/12/2021). El preu obtingut el multiplicarem, en cada factura, per l'energia total consumida en el període de facturació. El mecanisme d’ajust al gas no aplica per als contractes de les Illes Canàries ni Balears.",
+ "AUTO_PROCEDURE_INTRO":"L'empresa de distribució elèctrica de la teva zona ens comunica que s'ha de sol·licitar una modificació en l'acord de repartiment d'excedents de la instal·lació d'autoproducció col·lectiva amb CAU {{cau}} a la qual estàs associat.",
+ "AUTO_PROCEDURE_DOCS":"Per poder realitzar aquesta modificació serà necessari que ens facilitis la següent documentació:",
+ "AUTO_AGRREEMENT_DIST_FILE":"
Acord de rpartiment: Han de constar clarament els coeficients de repartiment per a cada CUPS, i la signatura de totes les persones titulars.
",
+ "AUTO_COEF_DIST_FILE":"Fitxer de coeficients de repartiment: Pots consultar el format d'aquest fitxer en el següent enllaç TED 1247/2021.",
+ "EMPTY_ATTACHMENTS":"No s'ha afegit cap document per enviar",
+ "UPDATE_AUTO_AGREEMENT_OK_DESCRIPTION":"Enviarem la sol·licitud a la distribuïdora de la teva zona, que s’encarregarà de validar-la i fer-la efectiva. Si cal, envia'ns la documentació relacionada amb aquest tràmit adjuntant-la a la resposta del correu de confirmació que rebràs en pocs minuts.",
+ "EMPTY_ATTACHMENTS_WARN_TITLE":"Falta completar la documentació",
+ "EMPTY_ATTACHMENTS_WARN_DESC":"Pots tramitar la petició igualment. Porperament ens posarem en contacte per facilitar la documentació",
+ "UPDATE_DIST_AGREEMENT_ERROR": "No s'ha pogut realitzar el tràmit. Sisplau, posa't en contacte amb nosaltres",
+ "UPDATE_DIST_INVALID_FILETYPE": "Format de fitxer no permès. Formats permesos: pdf, jpg, jpeg.",
+ "UPDATE_DIST_INVALID_TXT_FILETYPE": "Format de fitxer no permès. Format permès: txt.",
+ "UPDATE_DIST_ALL_ATTACHMENTS_INFO": "Formats permesos: pdf, jpg, jpeg. Mida màxima permesa: 5 MB."
}
diff --git a/src/i18n/locale-es.json b/src/i18n/locale-es.json
index 8046e72be..f03b2bde9 100644
--- a/src/i18n/locale-es.json
+++ b/src/i18n/locale-es.json
@@ -69,6 +69,7 @@
"MODIFY_POTTAR_UNEXPECTED": "Se ha producido un error inesperado",
"MODIFY_POTTAR_UNEXPECTED_DETAILS": "Ponte en contacto con modifica@somenergia.coop para que te podamos echar una mano. Para identificarte necesitaremos tu NIF y el número del contrato que quieres modificar.",
"INSTALL_TYPE_ATTACHMENTS_INFO": "Formatos permitidos: pdf, jpg, jpeg. Tamaño máximo: 5 MB.",
+ "INSTALL_TXT_TYPE_ATTACHMENTS_INFO": "Formatos permitidos: txt. Tamaño máximo: 5 MB.",
"UNEXPECTED": "Se ha producido un error inesperado",
"UNEXPECTED_ERROR": "Se ha producido un error inesperado",
"INVALID_FILETYPE": "Formato de archivo no permitido. Formatos permitidos: pdf, jpg, jpeg.",
@@ -524,6 +525,17 @@
"CANCELLATION_IN_PROGRESS": "El contrato ya tiene una petición de baja en proceso (revisa tu correo electrónico)",
"BAD_TOKEN": "El token no es correcto",
"NOT_FOUND": "Petición de baja no encontrada",
- "DESCRIPTION_MAJ_ALERT": "Además del precio fijo asociado al coste de la energía, establecido por Som Energia y publicado en nuestra página web, a partir del 1 de octubre la factura incluirá un importe variable asociado al mecanismo de ajuste establecido en el RDL 10/2022>. Este importe lo calcularemos para cada periodo de facturación. Ponderaremos el precio de cada hora del mecanismo de ajuste (publicado por OMIE) en función del reparto horario energético de un consumidor/a tipo (publicado por Red Eléctrica de España según la Resolución de 23/12/2021). El precio obtenido lo multiplicaremos, en cada factura, por la energía total consumida en el período de facturación. El mecanismo de ajuste del gas no aplica para los contratos de Baleares y Canarias."
-
+ "DESCRIPTION_MAJ_ALERT": "Además del precio fijo asociado al coste de la energía, establecido por Som Energia y publicado en nuestra página web, a partir del 1 de octubre la factura incluirá un importe variable asociado al mecanismo de ajuste establecido en el RDL 10/2022>. Este importe lo calcularemos para cada periodo de facturación. Ponderaremos el precio de cada hora del mecanismo de ajuste (publicado por OMIE) en función del reparto horario energético de un consumidor/a tipo (publicado por Red Eléctrica de España según la Resolución de 23/12/2021). El precio obtenido lo multiplicaremos, en cada factura, por la energía total consumida en el período de facturación. El mecanismo de ajuste del gas no aplica para los contratos de Baleares y Canarias.",
+ "AUTO_PROCEDURE_INTRO":"La empresa de distribución eléctrica de tu zona nos comunica que debe solicitarse una modificación en el acuerdo de reparto de excedentes de la instalación de autoproducción colectiva con CAU {{cau}} a la que estás asociado.",
+ "AUTO_PROCEDURE_DOCS":"Para poder realizar esta modificación será necesario que nos facilites la siguiente documentación:",
+ "AUTO_AGRREEMENT_DIST_FILE":"
Acuerdo de reparto: Deben constar claramente los coeficientes de reparto para cada CUPS, y la firma de todas las personas titulares.
",
+ "AUTO_COEF_DIST_FILE":"Archivo de coeficientes de reparto: Puedes consultar el formato de este archivo en el siguiente enlace TED 1247/2021.",
+ "EMPTY_ATTACHMENTS":"No se ha añadido ningún documento para enviar",
+ "UPDATE_AUTO_AGREEMENT_OK_DESCRIPTION":"Enviaremos la solicitud a la distribuidora de tu zona, que se encargará de validarla y hacerla efectiva. Si es necesario, envíanos la documentación relacionada con este trámite adjuntándola a la respuesta del correo de confirmación que recibirás en pocos minutos.",
+ "EMPTY_ATTACHMENTS_WARN_TITLE":"No has añadido la documentación",
+ "EMPTY_ATTACHMENTS_WARN_DESC":"Puedes tramitar la petición igualmente. Próximamente nos pondremos en contacto para facilitar la documentación",
+ "UPDATE_DIST_AGREEMENT_ERROR": "No se ha podido realizar el trámite. Por favor, ponte en contacto con nosotros",
+ "UPDATE_DIST_INVALID_FILETYPE": "Formato de archivo no permitido. Formatos permitidos: pdf, jpg, jpeg.",
+ "UPDATE_DIST_INVALID_TXT_FILETYPE": "Formato de archivo no permitido. Formato permitido: txt.",
+ "UPDATE_DIST_ALL_ATTACHMENTS_INFO": "Formatos permitidos: pdf, jpg, jpeg. Tamaño máximo: 5 MB."
}
diff --git a/src/i18n/locale-eu.json b/src/i18n/locale-eu.json
index 2a64999e1..8e3f7e76f 100644
--- a/src/i18n/locale-eu.json
+++ b/src/i18n/locale-eu.json
@@ -69,6 +69,7 @@
"MODIFY_POTTAR_UNEXPECTED": "Ustekabeko errorea gertatu da",
"MODIFY_POTTAR_UNEXPECTED_DETAILS": "Jar zaitez harremanetan modifica@somenergia.coop helbidearekin, eta lagunduko dizugu. Zu identifikatzeko, zure IFZ eta aldatu nahi duzun kontratuaren zenbakia behar ditugu.",
"INSTALL_TYPE_ATTACHMENTS_INFO": "Onartutako formatuak: pdf, jpg, jpeg. Gehienezko tamaina: 5 MB.",
+ "INSTALL_TXT_TYPE_ATTACHMENTS_INFO": "Onartutako formatuak: txt. Gehienezko tamaina: 5 MB.",
"UNEXPECTED": "Ustekabeko errorea gertatu da",
"UNEXPECTED_ERROR": "Ustekabeko errorea gertatu da",
"INVALID_FILETYPE": "Fitxategi-formatu hau ez da onartzen. Onartutako formatuak: pdf, jpg, jpeg.",
@@ -524,5 +525,17 @@
"CANCELLATION_IN_PROGRESS": "Kontratuaren baja emateko eskaera bat abian dago jada (sartu zure posta elektronikoan)",
"BAD_TOKEN": "Tokena ez da zuzena",
"NOT_FOUND": "Ez dugu aurkitu baja-eskaerarik",
- "DESCRIPTION_MAJ_ALERT": "Som Energiak ezarritako eta webgunean argitaratutako energiaren kostuaren prezio finkoaz gain, urriaren 1etik aurrera, fakturak 10/2022 Legegintzako Errege Dekretuan xedatutako doitzeko mekanismoaren ondoriozko zenbateko aldagarri bat barne hartuko du. Zenbateko hori fakturazio-aldi bakoitzean kalkulatuko dugu. Doitzeko mekanismoaren orduko prezioa (OMIEk argitaratuta) haztatuko dugu kontsumitzaile estandar baten energiaren ordutegi-banaketaren arabera (2021/12/23ko Ebazpenari jarraikiz Espainiako Red Eléctricak argitaratuta). Faktura bakoitzean, ondoriozko prezioa fakturazio-aldian kontsumitutako energia guztiaz biderkatuko dugu. Gasa doitzeko mekanismoa ez zaie aplikatuko Balearretako eta Kanarietako kontratuei."
+ "DESCRIPTION_MAJ_ALERT": "Som Energiak ezarritako eta webgunean argitaratutako energiaren kostuaren prezio finkoaz gain, urriaren 1etik aurrera, fakturak 10/2022 Legegintzako Errege Dekretuan xedatutako doitzeko mekanismoaren ondoriozko zenbateko aldagarri bat barne hartuko du. Zenbateko hori fakturazio-aldi bakoitzean kalkulatuko dugu. Doitzeko mekanismoaren orduko prezioa (OMIEk argitaratuta) haztatuko dugu kontsumitzaile estandar baten energiaren ordutegi-banaketaren arabera (2021/12/23ko Ebazpenari jarraikiz Espainiako Red Eléctricak argitaratuta). Faktura bakoitzean, ondoriozko prezioa fakturazio-aldian kontsumitutako energia guztiaz biderkatuko dugu. Gasa doitzeko mekanismoa ez zaie aplikatuko Balearretako eta Kanarietako kontratuei.",
+ "AUTO_PROCEDURE_INTRO":"Zure inguruko elektrizitatea banatzeko enpresak jakinarazten diguzu zurekin erlazionatuta zauden CAU {{cau}}rekin autoekoizpen kolektiboko instalazioaren soberakinen banaketa-hitzarmenean aldaketa bat eskatu behar dela.",
+ "AUTO_PROCEDURE_DOCS":"Aldaketa hau egiteko, beharrezkoa izango da dokumentazio hau ematea:",
+ "AUTO_AGRREEMENT_DIST_FILE":"
Banaketa-hitzarmena: CUPS bakoitzaren banaketa-koefizienteak behar dira. argi eta garbi adierazita, eta titular guztien sinadura
",
+ "AUTO_COEF_DIST_FILE":"Banaketa-koefizienteen fitxategia: Fitxategi honen formatua ondoko estekan kontsulta dezakezu TED 1247/2021",
+ "EMPTY_ATTACHMENTS":"Ez da dokumenturik gehitu bidaltzeko",
+ "UPDATE_AUTO_AGREEMENT_OK_DESCRIPTION":"Zure inguruko banatzaileari helaraziko diogu eskaera, hura baliozkotzeaz eta eraginkorra izateaz arduratuko dena. Beharrezkoa izanez gero, bidal iezaguzu prozedura honi dagokion dokumentazioa, baieztapenaren erantzunari erantsiz. minutu gutxi barru jasoko duzun mezu elektronikoa",
+ "EMPTY_ATTACHMENTS_WARN_TITLE":"Dokumentazioa osatu gabe dago",
+ "EMPTY_ATTACHMENTS_WARN_DESC":"Eskaera prozesatu dezakezu oraindik. Geroago zurekin harremanetan jarriko gara dokumentazioa errazteko",
+ "UPDATE_DIST_AGREEMENT_ERROR":"Prozedura ezin izan da egin. Mesedez, jarri gurekin harremanetan",
+ "UPDATE_DIST_INVALID_FILETYPE": "Baimendu gabeko fitxategi-formatua. Baimendutako formatuak: pdf, jpg, jpeg.",
+ "UPDATE_DIST_INVALID_TXT_FILETYPE": "Baimendu gabeko fitxategi-formatua. Baimendutako formatua: txt.",
+ "UPDATE_DIST_ALL_ATTACHMENTS_INFO": "Onartutako formatuak: pdf, jpg, jpeg. Gehienezko tamaina: 5 MB."
}
diff --git a/src/i18n/locale-gl.json b/src/i18n/locale-gl.json
index acd5a9c66..ab12ea0dd 100644
--- a/src/i18n/locale-gl.json
+++ b/src/i18n/locale-gl.json
@@ -69,6 +69,7 @@
"MODIFY_POTTAR_UNEXPECTED": "Produciuse un erro inesperado",
"MODIFY_POTTAR_UNEXPECTED_DETAILS": "Ponte en contacto con modifica@somenergia.coop para que che poidamos botar unha man. Para identificarte precisaremos o teu NIF e o número do contrato que queres modificar.",
"INSTALL_TYPE_ATTACHMENTS_INFO": "Formatos permitidos: pdf, jpg, jpeg. Tamaño máximo permitido: 5 MB.",
+ "INSTALL_TXT_TYPE_ATTACHMENTS_INFO":"Formatos permitidos: txt. Tamaño máximo permitido: 5 MB.",
"UNEXPECTED": "Produciuse un erro inesperado",
"UNEXPECTED_ERROR": "Produciuse un erro inesperado",
"INVALID_FILETYPE": "Formato de ficheiro non permitido. Formatos permitidos: pdf, jpg, jpeg.",
@@ -524,5 +525,17 @@
"CANCELLATION_IN_PROGRESS": "O contrato xa ten unha petición de baixa en proceso (revisa o teu correo electrónico)",
"BAD_TOKEN": "O token non é correcto",
"NOT_FOUND": "Petición de baixa non atopada",
- "DESCRIPTION_MAJ_ALERT": "Ademais do prezo fixo asociado ao custo da enerxía, establecido por Som Energia e publicado na nosa páxina web, a partir do 1 de outubro a factura incluirá un importe variábel asociado ao mecanismo de axuste establecido no RDL 10/2022. Este importe calcularémolo para cada periodo de facturación. Ponderaremos o prezo de cada hora do mecanismo de axuste (publicado por OMIE) en función do reparto horario enerxético dun consumidor/a tipo (publicado por Rede Eléctrica de España segundo a Resolución de 23/12/2021). O prezo obtido multiplicarémolo, en cada factura, pola enerxía total consumida no período de facturación. O mecanismo de axuste do gas non se aplica aos contratos de Baleares e as Canarias."
+ "DESCRIPTION_MAJ_ALERT": "Ademais do prezo fixo asociado ao custo da enerxía, establecido por Som Energia e publicado na nosa páxina web, a partir do 1 de outubro a factura incluirá un importe variábel asociado ao mecanismo de axuste establecido no RDL 10/2022. Este importe calcularémolo para cada periodo de facturación. Ponderaremos o prezo de cada hora do mecanismo de axuste (publicado por OMIE) en función do reparto horario enerxético dun consumidor/a tipo (publicado por Rede Eléctrica de España segundo a Resolución de 23/12/2021). O prezo obtido multiplicarémolo, en cada factura, pola enerxía total consumida no período de facturación. O mecanismo de axuste do gas non se aplica aos contratos de Baleares e as Canarias.",
+ "AUTO_PROCEDURE_INTRO":"A empresa distribuidora de enerxía eléctrica da súa zona infórmanos de que se debe solicitar unha modificación no convenio de distribución de excedentes da instalación de autoprodución colectiva co CAU {{cau}} que está asociado.",
+ "AUTO_PROCEDURE_DOCS":"Para realizar esta modificación será necesario que nos facilites a seguinte documentación:",
+ "AUTO_AGRREEMENT_DIST_FILE":"
Acordo de distribución: Os coeficientes de distribución de cada CUPS deberán constar claramente, e a sinatura de todos os titulares.
",
+ "AUTO_COEF_DIST_FILE":"Expediente de coeficientes de reparto: Podes consultar o formato deste ficheiro na seguinte ligazón TED 1247/2021.",
+ "EMPTY_ATTACHMENTS":"Non se engadiron documentos para enviar",
+ "UPDATE_AUTO_AGREEMENT_OK_DESCRIPTION":"Remitirémoslle a solicitude ao distribuidor da súa zona, que se encargará de validala e facela efectiva. Se é necesario, envíanos a documentación relacionada con este trámite axuntándoa á resposta da confirmación. correo electrónico que recibirá nuns minutos.",
+ "EMPTY_ATTACHMENTS_WARN_TITLE":"A documentación aínda está por completar",
+ "EMPTY_ATTACHMENTS_WARN_DESC":"Aínda podes procesar a solicitude. Porémonos en contacto contigo máis tarde para facilitar a documentación",
+ "UPDATE_DIST_AGREEMENT_ERROR": "Non se puido realizar o procedemento. Póñase en contacto connosco",
+ "UPDATE_DIST_INVALID_FILETYPE": "Formato de ficheiro non permitido. Formatos permitidos: pdf, jpg, jpeg.",
+ "UPDATE_DIST_INVALID_TXT_FILETYPE": "Formato de ficheiro non permitido. Formato permitido: txt.",
+ "UPDATE_DIST_ALL_ATTACHMENTS_INFO":"Formatos permitidos: pdf, jpg, jpeg. Tamaño máximo permitido: 5 MB."
}
diff --git a/src/services/api.js b/src/services/api.js
index 847557d96..7c2103fa6 100644
--- a/src/services/api.js
+++ b/src/services/api.js
@@ -19,7 +19,7 @@ export const modifyContract = async (data, token) => {
})
}
-export const uploadFile = async (name, file) => {
+export const uploadFile = async (name, file, uploadUrl) => {
const data = new FormData()
data.append('field', name)
data.append('uploaded_file', file)
@@ -33,9 +33,10 @@ export const uploadFile = async (name, file) => {
}
}
+ const callUrl = uploadUrl || '/form/upload_attachment/0'
return axios({
method: 'POST',
- url: `${API_BASE_URL}/form/upload_attachment`,
+ url: API_BASE_URL + callUrl,
data: data,
config: config
}).then((response) => {
@@ -382,3 +383,14 @@ export const confirmCancelContract = async (data) => {
return response?.data
})
}
+
+export const distribution_agreement = async (data,token) => {
+ return axios({
+ method: 'POST',
+ url: `${API_BASE_URL}/procedures/distribution_agreement`,
+ headers: { Authorization: token },
+ data: data,
+ }).then((response) => {
+ return response?.data
+ })
+}
diff --git a/src/testing/components/Uploader.test.js b/src/testing/components/Uploader.test.js
new file mode 100644
index 000000000..b595e64e1
--- /dev/null
+++ b/src/testing/components/Uploader.test.js
@@ -0,0 +1,259 @@
+import Uploader from '../../components/Uploader'
+import { I18nextProvider } from 'react-i18next'
+import i18n from '../testing-configuration/i18nForTests'
+import {
+ fireEvent,
+ render,
+ screen,
+ queryByAttribute,
+ getByText
+} from '@testing-library/react'
+import axios from 'axios'
+import MockAdapter from 'axios-mock-adapter'
+import { act } from 'react-dom/test-utils'
+import {
+ allExtensionsValidation,
+ isTextFile,
+ allExtensionsError,
+ isTextError
+} from '../../validators/FileTypeValidator'
+
+describe('Uploader', () => {
+ const getById = queryByAttribute.bind(null, 'id')
+ const txtFileName = 'filename.txt'
+ const pdfFileName = 'filename.pdf'
+ const uploaderId = 'uploader-id'
+ const uploadUrl = 'url/mock'
+ const fileHash = 'file-hash.txt'
+ const defaultError = 'MODIFY_POTTAR_UNEXPECTED'
+ const customError = 'HARRY_POTTAR_UNEXPECTED'
+ const validTypeFiles = 'INSTALL_TYPE_ATTACHMENTS_INFO'
+ const erroneousResponse = 'NOT_UPLOAD_OK'
+
+ const BASE_URL = undefined
+ let dom = {}
+ const callBackFnMock = jest.fn()
+ const mockPost = jest.spyOn(axios, 'post')
+
+ mockPost.mockImplementation((url) => {
+ return Promise.resolve({ data: 'HOLA' })
+ })
+
+ beforeEach(() => {
+ dom = render(
+
+
+
+ )
+ })
+
+ test('CallBack function is called when the component is rendered', () => {
+ expect(callBackFnMock).toBeCalledTimes(1)
+ expect(callBackFnMock).toBeCalledWith([])
+ })
+
+ test('CallBack function is called when change the input', async () => {
+ const mock = new MockAdapter(axios)
+ const response = { data: { code: 'UPLOAD_OK', file_hash: fileHash } }
+ mock.onPost(BASE_URL + uploadUrl).reply(200, response)
+
+ const inputComponent = getById(dom.container, 'uploader-id')
+
+ await act(async () => {
+ fireEvent.change(inputComponent, {
+ target: { name: txtFileName, files: [txtFileName] }
+ })
+ })
+
+ expect(callBackFnMock).toBeCalledWith([fileHash])
+ })
+
+ test('When the upload response is not UPLOAD_OK, show default error ', async () => {
+ const mock = new MockAdapter(axios)
+ const response = { data: { code: '' } }
+ mock.onPost(BASE_URL + uploadUrl).reply(200, response)
+
+ const inputComponent = getById(dom.container, 'uploader-id')
+
+ await act(async () => {
+ fireEvent.change(inputComponent, {
+ target: { name: txtFileName, files: [txtFileName] }
+ })
+ })
+
+ const errorMsg = getByText(dom.container, defaultError)
+ expect(errorMsg).toBeInTheDocument()
+ })
+
+ test('When the upload response is not UPLOAD_OK, show response code ', async () => {
+ const mock = new MockAdapter(axios)
+ const response = { data: { code: 'NOT_UPLOAD_OK' } }
+ mock.onPost(BASE_URL + uploadUrl).reply(200, response)
+
+ const inputComponent = getById(dom.container, 'uploader-id')
+
+ await act(async () => {
+ fireEvent.change(inputComponent, {
+ target: { name: txtFileName, files: [txtFileName] }
+ })
+ })
+
+ const errorMsg = getByText(dom.container, erroneousResponse)
+ expect(errorMsg).toBeInTheDocument()
+ })
+
+ test('When the upload response is an error, show default error', async () => {
+ const mock = new MockAdapter(axios)
+ const error = { data: { error: '' } }
+ mock.onPost(BASE_URL + uploadUrl).reply(500, error)
+
+ const inputComponent = getById(dom.container, 'uploader-id')
+
+ await act(async () => {
+ fireEvent.change(inputComponent, {
+ target: { name: txtFileName, files: [txtFileName] }
+ })
+ })
+
+ const errorMsg = getByText(dom.container, defaultError)
+ expect(errorMsg).toBeInTheDocument()
+ })
+
+ test('When the upload response is an error, show custom error', async () => {
+ const mock = new MockAdapter(axios)
+ const error = { code: customError }
+ mock.onPost(BASE_URL + uploadUrl).reply(500, error)
+
+ const inputComponent = getById(dom.container, 'uploader-id')
+
+ await act(async () => {
+ fireEvent.change(inputComponent, {
+ target: { name: txtFileName, files: [txtFileName] }
+ })
+ })
+
+ const errorMsg = getByText(dom.container, customError)
+ expect(errorMsg).toBeInTheDocument()
+ })
+
+ test('When validation function (allExtensionsValidation) fails', async () => {
+ dom = render(
+
+
+
+ )
+
+ const inputComponent = getById(dom.container, 'uploader-id')
+
+ await act(async () => {
+ fireEvent.change(inputComponent, {
+ target: { name: txtFileName, files: [txtFileName] }
+ })
+ })
+
+ const errorMsg = getByText(dom.container, allExtensionsError.msg)
+ expect(errorMsg).toBeInTheDocument()
+ })
+
+ test('When validation function (isTextFile) fails', async () => {
+ dom = render(
+
+
+
+ )
+
+ const inputComponent = getById(dom.container, 'uploader-id')
+
+ await act(async () => {
+ fireEvent.change(inputComponent, {
+ target: { name: pdfFileName, files: [pdfFileName] }
+ })
+ })
+
+ const errorMsg = getByText(dom.container, isTextError.msg)
+ expect(errorMsg).toBeInTheDocument()
+ })
+
+ test('Show validTypeFiles after click clean', async () => {
+ dom = render(
+
+
+
+ )
+
+ const errorMsgBeforeClean = getByText(dom.container, customError)
+ expect(errorMsgBeforeClean).toBeInTheDocument()
+
+ const cleanIcon = getById(dom.container, 'clean-icon')
+ await act(async () => {
+ fireEvent.click(cleanIcon)
+ })
+
+ const errorMsgAfterClean = screen.queryByText(customError)
+ expect(errorMsgAfterClean).toBeNull()
+
+ const validTypeFilesText = getByText(dom.container, validTypeFiles)
+ expect(validTypeFilesText).toBeInTheDocument()
+ })
+
+ test('Remove file from list after click delete', async () => {
+ dom = render(
+
+
+
+ )
+ const pdfFileBeforeDelete = getByText(dom.container, pdfFileName)
+ expect(pdfFileBeforeDelete).toBeInTheDocument()
+
+ const deleteIcon = getById(dom.container, 'delete-icon0')
+ await act(async () => {
+ fireEvent.click(deleteIcon)
+ })
+
+ const pdfFileAfterDelete = screen.queryByText(pdfFileName)
+ expect(pdfFileAfterDelete).toBeNull()
+
+ })
+
+ test('Remove file from list after click delete', async () => {
+ dom = render(
+
+
+
+ )
+ const fieldErrorText = getByText(dom.container, customError)
+ expect(fieldErrorText).toBeInTheDocument()
+
+ })
+
+})
diff --git a/src/testing/containers/ModDistAgreement/ModDistAgreementData.test.js b/src/testing/containers/ModDistAgreement/ModDistAgreementData.test.js
new file mode 100644
index 000000000..c6d18da7f
--- /dev/null
+++ b/src/testing/containers/ModDistAgreement/ModDistAgreementData.test.js
@@ -0,0 +1,220 @@
+import {
+ fireEvent,
+ render,
+ screen,
+ queryByAttribute
+} from '@testing-library/react'
+import ModDistAgreementData from '../../../containers/ModDistAgreement/ModDistAgreementData'
+import d1 from '../../mock_files/d1.json'
+import { I18nextProvider } from 'react-i18next'
+import i18n from '../../testing-configuration/i18nForTests'
+
+describe('ModDistAgreement', () => {
+ const updateAttachmentMock = jest.fn()
+ const handleSubmitButtonMock = jest.fn()
+ const setDialogOpenMock = jest.fn()
+ const handleSubmitMock = jest.fn()
+ const getById = queryByAttribute.bind(null, 'id')
+ let dom = {}
+
+ beforeEach(() => {
+ dom = render(
+
+
+
+ )
+ })
+
+ test('Is renderized properly', () => {
+ //CHECKING THE TITLE
+ const D1_TITLE = screen.getByText('DETAIL_D1_TITLE')
+ expect(D1_TITLE).toBeInTheDocument()
+ //CHECKING THE DESCRIPTION
+ const AUTO_INTRO = screen.getByText('AUTO_PROCEDURE_INTRO')
+ expect(AUTO_INTRO).toBeInTheDocument()
+ //CHECKING THE INFO ABOUT THE DOCUMENTATION
+ const AUTO_DOCS = screen.getByText('AUTO_PROCEDURE_DOCS')
+ expect(AUTO_DOCS).toBeInTheDocument()
+ //CHECKING THE TEXT OF THE DISTRIBUTION AGREEMENT INPUT
+ const AUTO_AGRREEMENT_DIST_FILE = screen.getByText(
+ 'AUTO_AGRREEMENT_DIST_FILE'
+ )
+ expect(AUTO_AGRREEMENT_DIST_FILE).toBeInTheDocument()
+ //CHECKING THE TEXT THAT EXPLAINS THE ALLOWED FORMATS FOR THE DISTRIBUTION AGREEMENT FILE
+ const UPDATE_DIST_ALL_ATTACHMENTS_INFO = screen.getByText(
+ 'UPDATE_DIST_ALL_ATTACHMENTS_INFO'
+ )
+ expect(UPDATE_DIST_ALL_ATTACHMENTS_INFO).toBeInTheDocument()
+
+ //CHECKING THE TEXT OF THE COEF OF DISTRIBUTION FILE
+ const AUTO_COEF_DIST_FILE = screen.getByText('AUTO_COEF_DIST_FILE')
+ expect(AUTO_COEF_DIST_FILE).toBeInTheDocument()
+
+ //CHECKING THE TEXT THAT EXPLAINS THE ALLOWED FORMATS FOR THE COEF DISTRIBUTION FILE
+ const INSTALL_TXT_TYPE_ATTACHMENTS_INFO = screen.getByText(
+ 'INSTALL_TXT_TYPE_ATTACHMENTS_INFO'
+ )
+ expect(INSTALL_TXT_TYPE_ATTACHMENTS_INFO).toBeInTheDocument()
+ //CHECKING THE TEXT OF THE SUBMIT BUTTON
+ const ENVIAR = screen.getByText('ENVIAR')
+ expect(ENVIAR).toBeInTheDocument()
+
+ //CHECKING THE INPUT OF TYPE 9 EXISTS
+ const input9 = getById(dom.container, 'type9-input-file')
+ expect(input9).toBeInTheDocument()
+
+ //CHECKING THE INPUT OF TYPE 12 EXISTS
+ const input12 = getById(dom.container, 'type12-input-file')
+ expect(input12).toBeInTheDocument()
+
+ //CHECKING THE SUCCESS COMPONENT NOT EXISTS
+ const completedDesc = screen.queryByText('UPDATE_AUTO_AGREEMENT_OK_DESCRIPTION')
+ expect(completedDesc).toBeNull()
+
+ //CHECKING THE ERROR COMPONENT NOT EXISTS
+ const errorComponent = getById(dom.container,'error-component')
+ expect(errorComponent).toBeNull()
+
+ //CHECKING THE LOADER COMPONENT NOT EXISTS
+ const loaderComponent = getById(dom.container,'circular-progress')
+ expect(loaderComponent).toBeNull()
+
+ })
+
+ test('The dialog is not renderized', () => {
+ //CHECKING THE POP UP NOT EXISTS
+ const dialog = screen.queryByText('EMPTY_ATTACHMENTS_WARN_TITLE')
+ expect(dialog).toBeNull()
+ })
+
+ test('The dialog is renderized', () => {
+ dom = render(
+
+
+
+ )
+ //CHECKING THE POP UP EXISTS
+ const dialog = screen.queryByText('EMPTY_ATTACHMENTS_WARN_TITLE')
+ expect(dialog).toBeInTheDocument()
+ })
+
+ test('When click submit button handleSubmitButton is called', () => {
+ //CHECKING THE INPUT OF TYPE 9 EXISTS
+ const submitButton = getById(dom.container, 'submit-button')
+ submitButton.click()
+ expect(handleSubmitButtonMock).toBeCalledTimes(1)
+ })
+
+ test('The dialog is renderized and click Accept', () => {
+ const dom = render(
+
+
+
+ )
+
+ const popupAcceptButton = screen.getByText('I_ACCEPT')
+ fireEvent.click(popupAcceptButton)
+ expect(setDialogOpenMock).toBeCalledWith(false)
+ expect(handleSubmitMock).toBeCalledTimes(1)
+
+ })
+
+ test('The dialog is renderized and click Decline', () => {
+ const dom = render(
+
+
+
+ )
+
+ const popupAcceptButton = screen.getByText('I_DECLINE')
+ fireEvent.click(popupAcceptButton)
+ expect(setDialogOpenMock).toBeCalledWith(false)
+ })
+
+ test('Appear the text that says us the process is completed', () => {
+ const dom = render(
+
+
+
+ )
+
+ const completedDesc = screen.getByText('UPDATE_AUTO_AGREEMENT_OK_DESCRIPTION')
+ expect(completedDesc).toBeInTheDocument()
+
+ })
+
+ test('There is an Error', () => {
+ const dom = render(
+
+
+
+ )
+
+ const errorComponent = getById(dom.container,'error-component')
+ expect(errorComponent).toBeInTheDocument()
+ const errorMessage = screen.getByText('ERROR_MESSAGE')
+ expect(errorMessage).toBeInTheDocument()
+
+ })
+
+ test('Show loader when is sending data', () => {
+ const dom = render(
+
+
+
+ )
+
+ const loaderComponent = getById(dom.container,'circular-progress')
+ expect(loaderComponent).toBeInTheDocument()
+
+ })
+
+})
diff --git a/src/testing/mock_files/d1.json b/src/testing/mock_files/d1.json
new file mode 100644
index 000000000..1f0187afd
--- /dev/null
+++ b/src/testing/mock_files/d1.json
@@ -0,0 +1 @@
+{"case_code": "050006558889", "state": "02A", "case_type": "D1", "name": "Modificaci\u00f3n coeficiente de reparto", "installed_power": 40.0, "cil": "", "installation_type": "Red interior da varios consumidores (instalaci\u00f3n de enlace)", "subsection": "Con excedentes y mecanismo de compensaci\u00f3n simplificado", "cau": "ES0031405505673001MP0FA000", "collective": true, "generator_technology": "[B11] - Instalaciones que \u00fanicamente utilicen la radiaci\u00f3n solar como energ\u00eda primaria mediante la tecnolog\u00eda fotovoltaica.", "ssaa": false, "register_section": "Con excedentes", "case_id": 466338, "to_validate": false, "token": "32810a65034964f39653d25a482aa1b29cebbe43048473f02cfef3a52b92464942d66a84b65e9632792902f1d26de7a0af6143ffb30a753d6820ba79cf71d977"}
\ No newline at end of file
diff --git a/src/testing/testing-configuration/i18nForTests.js b/src/testing/testing-configuration/i18nForTests.js
new file mode 100644
index 000000000..734820edc
--- /dev/null
+++ b/src/testing/testing-configuration/i18nForTests.js
@@ -0,0 +1,21 @@
+import i18n from 'i18next';
+import { initReactI18next } from 'react-i18next';
+
+i18n
+ .use(initReactI18next)
+ .init({
+ lng: 'ca',
+ fallbackLng: 'ca',
+
+ // have a common namespace used around the full app
+ ns: ['translationsNS'],
+ defaultNS: 'translationsNS',
+
+ interpolation: {
+ escapeValue: false, // not needed for react!!
+ },
+
+ resources: { en: { translationsNS: {} } },
+ });
+
+export default i18n;
\ No newline at end of file
diff --git a/src/testing/validator/FileTypeValidator.test.js b/src/testing/validator/FileTypeValidator.test.js
new file mode 100644
index 000000000..bab9ab7d0
--- /dev/null
+++ b/src/testing/validator/FileTypeValidator.test.js
@@ -0,0 +1,42 @@
+import {allExtensionsValidation, isTextFile, allExtensionsError, isTextError} from '../../validators/FileTypeValidator'
+
+
+ describe('File Type Validator', () => {
+
+ const pdfFileName = 'pdffile.pdf'
+ const jpgFileName = 'jpgfile.jpg'
+ const jpegFileName = 'jpegfile.jpeg'
+ const txtFileName = 'txtfile.txt'
+
+ test('Check all extensions validation with pdf file, should be true', () => {
+ let validationResult = allExtensionsValidation(pdfFileName)
+ expect(validationResult).toBeTruthy()
+ })
+
+ test('Check all extensions validation with jpg file, should be true', () => {
+ let validationResult = allExtensionsValidation(jpgFileName)
+ expect(validationResult).toBeTruthy()
+ })
+
+ test('Check all extensions validation with jpeg file, should be true', () => {
+ let validationResult = allExtensionsValidation(jpegFileName)
+ expect(validationResult).toBeTruthy()
+ })
+
+ test('Check all extensions validation with txt file, should be Error', () => {
+ let validationResult = allExtensionsValidation(txtFileName)
+ expect(validationResult).toBe(allExtensionsError)
+ })
+
+ test('Check all extensions validation with txt file, should be true', () => {
+ let validationResult = isTextFile(txtFileName)
+ expect(validationResult).toBeTruthy()
+ })
+
+ test('Check all extensions validation with pdf file, should be Error', () => {
+ let validationResult = isTextFile(pdfFileName)
+ expect(validationResult).toBe(isTextError)
+ })
+
+ })
+
\ No newline at end of file
diff --git a/src/validators/FileTypeValidator.js b/src/validators/FileTypeValidator.js
new file mode 100644
index 000000000..369d589b1
--- /dev/null
+++ b/src/validators/FileTypeValidator.js
@@ -0,0 +1,12 @@
+export const allExtensionsError = {result:false,msg:"UPDATE_DIST_INVALID_FILETYPE"}
+export const isTextError = {result:false,msg:"UPDATE_DIST_INVALID_TXT_FILETYPE"}
+
+export const allExtensionsValidation = (fileName) => {
+ let allowedExtensions = /(.jpg|.jpeg|.pdf)$/i;
+ return allowedExtensions.test(fileName) ? {result:true} : allExtensionsError
+}
+
+export const isTextFile = (fileName) => {
+ let allowedExtensions = /(.txt)$/i;
+ return allowedExtensions.test(fileName) ? {result:true} : isTextError
+}
\ No newline at end of file