feat: consulta pública de pedidos por código

This commit is contained in:
2026-08-09 23:48:55 -05:00
parent 7a7939e309
commit 1af4d2052d
24 changed files with 2639 additions and 33 deletions

View File

@@ -0,0 +1,47 @@
import { beforeEach, describe, expect, it } from 'vitest'
import { mount } from '@vue/test-utils'
import OrderAccessInfo from '@/components/order/OrderAccessInfo.vue'
import vuetify from '@/plugins/vuetify'
function mountAccessInfo (code) {
return mount(OrderAccessInfo, {
props: { code },
global: { plugins: [vuetify] },
})
}
describe('OrderAccessInfo', () => {
beforeEach(() => {
navigator.clipboard.writeText.mockClear()
})
it('muestra el código del pedido', () => {
const wrapper = mountAccessInfo('abc123')
expect(wrapper.text()).toContain('abc123')
})
it('muestra el link público construido con el código', () => {
const wrapper = mountAccessInfo('abc123')
expect(wrapper.text()).toContain(
`${window.location.origin}/pedido/abc123`
)
})
it('copia el link al presionar el botón de copiar link', async () => {
const wrapper = mountAccessInfo('abc123')
await wrapper.find('[data-test="copy-link"]').trigger('click')
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
`${window.location.origin}/pedido/abc123`
)
})
it('copia el código al presionar el botón de copiar código', async () => {
const wrapper = mountAccessInfo('abc123')
await wrapper.find('[data-test="copy-code"]').trigger('click')
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('abc123')
})
})

View File

@@ -0,0 +1,88 @@
import { describe, expect, it } from 'vitest'
import { mount } from '@vue/test-utils'
import PublicOrderSummary from '@/components/PublicOrderSummary.vue'
import OrderAccessInfo from '@/components/order/OrderAccessInfo.vue'
import OrderCustomer from '@/components/order/OrderCustomer.vue'
import OrderLines from '@/components/order/OrderLines.vue'
import OrderTotal from '@/components/order/OrderTotal.vue'
import OrderPayment from '@/components/order/OrderPayment.vue'
import vuetify from '@/plugins/vuetify'
const saleData = {
id: 5,
code: 'abc123',
date: '2024-09-02T00:00:00Z',
customer: { id: 1, name: 'Camilo' },
payment_method: 'CASH',
lines: [
{ product: { id: 10, name: 'Panela' }, quantity: 2, unit_price: 3000 },
{ product: { id: 11, name: 'Arroz' }, quantity: 1, unit_price: 5000 },
],
type: 'sale',
}
const catalogData = {
id: 7,
code: 'def456',
date: '2024-09-02T00:00:00Z',
customer: { id: 1, name: 'Camilo' },
lines: [{ product: { id: 10, name: 'Panela' }, quantity: 2, unit_price: 3000 }],
type: 'catalog',
}
function mountSummary (props) {
return mount(PublicOrderSummary, {
props,
global: { plugins: [vuetify] },
})
}
describe('PublicOrderSummary', () => {
it('renderiza el resumen de una venta con sus partes', () => {
const wrapper = mountSummary({ purchase: saleData })
expect(wrapper.findComponent(OrderAccessInfo).exists()).toBe(true)
expect(wrapper.findComponent(OrderCustomer).exists()).toBe(true)
expect(wrapper.findComponent(OrderLines).exists()).toBe(true)
expect(wrapper.findComponent(OrderTotal).exists()).toBe(true)
expect(wrapper.findComponent(OrderPayment).exists()).toBe(true)
expect(wrapper.text()).toContain('Camilo')
expect(wrapper.text()).toContain('Panela')
expect(wrapper.text()).toContain('Arroz')
expect(wrapper.text().replace(/\u00A0/g, ' ')).toContain('11.000')
})
it('renderiza un pedido de catálogo sin bloque de pago', () => {
const wrapper = mountSummary({ purchase: catalogData })
expect(wrapper.findComponent(OrderAccessInfo).exists()).toBe(true)
expect(wrapper.findComponent(OrderCustomer).exists()).toBe(true)
expect(wrapper.findComponent(OrderLines).exists()).toBe(true)
expect(wrapper.findComponent(OrderTotal).exists()).toBe(true)
expect(wrapper.findComponent(OrderPayment).exists()).toBe(false)
expect(wrapper.text()).toContain('Camilo')
expect(wrapper.text()).toContain('Panela')
})
it('muestra el estado de carga', () => {
const wrapper = mountSummary({ purchase: null, loading: true })
expect(wrapper.text()).toContain('Cargando')
})
it('muestra el mensaje de error cuando lo recibe', () => {
const wrapper = mountSummary({
purchase: null,
error: 'No se encontró un pedido con ese código.',
})
expect(wrapper.text()).toContain('No se encontró un pedido con ese código.')
})
it('no renderiza datos cuando no hay pedido, carga ni error', () => {
const wrapper = mountSummary({ purchase: null })
expect(wrapper.text()).not.toContain('Camilo')
expect(wrapper.findComponent(OrderLines).exists()).toBe(false)
})
})