93 lines
3.1 KiB
JavaScript
93 lines
3.1 KiB
JavaScript
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/<code> 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')
|
|
})
|
|
})
|