WIP: #6943 improve_sections_and_e2e #998

Draft
jsegarra wants to merge 10 commits from 6943_improve_sections_and_e2e into dev
29 changed files with 571 additions and 39 deletions

View File

@ -0,0 +1,42 @@
#!/bin/bash
# Verificar si se pasaron los parámetros correctos
if [ "$#" -ne 3 ]; then
echo "Uso: $0 <id_tarea> <modulo> <e2e_path>"
exit 1
fi
# Asignar parámetros a variables
ID_TAREA=$1
MODULO=$2
E2E_PATH=$3
# Nombre de la rama
BRANCH_NAME="${ID_TAREA}_${MODULO}_missing_e2e"
# Paso 1: Crear la rama local a partir de dev
git checkout dev
git pull origin dev
git checkout -b "${BRANCH_NAME}"
# Paso 2: Copiar archivos al directorio destino
SOURCE_DIR="../salix/e2e/paths/${E2E_PATH}"
DEST_DIR="../test-processing/tests"
mkdir -p "${DEST_DIR}"
cp -r "${SOURCE_DIR}"/* "${DEST_DIR}"
# Paso 3: Ejecutar el comando node
cd ../test-processing
PROCESS_SCRIPT="../test-processing/index.js"
node "${PROCESS_SCRIPT}"
cd ../salix-front
# Paso 4: Copiar archivos procesados al destino Cypress
PROCESSED_DIR="../test-processing/processedTests"
CYPRESS_DEST="./test/cypress/integration/${MODULO}"
mkdir -p "${CYPRESS_DEST}"
cp -r "${PROCESSED_DIR}"/* "${CYPRESS_DEST}"
# Confirmación final
echo "Flujo completado exitosamente. Revisa los resultados."

View File

@ -0,0 +1,43 @@
#!/bin/bash
# Verificar si se pasaron los parámetros correctos
if [ "$#" -ne 3 ]; then
echo "Uso: $0 <id_tarea> <modulo> <e2e_path>"
exit 1
fi
# Asignar parámetros a variables
ID_TAREA=$1
MODULO=$2
E2E_PATH=$3
# Nombre de la rama
BRANCH_NAME="${ID_TAREA}_${MODULO}_missing_e2e"
# Paso 1: Crear la rama local a partir de dev
echo "git checkout dev"
echo "git pull origin dev"
echo "git checkout -b ${BRANCH_NAME}"
# Paso 2: Copiar archivos al directorio destino
SOURCE_DIR="../salix/e2e/paths/${E2E_PATH}"
DEST_DIR="../test-processing/tests"
echo "mkdir -p ${DEST_DIR}"
echo "cp -r ${SOURCE_DIR}/* ${DEST_DIR}"
# Paso 3: Ejecutar el comando node
echo "cd ../test-processing"
PROCESS_SCRIPT="../test-processing/index.js"
echo "node ${PROCESS_SCRIPT}"
echo "cd ../salix-front"
# Paso 4: Copiar archivos procesados al destino Cypress
PROCESSED_DIR="../test-processing/processedTests"
CYPRESS_DEST="./test/cypress/integration/${MODULO}"
echo "mkdir -p ${CYPRESS_DEST}"
echo "cp -r ${PROCESSED_DIR}/* ${CYPRESS_DEST}"
# Confirmación final
echo "Flujo completado (pendiente de ejecución real). Valida los comandos antes de proceder."

BIN
import_e2e.zip Normal file

Binary file not shown.

View File

@ -11,6 +11,7 @@
"lint": "eslint --ext .js,.vue ./",
"format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
"test:e2e": "cypress open",
"test:e2e:run": "cypress run",
"test:e2e:ci": "npm run resetDatabase && cd ../salix-front && cypress run",
"test": "echo \"See package.json => scripts for available tests.\" && exit 0",
"test:unit": "vitest",
@ -64,4 +65,4 @@
"vite": "^5.1.4",
"vitest": "^0.31.1"
}
}
}

View File

@ -18,6 +18,7 @@ import parsePhone from './parsePhone';
import isDialogOpened from './isDialogOpened';
export {
isDialogOpened,
getUpdatedValues,
getDifferences,
isDialogOpened,

View File

@ -2,6 +2,7 @@
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
import VnInputDate from 'components/common/VnInputDate.vue';
import FormModel from 'components/FormModel.vue';
import FetchData from 'components/FetchData.vue';
@ -38,45 +39,43 @@ const filterClientFindOne = {
}
"
/>
<QCard>
<FormModel
v-if="'unpaid' in initialData"
:observe-form-changes="false"
ref="formModelRef"
model="unpaid"
url-update="ClientUnpaids"
:mapper="(formData) => ({ ...formData, clientFk: route.params.id })"
:form-initial-data="initialData"
>
<template #form="{ data }">
<VnRow>
<QCheckbox :label="t('Unpaid client')" v-model="data.unpaid" />
</VnRow>
<FormModel
v-if="'unpaid' in initialData"
:observe-form-changes="false"
ref="formModelRef"
model="unpaid"
url-update="ClientUnpaids"
:mapper="(formData) => ({ ...formData, clientFk: route.params.id })"
:form-initial-data="initialData"
>
<template #form="{ data }">
<VnRow>
<QCheckbox :label="t('Unpaid client')" v-model="data.unpaid" />
</VnRow>
<VnRow class="row q-gutter-md q-mb-md" v-show="data.unpaid">
<div class="col">
<VnInputDate
data-cy="customerUnpaidDate"
:label="t('Date')"
v-model="data.dated"
/>
</div>
<div class="col">
<VnInputNumber
data-cy="customerUnpaidAmount"
ref="amountInputRef"
:label="t('Amount')"
clearable
v-model="data.amount"
autofocus
>
<template #append></template></VnInputNumber
>
</div>
</VnRow>
</template>
</FormModel>
</QCard>
<VnRow class="row q-gutter-md q-mb-md" v-show="data.unpaid">
<div class="col">
<VnInputDate
data-cy="customerUnpaidDate"
:label="t('Date')"
v-model="data.dated"
/>
</div>
<div class="col">
<VnInputNumber
data-cy="customerUnpaidAmount"
ref="amountInputRef"
:label="t('Amount')"
clearable
v-model="data.amount"
autofocus
>
<template #append></template></VnInputNumber
>
</div>
</VnRow>
</template>
</FormModel>
</template>
<i18n>

View File

@ -0,0 +1,22 @@
describe.skip('Client create path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/list', {
timeout: 5000,
});
});
it(`should search for the user Carol Danvers to confirm it isn't created yet`, async () => {});
it('should now access to the create client view by clicking the create-client floating button', async () => {});
it('should receive an error when clicking the create button having name and Business name fields empty', async () => {});
it(`should create a new province`, async () => {});
it(`should create a new city`, async () => {});
it(`should create a new post code`, async () => {});
it(`should attempt to create a new user with all it's data but wrong email`, async () => {});
it(`should attempt to create a new user with all it's data but wrong business type`, async () => {});
it(`should attempt to create a new user with all it's data but wrong postal code`, async () => {});
it(`should check for autocompleted city, province and country`, async () => {});
it(`should create a new user with all correct data`, async () => {});
it('should click on the Clients button of the top bar menu', async () => {});
it(`should search for the user Carol Danvers to confirm it exists`, async () => {});
});

View File

@ -0,0 +1,38 @@
describe.skip('Client Edit basicData path', () => {
describe('as employee', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/basic-data', {
timeout: 5000,
});
});
it('should not be able to change the salesPerson', async () => {});
it('should edit the client basic data but leave salesPerson untainted', async () => {});
it('should confirm the name have been edited', async () => {});
it('should confirm the contact name have been edited', async () => {});
it('should confirm the business type have been edited', async () => {});
it('should confirm the email have been edited', async () => {});
it('should confirm the channel have been selected', async () => {});
it('should confirm the previous client have been selected', async () => {});
});
describe('as salesAssistant', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/basic-data', {
timeout: 5000,
});
});
it('should navigate to a client basic data', async () => {});
it('should be able to change the salesPerson', async () => {});
it('should edit the client basic data including salesPerson', async () => {});
it('should now confirm the name have been edited', async () => {});
it('should now confirm the contact name have been edited', async () => {});
it('should now confirm the email have been edited', async () => {});
it('should now confirm the phone have been edited', async () => {});
it('should now confirm the mobile have been edited', async () => {});
it('should confirm the sales person have been selected', async () => {});
it('should now confirm the channel have been selected', async () => {});
});
});

View File

@ -0,0 +1,39 @@
describe.skip('Client Edit fiscalData path', () => {
describe('as employee', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/fiscal-data', {
timeout: 5000,
});
});
it(`should click on the 1st edit icon to check EQtax isnt checked`, async () => {});
it(`should go back to addresses then select the second one and confirm the EQtax isnt checked`, async () => {});
it(`should click on the fiscal data button`, async () => {});
it('should not be able to edit the verified data checkbox', async () => {});
});
describe('as administrative', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/fiscal-data', {
timeout: 5000,
});
});
it(`should edit the fiscal data but fail as the fiscal id ain't valid`, async () => {});
it(`should edit the fiscal this time with a valid fiscal id`, async () => {});
it('should propagate the Equalization tax', async () => {});
it('should receive an error if the fiscal id contains A or B at the beginning', async () => {});
it('should edit the fiscal data correctly as VIES isnt checked and fiscal id is valid for EQtax', async () => {});
it(`should click on the addresses button to access to the client's addresses`, async () => {});
it(`should click on the 1st edit icon to confirm EQtax is checked`, async () => {});
it(`should go back to addresses then select the second one and confirm the EQtax is checked`, async () => {});
it('should navigate back to fiscal data and uncheck EQtax then check VIES', async () => {});
it('should propagate the Equalization tax changes', async () => {});
it('should confirm its name have been edited', async () => {});
it('should confirm the fiscal data have been edited', async () => {});
it(`should click on the addresses button to access to the client's addresses`, async () => {});
it(`should click on the 1st edit icon to access the address details and uncheck EQtax checkbox`, async () => {});
it('should navigate back to fiscal data to confirm invoice by address is now checked', async () => {});
});
});

View File

@ -0,0 +1,15 @@
describe.skip('Client ient Edit billing data path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/billing-data', {
timeout: 5000,
});
});
it(`should attempt to edit the billing data without an IBAN but fail`, async () => {});
it(`should edit the billing data and save the form`, async () => {});
it(`should create a new BIC code`, async () => {});
it(`should confirm the IBAN pay method was sucessfully saved`, async () => {});
it(`should clear the BIC code field, update the IBAN to see how he BIC code autocompletes`, async () => {});
it('should confirm the billing data have been edited', async () => {});
});

View File

@ -0,0 +1,22 @@
describe.skip('Client ient Add address path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/adresses', {
timeout: 5000,
});
});
it(`should click on the add new address button to access to the new address form`, async () => {});
it('should receive an error after clicking save button as consignee, street and town fields are empty', async () => {});
it('should confirm that the city and province are propertly filled', async () => {});
it(`should throw after clicking save button as consignee, incoterms and customsAgent are empty`, async () => {});
it(`should receive an error after clicking save button as customsAgent is empty`, async () => {});
it(`should create a new custom agent and then save the address`, async () => {});
it(`should navigate back to the addresses index`, async () => {});
it(`should confirm the new address exists and it's the default one`, async () => {});
it('should click on the make default icon of the second address', async () => {});
it(`should confirm the default address is the expected one`, async () => {});
it(`should click on the edit icon of the default address`, async () => {});
it(`should click on the active checkbox and receive an error to save it because it is the default address`, async () => {});
it(`should go back to the addreses section by clicking the cancel button`, async () => {});
});

View File

@ -0,0 +1,13 @@
describe.skip('Client ient add address notes path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it(`should click on the edit icon of the default address`, async () => {});
it('should not save a description without observation type', async () => {});
it('should not save an observation type without description', async () => {});
it('should create two new observations', async () => {});
});

View File

@ -0,0 +1,10 @@
describe.skip('Client ient web access path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/web-access', {
timeout: 5000,
});
});
it('should modify and save web access attributes', async () => {});
});

View File

@ -0,0 +1,12 @@
describe.skip('Client ient Add credit path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it(`should click on the add credit button`, async () => {});
it(`should edit the credit`, async () => {});
it('should confirm the credit was updated', async () => {});
});

View File

@ -0,0 +1,12 @@
describe.skip('Client ient Add greuge path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it(`should click on the add greuge button`, async () => {});
it(`should receive an error if all fields are empty but date and type on submit`, async () => {});
it(`should create a new greuge with all its data and confirm the greuge was added to the list`, async () => {});
});

View File

@ -0,0 +1,10 @@
describe.skip('Client ient mandate path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should confirm the client has a mandate of the CORE type', async () => {});
});

View File

@ -0,0 +1,63 @@
describe.skip('Client ient lock verified data path', () => {
describe('as salesPerson', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should confirm verified data button is disabled for salesPerson', async () => {});
it('should edit the social name', async () => {});
it('should confirm the social name have been edited', async () => {});
});
describe('as administrative', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should confirm verified data button is enabled for administrative', async () => {});
it('should check the Verified data checkbox', async () => {});
it('should confirm Verified data checkbox is checked', async () => {});
it('should again edit the social name', async () => {});
it('should again confirm the social name have been edited', async () => {});
});
describe('as salesPerson second run', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should confirm verified data button is disabled once again for salesPerson', async () => {});
it('should not be able to save change throwing a verified data error', async () => {});
});
describe('as salesAssistant', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should log in as salesAssistant then get to the client fiscal data', async () => {});
it('should confirm verified data button is enabled for salesAssistant', async () => {});
it('should now edit the social name', async () => {});
it('should now confirm the social name have been edited once and for all', async () => {});
});
describe('as salesPerson third run', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should confirm verified data button is enabled once again', async () => {});
it('should confirm the form is enabled for salesPerson', async () => {});
});
});

View File

@ -0,0 +1,11 @@
describe.skip('Client ient log path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should update the clients name', async () => {});
it('should navigate to the log section', async () => {});
});

View File

@ -0,0 +1,17 @@
describe.skip('Client balance path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should now edit the local user config data', async () => {});
it('should create a new payment that clears the debt', async () => {});
it('should edit the 1st line reference and check data', async () => {});
it('should create a new payment, check the cash comparison works correctly and balance value is -100', async () => {});
it('should create a new payment and check the cash exceeded the maximum', async () => {});
it('should create a new payment that sets the balance back to negative value and check it', async () => {});
it('should now click on the Clients button of the top bar menu', async () => {});
it('should now search for the user Petter Parker not check the payment button is not present', async () => {});
});

View File

@ -0,0 +1,37 @@
describe('User config', () => {
describe('as salesPerson', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should login', async () => {});
it('should now open the user config form to check the settings', async () => {});
});
describe('as employee', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should log in', async () => {});
it('should open the user config form to check the settings', async () => {});
it('should now edit the user config data', async () => {});
});
describe('as salesPerson 2nd run', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should log in once more', async () => {});
it('should again open the user config form to check the local settings', async () => {});
it('should now clear the local settings', async () => {});
});
});

View File

@ -0,0 +1,22 @@
describe.skip('Client ient web Payment', () => {
describe('as employee', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should not be able to confirm payments', async () => {});
});
describe('as administrative', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should be able to confirm payments', async () => {});
});
});

View File

@ -0,0 +1,13 @@
describe.skip('Client DMS', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
describe('as salesPerson', () => {
it('should delete de first file', async () => {});
it(`should click on the first document line worker name making the descriptor visible`, async () => {});
});
});

View File

@ -0,0 +1,11 @@
describe.skip('Client ient contacts', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should add a contact', async () => {});
it('should delete de contact', async () => {});
});

View File

@ -0,0 +1,19 @@
describe.skip('Client ient summary path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should reach the first route summary section', async () => {});
it('should display details from the client on the header', async () => {});
it('should display some basic data', async () => {});
it('should display fiscal address details', async () => {});
it('should display some fiscal data', async () => {});
it('should display pay method details', async () => {});
it('should display default address details', async () => {});
it('should display web access details', async () => {});
it('should display business data', async () => {});
it('should display financial information', async () => {});
});

View File

@ -0,0 +1,22 @@
describe.skip('Client credit insurance path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should open the create a new credit contract form', async () => {});
it('should create a new credit contract', async () => {});
it(`should verify the addNewContract button is not present since there's an active contract`, async () => {});
it(`should click the view credits button`, async () => {});
it('should click the add new credit button which opens the new credit form', async () => {});
it('should fill the form but provide no grade to the new credit hence fail', async () => {});
it('should provide a correct grade and succesfully save a new credit', async () => {});
it('should be redirected to the credit index', async () => {});
it('should check the amount of credits is the expected', async () => {});
it('should navigate to the credit insurance section', async () => {});
it('should bring the current contract to an end', async () => {});
it(`should verify the addNewContract button is now present since there's no active contract`, async () => {});
it(`should verify the endCurrentContract button is not present since there's no active contract`, async () => {});
});

View File

@ -0,0 +1,15 @@
describe.skip('Client defaulter path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it('should count the amount of clients in the turns section', async () => {});
it('should check contain expected client', async () => {});
it('should first observation not changed', async () => {});
it('should not add empty observation', async () => {});
it('should checked all defaulters', async () => {});
it('should add observation for all clients', async () => {});
});

View File

@ -0,0 +1,12 @@
describe.skip('Client unpaid path', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/unpaid', {
timeout: 5000,
});
});
it('should set cliet unpaid', async () => {});
it('should save unpaid', async () => {});
it('should confirm the unpaid have been saved', async () => {});
});

View File

@ -0,0 +1,10 @@
describe.skip('Client Send balance compensation', () => {
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
cy.visit('#/customer/1110/credits', {
timeout: 5000,
});
});
it(`should click on send compensation button`, async () => {});
});

View File

@ -5,6 +5,7 @@ describe('Client basic data', () => {
cy.login('developer');
cy.visit('#/customer/1102/basic-data');
});
it('Should load layout', () => {
cy.get('.q-card').should('be.visible');
cy.dataCy('customerPhone').filter('input').should('be.visible');