Cypress initial config and tests #90

Merged
jsegarra merged 26 commits from wbuezas/hedera-web-mindshore:feature/CypressInit into 4922-vueMigration 2024-11-12 12:24:41 +00:00
12 changed files with 103 additions and 5 deletions
Showing only changes of commit ff423ae79b - Show all commits

View File

@ -73,6 +73,7 @@
"test:e2e": "cd ../salix && gulp docker && cd ../hedera-web && cypress run",
"cy:open-mindshore": "cd ../salix && gulp docker && cd ../hedera-web-mindshore && cypress open",

no entiendo la diferencia entre hedera-web y hedera-web-mindshore

no entiendo la diferencia entre hedera-web y hedera-web-mindshore

Que uno luego del gulp docker va al proyecto de hedera-web y el otro al proyecto hedera-web-mindshore (fork), eso luego pueden eliminarlo, lo uso para poder desarrollar en el fork

Que uno luego del `gulp docker` va al proyecto de `hedera-web` y el otro al proyecto `hedera-web-mindshore` (fork), eso luego pueden eliminarlo, lo uso para poder desarrollar en el fork
"test:e2e-mindshore": "cd ../salix && gulp docker && cd ../hedera-web-mindshore && cypress run",
"resetDatabase": "cd ../salix && gulp docker",

si definimos este script, no podemos usarlo en el resto?

si definimos este script, no podemos usarlo en el resto?

Si, claro que se puede, ahí lo apliqué.

Commit: 40444ac46a

Si, claro que se puede, ahí lo apliqué. Commit: https://gitea.verdnatura.es/verdnatura/hedera-web/commit/40444ac46a8fe7d223684268a313ca0432af5ecf
"build": "rm -rf build/ ; webpack",
"clean": "rm -rf build/",
"lint": "eslint --ext .js,.vue ./"

View File

@ -87,7 +87,9 @@ const logoutSupplantedUser = async () => {
</QToolbar>
<div class="user-info">
<div>
<span id="user-name">{{ mainUser?.nickname }}</span>
<span id="user-name" data-testid="layoutUserName">
{{ mainUser?.nickname }}
</span>
<QBtn
flat
icon="logout"
@ -96,7 +98,12 @@ const logoutSupplantedUser = async () => {
data-testid="logoutButton"
/>
</div>
<div v-if="supplantedUser" id="supplant" class="supplant">
<div
v-if="supplantedUser"
id="supplant"
class="supplant"
data-testid="layoutSupplantedUserName"
>
<span id="supplanted">
{{ supplantedUser?.nickname }}
</span>

View File

@ -115,6 +115,7 @@ onMounted(() => fetchLanguagesSql());
:label="t('nickname')"
@keyup.enter="updateUserNickname(data.nickname)"
@blur="updateUserNickname(data.nickname)"
data-testid="configViewNickname"
/>
<VnSelect
v-model="data.lang"

View File

@ -47,6 +47,7 @@ const supplantUser = async user => {
search-field="user"
@on-search="onSearch"
@on-search-error="users = []"
data-testid="usersViewSearchBar"
/>
</Teleport>
<QPage class="vn-w-xs">
@ -56,11 +57,13 @@ const supplantUser = async user => {
empty-icon="refresh"
:loading="loading"
:rows="users"
data-testid="usersViewList"
>
<CardList
v-for="(user, index) in users"
:key="index"
:to="{ name: 'accessLog', params: { id: user.id } }"
data-testid="userViewCard"
>
<template #content>
<span class="text-bold q-mb-sm">
@ -75,6 +78,7 @@ const supplantUser = async user => {
flat
rounded
@click.stop.prevent="supplantUser(user.name)"
data-testid="usersViewSupplantUserBtn"
>
<QTooltip>
{{ t('Impersonate user') }}

View File

@ -122,6 +122,7 @@ const fetchData = async () => {
:to="{ name: 'confirm', params: { id: orderId } }"
rounded
no-caps
data-testid="basketToConfirmBtn"
>
<QTooltip>{{ t('checkout') }}</QTooltip>
</QBtn>

View File

@ -111,7 +111,7 @@ const deleteRow = id => {
</QCardSection>
<QSeparator v-if="showItems" inset />
<QList v-for="(row, index) in rows" :key="index">
<QItem v-if="row">
<QItem v-if="row" data-testid="basketItemRow">
<QItemSection v-if="canDeleteItems" avatar>
<QBtn
icon="delete"

View File

@ -1,10 +1,21 @@
describe('User flow: Login, create a new order, add item to basket', () => {
describe('User flow: Login, create a new order, add item to basket and go to confirm view', () => {
it('success', () => {
// 2- Loguear como empleado
// 1- Loguear como empleado
cy.login('employee');
// 2- Crear una orden
cy.createOrderReceiveFlow();
// 3- Filtrar items y agregar item al carrito
cy.addItemToBasketFlow();
// 4- Ir al carrito
cy.dataCy('catalogGoToBasketButton').should('exist');
cy.dataCy('catalogGoToBasketButton').click();
cy.url().should('contain', '/#/ecomerce/basket');
// 5- Verificar que el item se agregó al carrito
cy.dataCy('basketItemRow').should('exist');
cy.dataCy('basketItemRow').should('have.length', 1);
// 6- Ir a la vista de confirmación
cy.dataCy('basketToConfirmBtn').should('exist');
cy.dataCy('basketToConfirmBtn').click();
cy.url().should('contain', '/#/ecomerce/confirm');
});
});

View File

@ -0,0 +1,10 @@
Cypress.Commands.add('userViewSupplant', user => {
cy.dataCy('usersViewSearchBar').should('exist');
cy.get('input[data-testid="usersViewSearchBar"]').type(`${user}{enter}`);
cy.dataCy('layoutSupplantedUserName').should('not.exist');
cy.dataCy('usersViewList').should('not.contain', 'Sin datos');
cy.dataCy('userViewCard').should('exist');
cy.dataCy('usersViewSupplantUserBtn').click();
cy.dataCy('layoutSupplantedUserName').should('exist');
cy.dataCy('layoutSupplantedUserName').should('contain', user);
});

View File

@ -0,0 +1,32 @@
describe('UsersView', () => {
beforeEach(() => {
cy.login('adminboss');
cy.visit('/#/admin/users');
});
afterEach(() => {
cy.logout();
});
it('should show empty state when entering the view', () => {
cy.dataCy('usersViewList').should('contain', 'Sin datos');
});
it('supplants user', () => {
cy.userViewSupplant('Bruce Wayne');
cy.getSessionStorage('supplantUser').should('equal', 'brucewayne');
});
it('makes actions for the supplanted user', () => {
cy.userViewSupplant('Bruce Wayne');
cy.wait(100);
cy.visit('/#/account/conf');
cy.url().should('contain', '/#/account/conf');
cy.changeUserNickname('Bruce Wayne', 'New test nickname');
cy.dataCy('layoutSupplantedUserName').should(
'contain',
'New test nickname'
);
cy.clearDB();
});
});

View File

@ -0,0 +1,12 @@
Cypress.Commands.add('changeUserNickname', (oldNickname, newNickname) => {
const nicknameInput = 'input[data-testid="configViewNickname"]';
cy.get(nicknameInput).should('exist');
cy.getValue('input[data-testid="configViewNickname"]').should(
'equal',
oldNickname
);
cy.get(nicknameInput).clear();
cy.get(nicknameInput).type(newNickname);
cy.get(nicknameInput).blur();
cy.dataCy('positiveNotify').should('contain', 'Datos guardados');
});

View File

@ -0,0 +1,5 @@
describe('Changes user nickname', () => {
it('success', () => {
cy.changeUserNickname('Bruce Wayne', 'New test nickname');
});
});

View File

@ -63,8 +63,22 @@ Cypress.Commands.add('getSessionStorage', key => {
cy.window().then(window => window.sessionStorage.getItem(key));
});
Cypress.Commands.add('getLocalStorage', key => {
cy.window().then(window => window.localStorage.getItem(key));
});
Cypress.Commands.add('setLocalStorage', (key, value) => {
cy.window().then(window => {
window.localStorage.setItem(key, value);
});
});
Cypress.Commands.add('setSessionStorage', (key, value) => {
cy.window().then(window => {
window.sessionStorage.setItem(key, value);
});
});
Cypress.Commands.add('clearDB', () => {
cy.exec('npm run resetDatabase');
});