import { beforeEach, describe, expect, it, vi } from 'vitest' import { flushPromises, mount } from '@vue/test-utils' import { createMemoryHistory, createRouter } from 'vue-router' import PedidoPage from '@/pages/pedido/[[code]].vue' import PublicOrderSummary from '@/components/PublicOrderSummary.vue' import vuetify from '@/plugins/vuetify' const saleData = { id: 1, 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 }, ], type: 'sale', } async function mountPage (api, path) { const router = createRouter({ history: createMemoryHistory(), routes: [{ path: '/pedido/:code?', component: PedidoPage }], }) router.push(path) await router.isReady() const wrapper = mount(PedidoPage, { global: { plugins: [router, vuetify], provide: { api }, }, }) return { router, wrapper } } async function waitForRouteParam (router, param, value, timeout = 1000) { const start = Date.now() while (Date.now() - start < timeout) { if (router.currentRoute.value.params[param] === value) return await new Promise(resolve => setTimeout(resolve, 10)) } throw new Error(`route param ${param} nunca llegó a ser ${value}`) } describe('página pública /pedido', () => { beforeEach(() => { vi.clearAllMocks() }) it('sin código no consulta la API y muestra el buscador', async () => { const api = { getPublicOrderSummary: vi.fn() } const { wrapper } = await mountPage(api, '/pedido') await flushPromises() expect(api.getPublicOrderSummary).not.toHaveBeenCalled() expect(wrapper.text()).toContain('Código') }) it('con código por URL consulta y muestra el resumen', async () => { const api = { getPublicOrderSummary: vi.fn().mockResolvedValue(saleData) } const { wrapper } = await mountPage(api, '/pedido/abc123') await flushPromises() expect(api.getPublicOrderSummary).toHaveBeenCalledWith('abc123') expect(wrapper.findComponent(PublicOrderSummary).props('purchase')).toEqual(saleData) expect(wrapper.text()).toContain('Camilo') }) it('muestra mensaje de no encontrado cuando el código no existe', async () => { const api = { getPublicOrderSummary: vi.fn().mockRejectedValue({ response: { status: 404 } }), } const { wrapper } = await mountPage(api, '/pedido/zzzzzz') await flushPromises() expect(wrapper.findComponent(PublicOrderSummary).props('error')).toContain('No se encontró') }) it('al consultar un código navega a /pedido/ y vuelve a consultar', async () => { const api = { getPublicOrderSummary: vi.fn().mockResolvedValue(saleData) } const { router, wrapper } = await mountPage(api, '/pedido/abc123') await flushPromises() api.getPublicOrderSummary.mockClear() await wrapper.find('input').setValue('newcode') await wrapper.find('form').trigger('submit') await waitForRouteParam(router, 'code', 'newcode') expect(router.currentRoute.value.params.code).toBe('newcode') expect(api.getPublicOrderSummary).toHaveBeenCalledWith('newcode') }) })