8282-testToMaster #1057

Merged
alexm merged 215 commits from 8282-testToMaster into master 2024-12-10 06:23:36 +00:00
18 changed files with 130 additions and 39 deletions
Showing only changes of commit 8e411125bf - Show all commits

View File

@ -394,7 +394,7 @@ watch(formUrl, async () => {
@click="onSubmit" @click="onSubmit"
:disable="!hasChanges" :disable="!hasChanges"
:title="t('globals.save')" :title="t('globals.save')"
data-testid="crudModelDefaultSaveBtn" data-cy="crudModelDefaultSaveBtn"
/> />
<slot name="moreAfterActions" /> <slot name="moreAfterActions" />
</QBtnGroup> </QBtnGroup>

View File

@ -737,7 +737,7 @@ function handleSelection({ evt, added, rows: selectedRows }, rows) {
fab fab
icon="add" icon="add"
shortcut="+" shortcut="+"
data-testid="vnTableCreateBtn" data-cy="vnTableCreateBtn"
/> />
<QTooltip self="top right"> <QTooltip self="top right">
{{ createForm?.title }} {{ createForm?.title }}

View File

@ -86,7 +86,7 @@ async function send() {
</script> </script>
<template> <template>
<QDialog ref="dialogRef" data-testid="vnSmsDialog"> <QDialog ref="dialogRef" data-cy="vnSmsDialog">
<QCard class="q-pa-sm"> <QCard class="q-pa-sm">
<QCardSection class="row items-center q-pb-none"> <QCardSection class="row items-center q-pb-none">
<span class="text-h6 text-grey"> <span class="text-h6 text-grey">
@ -161,7 +161,7 @@ async function send() {
:loading="isLoading" :loading="isLoading"
color="primary" color="primary"
unelevated unelevated
data-testid="sendSmsBtn" data-cy="sendSmsBtn"
/> />
</QCardActions> </QCardActions>
</QCard> </QCard>

View File

@ -104,7 +104,6 @@ function cancel() {
unelevated unelevated
autofocus autofocus
data-cy="VnConfirm_confirm" data-cy="VnConfirm_confirm"
data-testid="vnConfirmConfirmBtn"
/> />
</QCardActions> </QCardActions>
</QCard> </QCard>

View File

@ -130,7 +130,7 @@ async function search() {
dense dense
standout standout
autofocus autofocus
data-testid="vnSearchBar" data-cy="vnSearchBar"
> >
<template #prepend> <template #prepend>
<QIcon <QIcon

View File

@ -100,7 +100,7 @@ async function remove() {
</QMenu> </QMenu>
</QItem> </QItem>
<QSeparator /> <QSeparator />
<QItem @click="confirmRemove()" v-ripple clickable> <QItem @click="confirmRemove()" v-ripple clickable data-cy="deleteClaim">
<QItemSection avatar> <QItemSection avatar>
<QIcon name="delete" /> <QIcon name="delete" />
</QItemSection> </QItemSection>

View File

@ -130,7 +130,7 @@ function ticketFilter(ticket) {
<QBadge <QBadge
text-color="black" text-color="black"
:color="entity.ticketState.state.classColor" :color="entity.ticketState.state.classColor"
data-testid="ticketDescriptorStateBadge" data-cy="ticketDescriptorStateBadge"
> >
{{ entity.ticketState.state.name }} {{ entity.ticketState.state.name }}
</QBadge> </QBadge>

View File

@ -75,7 +75,7 @@ const cancel = () => {
dense dense
style="width: 50%" style="width: 50%"
@click="save()" @click="save()"
data-testid="saveManaBtn" data-cy="saveManaBtn"
> >
{{ t('globals.save') }} {{ t('globals.save') }}
</QBtn> </QBtn>

View File

@ -86,14 +86,14 @@ async function handleSave() {
option-value="id" option-value="id"
v-model="row.observationTypeFk" v-model="row.observationTypeFk"
:disable="!!row.id" :disable="!!row.id"
data-testid="ticketNotesObservationType" data-cy="ticketNotesObservationType"
/> />
<VnInput <VnInput
:label="t('basicData.description')" :label="t('basicData.description')"
v-model="row.description" v-model="row.description"
class="col" class="col"
@keyup.enter="handleSave" @keyup.enter="handleSave"
data-testid="ticketNotesDescription" data-cy="ticketNotesDescription"
/> />
<QIcon <QIcon
name="delete" name="delete"
@ -101,7 +101,7 @@ async function handleSave() {
class="cursor-pointer" class="cursor-pointer"
color="primary" color="primary"
@click="handleDelete(row)" @click="handleDelete(row)"
data-testid="ticketNotesRemoveNoteBtn" data-cy="ticketNotesRemoveNoteBtn"
> >
<QTooltip> <QTooltip>
{{ t('ticketNotes.removeNote') }} {{ t('ticketNotes.removeNote') }}
@ -116,7 +116,7 @@ async function handleSave() {
class="fill-icon-on-hover q-ml-md" class="fill-icon-on-hover q-ml-md"
color="primary" color="primary"
@click="ticketNotesCrudRef.insert()" @click="ticketNotesCrudRef.insert()"
data-testid="ticketNotesAddNoteBtn" data-cy="ticketNotesAddNoteBtn"
> >
<QTooltip> <QTooltip>
{{ t('ticketNotes.addNote') }} {{ t('ticketNotes.addNote') }}

View File

@ -577,7 +577,7 @@ watch(
color="primary" color="primary"
:disable="!isTicketEditable || ticketState === 'OK'" :disable="!isTicketEditable || ticketState === 'OK'"
@click="changeTicketState('OK')" @click="changeTicketState('OK')"
data-testid="ticketSaleOkStateBtn" data-cy="ticketSaleOkStateBtn"
> >
<QTooltip>{{ t(`Change ticket state to 'Ok'`) }}</QTooltip> <QTooltip>{{ t(`Change ticket state to 'Ok'`) }}</QTooltip>
</QBtn> </QBtn>
@ -586,7 +586,7 @@ watch(
color="primary" color="primary"
:label="t('ticketList.state')" :label="t('ticketList.state')"
:disable="!isTicketEditable" :disable="!isTicketEditable"
data-testid="ticketSaleStateDropdown" data-cy="ticketSaleStateDropdown"
> >
<VnSelect <VnSelect
:options="editableStatesOptions" :options="editableStatesOptions"
@ -596,7 +596,7 @@ watch(
hide-dropdown-icon hide-dropdown-icon
focus-on-mount focus-on-mount
@update:model-value="changeTicketState" @update:model-value="changeTicketState"
data-testid="ticketSaleStateSelect" data-cy="ticketSaleStateSelect"
/> />
</QBtnDropdown> </QBtnDropdown>
<TicketSaleMoreActions <TicketSaleMoreActions
@ -629,6 +629,7 @@ watch(
icon="vn:splitline" icon="vn:splitline"
:disable="!isTicketEditable || !hasSelectedRows" :disable="!isTicketEditable || !hasSelectedRows"
@click="setTransferParams()" @click="setTransferParams()"
data-cy="ticketSaleTransferBtn"
> >
<QTooltip>{{ t('Transfer lines') }}</QTooltip> <QTooltip>{{ t('Transfer lines') }}</QTooltip>
<TicketTransfer <TicketTransfer
@ -708,7 +709,13 @@ watch(
{{ t('ticketSale.visible') }}: {{ row.visible || 0 }} {{ t('ticketSale.visible') }}: {{ row.visible || 0 }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row.reserved" color="primary" name="vn:reserva" size="xs"> <QIcon
v-if="row.reserved"
color="primary"
name="vn:reserva"
size="xs"
data-cy="ticketSaleReservedIcon"
>
<QTooltip> <QTooltip>
{{ t('ticketSale.reserved') }} {{ t('ticketSale.reserved') }}
</QTooltip> </QTooltip>
@ -867,7 +874,7 @@ watch(
fab fab
icon="add" icon="add"
shortcut="+" shortcut="+"
data-testid="ticketSaleAddToBasketBtn" data-cy="ticketSaleAddToBasketBtn"
/> />
<QTooltip class="text-no-wrap"> <QTooltip class="text-no-wrap">
{{ t('Add item to basket') }} {{ t('Add item to basket') }}

View File

@ -179,7 +179,7 @@ const createRefund = async (withWarehouse) => {
color="primary" color="primary"
:label="t('ticketSale.more')" :label="t('ticketSale.more')"
:disable="disable" :disable="disable"
data-testid="ticketSaleMoreActionsDropdown" data-cy="ticketSaleMoreActionsDropdown"
> >
<template #label> <template #label>
<QTooltip>{{ t('Select lines to see the options') }}</QTooltip> <QTooltip>{{ t('Select lines to see the options') }}</QTooltip>
@ -191,7 +191,7 @@ const createRefund = async (withWarehouse) => {
v-close-popup v-close-popup
v-ripple v-ripple
@click="showSmsDialog('productNotAvailable')" @click="showSmsDialog('productNotAvailable')"
data-testid="sendShortageSMSItem" data-cy="sendShortageSMSItem"
> >
<QItemSection> <QItemSection>
<QItemLabel>{{ t('Send shortage SMS') }}</QItemLabel> <QItemLabel>{{ t('Send shortage SMS') }}</QItemLabel>
@ -203,7 +203,7 @@ const createRefund = async (withWarehouse) => {
v-close-popup v-close-popup
v-ripple v-ripple
@click="calculateSalePrice()" @click="calculateSalePrice()"
data-testid="recalculatePriceItem" data-cy="recalculatePriceItem"
> >
<QItemSection> <QItemSection>
<QItemLabel>{{ t('Recalculate price') }}</QItemLabel> <QItemLabel>{{ t('Recalculate price') }}</QItemLabel>
@ -213,7 +213,7 @@ const createRefund = async (withWarehouse) => {
clickable clickable
v-ripple v-ripple
@click="emit('getMana')" @click="emit('getMana')"
data-testid="updateDiscountItem" data-cy="updateDiscountItem"
> >
<QItemSection> <QItemSection>
<QItemLabel>{{ t('Update discount') }}</QItemLabel> <QItemLabel>{{ t('Update discount') }}</QItemLabel>
@ -223,7 +223,7 @@ const createRefund = async (withWarehouse) => {
v-model.number="newDiscount" v-model.number="newDiscount"
:label="t('ticketSale.discount')" :label="t('ticketSale.discount')"
type="number" type="number"
data-testid="ticketSaleDiscountInput" data-cy="ticketSaleDiscountInput"
/> />
</TicketEditManaProxy> </TicketEditManaProxy>
</QItem> </QItem>
@ -233,7 +233,7 @@ const createRefund = async (withWarehouse) => {
v-close-popup v-close-popup
v-ripple v-ripple
@click="createClaim()" @click="createClaim()"
data-testid="createClaimItem" data-cy="createClaimItem"
> >
<QItemSection> <QItemSection>
<QItemLabel>{{ t('Add claim') }}</QItemLabel> <QItemLabel>{{ t('Add claim') }}</QItemLabel>
@ -245,6 +245,7 @@ const createRefund = async (withWarehouse) => {
v-close-popup v-close-popup
v-ripple v-ripple
@click="setReserved(true)" @click="setReserved(true)"
data-cy="markAsReservedItem"
> >
<QItemSection> <QItemSection>
<QItemLabel>{{ t('Mark as reserved') }}</QItemLabel> <QItemLabel>{{ t('Mark as reserved') }}</QItemLabel>
@ -256,12 +257,13 @@ const createRefund = async (withWarehouse) => {
v-close-popup v-close-popup
v-ripple v-ripple
@click="setReserved(false)" @click="setReserved(false)"
data-cy="unmarkAsReservedItem"
> >
<QItemSection> <QItemSection>
<QItemLabel>{{ t('Unmark as reserved') }}</QItemLabel> <QItemLabel>{{ t('Unmark as reserved') }}</QItemLabel>
</QItemSection> </QItemSection>
</QItem> </QItem>
<QItem clickable v-ripple> <QItem clickable v-ripple data-cy="ticketSaleRefundItem">
<QItemSection> <QItemSection>
<QItemLabel>{{ t('Refund') }}</QItemLabel> <QItemLabel>{{ t('Refund') }}</QItemLabel>
</QItemSection> </QItemSection>
@ -270,12 +272,22 @@ const createRefund = async (withWarehouse) => {
</QItemSection> </QItemSection>
<QMenu anchor="top end" self="top start" auto-close bordered> <QMenu anchor="top end" self="top start" auto-close bordered>
<QList> <QList>
<QItem v-ripple clickable @click="createRefund(true)"> <QItem
v-ripple
clickable
@click="createRefund(true)"
data-cy="ticketSaleRefundWithWarehouse"
>
<QItemSection> <QItemSection>
{{ t('with warehouse') }} {{ t('with warehouse') }}
</QItemSection> </QItemSection>
</QItem> </QItem>
<QItem v-ripple clickable @click="createRefund(false)"> <QItem
v-ripple
clickable
@click="createRefund(false)"
data-cy="ticketSaleRefundWithoutWarehouse"
>
<QItemSection> <QItemSection>
{{ t('without warehouse') }} {{ t('without warehouse') }}
</QItemSection> </QItemSection>

View File

@ -100,7 +100,7 @@ function toTicketUrl(section) {
ref="summaryRef" ref="summaryRef"
:url="`Tickets/${entityId}/summary`" :url="`Tickets/${entityId}/summary`"
data-key="TicketSummary" data-key="TicketSummary"
data-testid="ticketSummary" data-cy="ticketSummary"
> >
<template #header-left> <template #header-left>
<VnToSummary <VnToSummary

View File

@ -91,7 +91,7 @@ onMounted(() => (_transfer.value = $props.transfer));
</script> </script>
<template> <template>
<QPopupProxy ref="QPopupProxyRef"> <QPopupProxy ref="QPopupProxyRef" data-cy="ticketTransferPopup">
<QCard class="q-px-md" style="display: flex; width: 80vw"> <QCard class="q-px-md" style="display: flex; width: 80vw">
<QTable <QTable
:rows="transfer.sales" :rows="transfer.sales"

View File

@ -57,6 +57,7 @@ defineExpose({ transferSales });
v-model.number="_transfer.ticketId" v-model.number="_transfer.ticketId"
:label="t('Transfer to ticket')" :label="t('Transfer to ticket')"
:clearable="false" :clearable="false"
data-cy="ticketTransferDestinationTicketInput"
> >
<template #append> <template #append>
<QBtn <QBtn
@ -64,6 +65,7 @@ defineExpose({ transferSales });
color="primary" color="primary"
@click="transferSales(_transfer.ticketId)" @click="transferSales(_transfer.ticketId)"
style="width: 30px" style="width: 30px"
data-cy="ticketTransferTransferBtn"
/> />
</template> </template>
</VnInput> </VnInput>
@ -72,6 +74,7 @@ defineExpose({ transferSales });
color="primary" color="primary"
class="full-width q-my-lg" class="full-width q-my-lg"
@click="transferSales()" @click="transferSales()"
data-cy="ticketTransferNewTicketBtn"
/> />
</QForm> </QForm>
</template> </template>

View File

@ -461,7 +461,7 @@ function setReference(data) {
data-key="TicketList" data-key="TicketList"
:label="t('Search ticket')" :label="t('Search ticket')"
:info="t('You can search by ticket id or alias')" :info="t('You can search by ticket id or alias')"
data-testid="ticketListSearchBar" data-cy="ticketListSearchBar"
/> />
<RightMenu> <RightMenu>
<template #right-panel> <template #right-panel>
@ -489,7 +489,7 @@ function setReference(data) {
'row-key': 'id', 'row-key': 'id',
selection: 'multiple', selection: 'multiple',
}" }"
data-testid="ticketListTable" data-cy="ticketListTable"
> >
<template #column-statusIcons="{ row }"> <template #column-statusIcons="{ row }">
<div class="q-gutter-x-xs"> <div class="q-gutter-x-xs">

View File

@ -10,16 +10,16 @@ describe('TicketRequest', () => {
cy.dataCy('ticketNotesAddNoteBtn').should('exist'); cy.dataCy('ticketNotesAddNoteBtn').should('exist');
cy.dataCy('ticketNotesAddNoteBtn').click(); cy.dataCy('ticketNotesAddNoteBtn').click();
cy.dataCy('ticketNotesObservationType').should('exist'); cy.dataCy('ticketNotesObservationType').should('exist');
cy.selectOption('[data-testid="ticketNotesObservationType"]:last', 'Weight'); cy.selectOption('[data-cy="ticketNotesObservationType"]:last', 'Weight');
cy.dataCy('ticketNotesDescription').should('exist'); cy.dataCy('ticketNotesDescription').should('exist');
cy.get('[data-testid="ticketNotesDescription"]:last').type( cy.get('[data-cy="ticketNotesDescription"]:last').type(
'This is a note description' 'This is a note description'
); );
cy.dataCy('crudModelDefaultSaveBtn').click(); cy.dataCy('crudModelDefaultSaveBtn').click();
cy.checkNotification('Data saved'); cy.checkNotification('Data saved');
cy.dataCy('ticketNotesRemoveNoteBtn').should('exist'); cy.dataCy('ticketNotesRemoveNoteBtn').should('exist');
cy.dataCy('ticketNotesRemoveNoteBtn').click(); cy.dataCy('ticketNotesRemoveNoteBtn').click();
cy.dataCy('vnConfirmConfirmBtn').click(); cy.dataCy('VnConfirm_confirm').click();
cy.checkNotification('Data saved'); cy.checkNotification('Data saved');
}); });
}); });

View File

@ -1,5 +1,7 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
const c = require('croppie');
describe('TicketSale', () => { describe('TicketSale', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
@ -26,7 +28,7 @@ describe('TicketSale', () => {
it('should send SMS', () => { it('should send SMS', () => {
selectFirstRow(); selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click(); cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.waitForElement('[data-testid="sendShortageSMSItem"]'); cy.waitForElement('[data-cy="sendShortageSMSItem"]');
cy.dataCy('sendShortageSMSItem').should('exist'); cy.dataCy('sendShortageSMSItem').should('exist');
cy.dataCy('sendShortageSMSItem').click(); cy.dataCy('sendShortageSMSItem').click();
cy.dataCy('vnSmsDialog').should('exist'); cy.dataCy('vnSmsDialog').should('exist');
@ -38,7 +40,7 @@ describe('TicketSale', () => {
cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice'); cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice');
selectFirstRow(); selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click(); cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.waitForElement('[data-testid="recalculatePriceItem"]'); cy.waitForElement('[data-cy="recalculatePriceItem"]');
cy.dataCy('recalculatePriceItem').should('exist'); cy.dataCy('recalculatePriceItem').should('exist');
cy.dataCy('recalculatePriceItem').click(); cy.dataCy('recalculatePriceItem').click();
cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200); cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200);
@ -48,14 +50,82 @@ describe('TicketSale', () => {
it('should update discount when "Update discount" is clicked', () => { it('should update discount when "Update discount" is clicked', () => {
selectFirstRow(); selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click(); cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.waitForElement('[data-testid="updateDiscountItem"]'); cy.waitForElement('[data-cy="updateDiscountItem"]');
cy.dataCy('updateDiscountItem').should('exist'); cy.dataCy('updateDiscountItem').should('exist');
cy.dataCy('updateDiscountItem').click(); cy.dataCy('updateDiscountItem').click();
cy.waitForElement('[data-testid="ticketSaleDiscountInput"]'); cy.waitForElement('[data-cy="ticketSaleDiscountInput"]');
cy.dataCy('ticketSaleDiscountInput').find('input').focus(); cy.dataCy('ticketSaleDiscountInput').find('input').focus();
cy.dataCy('ticketSaleDiscountInput').find('input').type('10'); cy.dataCy('ticketSaleDiscountInput').find('input').type('10');
cy.dataCy('saveManaBtn').click(); cy.dataCy('saveManaBtn').click();
cy.waitForElement('.q-notification__message'); cy.waitForElement('.q-notification__message');
cy.checkNotification('Data saved'); cy.checkNotification('Data saved');
}); });
it('adds claim', () => {
selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.dataCy('createClaimItem').click();
cy.dataCy('VnConfirm_confirm').click();
cy.url().should('match', /\/claim\/\d+\/basic-data/);
// Delete created claim to avoid cluttering the database
cy.dataCy('descriptor-more-opts').click();
cy.dataCy('deleteClaim').click();
cy.dataCy('VnConfirm_confirm').click();
cy.checkNotification('Data deleted');
});
it('marks row as reserved', () => {
selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.waitForElement('[data-cy="markAsReservedItem"]');
cy.dataCy('markAsReservedItem').click();
cy.dataCy('ticketSaleReservedIcon').should('exist');
});
it('unmarks row as reserved', () => {
selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.waitForElement('[data-cy="unmarkAsReservedItem"]');
cy.dataCy('unmarkAsReservedItem').click();
cy.dataCy('ticketSaleReservedIcon').should('not.exist');
});
it('refunds row with warehouse', () => {
selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.dataCy('ticketSaleRefundItem').click();
cy.dataCy('ticketSaleRefundWithWarehouse').click();
cy.checkNotification('The following refund ticket have been created');
});
it('refunds row without warehouse', () => {
selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.dataCy('ticketSaleRefundItem').click();
cy.dataCy('ticketSaleRefundWithoutWarehouse').click();
cy.checkNotification('The following refund ticket have been created');
});
it('transfers ticket', () => {
cy.visit('/#/ticket/32/sale');
selectFirstRow();
cy.dataCy('ticketSaleTransferBtn').click();
cy.dataCy('ticketTransferPopup').should('exist');
cy.dataCy('ticketTransferNewTicketBtn').click();
// existen 3 elementos "tbody" necesito checkear que el segundo elemento tbody tenga una row sola
cy.get('tbody').eq(1).find('tr').should('have.length', 1);
selectFirstRow();
cy.dataCy('ticketSaleTransferBtn').click();
cy.dataCy('ticketTransferPopup').should('exist');
cy.dataCy('ticketTransferDestinationTicketInput').find('input').focus();
cy.dataCy('ticketTransferDestinationTicketInput').find('input').type('32');
cy.dataCy('ticketTransferTransferBtn').click();
// checkear que la url contenga /ticket/1000002/sale
cy.url().should('match', /\/ticket\/32\/sale/);
});
it('should redirect to ticket logs', () => {
cy.get(firstRow).find('.q-btn:last').click();
cy.url().should('match', /\/ticket\/31\/log/);
});
}); });

View File

@ -312,6 +312,6 @@ Cypress.Commands.add('searchByLabel', (label, value) => {
cy.get(`[label="${label}"] > .q-field > .q-field__inner`).type(`${value}{enter}`); cy.get(`[label="${label}"] > .q-field > .q-field__inner`).type(`${value}{enter}`);
}); });
Cypress.Commands.add('dataCy', (dataTestId, attr = 'data-testid') => { Cypress.Commands.add('dataCy', (dataTestId, attr = 'data-cy') => {
return cy.get(`[${attr}="${dataTestId}"]`); return cy.get(`[${attr}="${dataTestId}"]`);
}); });