112 lines
3.7 KiB
TypeScript
112 lines
3.7 KiB
TypeScript
import { App } from '@inertiajs/react';
|
|
import type { Page } from '@inertiajs/core';
|
|
import { renderToString } from 'react-dom/server';
|
|
import { expect, test } from 'vitest';
|
|
import RequisitionForm from '@/pages/requisitions/form';
|
|
import Catalogue from '@/pages/stock/catalogue';
|
|
|
|
const page = {
|
|
component: 'requisitions/form',
|
|
url: '/requisicoes/1/editar',
|
|
version: 'catalogue',
|
|
props: { errors: {} },
|
|
clearHistory: false,
|
|
encryptHistory: true,
|
|
} satisfies Page;
|
|
|
|
test('saved article version remains selected when the published source has changed', () => {
|
|
const initialPage = {
|
|
...page,
|
|
props: {
|
|
...page.props,
|
|
costCenters: [],
|
|
requisition: {
|
|
id: 1,
|
|
cost_center_id: 1,
|
|
priority: 'normal',
|
|
needed_by: '2026-11-10',
|
|
justification: 'Pedido',
|
|
items: [
|
|
{
|
|
id: 4,
|
|
catalogue_entry_id: 7,
|
|
catalogue_snapshot: { version: 1, code: 'ART-7' },
|
|
description: 'Nome original',
|
|
category: 'Material',
|
|
purchase_type: 'consumable',
|
|
quantity: '2',
|
|
unit: 'cx',
|
|
unit_price_minor: 1000,
|
|
tax_rate: '16',
|
|
},
|
|
],
|
|
},
|
|
catalogue: {
|
|
ready: true,
|
|
search: '',
|
|
more: false,
|
|
items: [
|
|
{
|
|
id: 7,
|
|
version: 2,
|
|
stock_item_id: 3,
|
|
code: 'ART-7',
|
|
description: 'Nome actualizado',
|
|
unit: 'cx',
|
|
category: 'Material',
|
|
purchase_type: 'consumable',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
};
|
|
const html = renderToString(
|
|
<App initialPage={initialPage} initialComponent={RequisitionForm} />,
|
|
);
|
|
expect(html).toMatch(/<option value="7:1" selected="">/);
|
|
expect(html).toContain('<option value="7:2">');
|
|
expect(html).toContain('value="Nome original"');
|
|
expect(html).toMatch(/readonly=""/i);
|
|
expect(html).toContain('Preenchimento livre');
|
|
});
|
|
|
|
test.each([true, false])(
|
|
'catalogue editing follows authority (%s)',
|
|
(canManage) => {
|
|
const initialPage = {
|
|
...page,
|
|
component: 'stock/catalogue',
|
|
props: {
|
|
...page.props,
|
|
ready: true,
|
|
canManage,
|
|
filters: {},
|
|
records: {
|
|
total: 1,
|
|
prev_page_url: null,
|
|
next_page_url: null,
|
|
data: [
|
|
{
|
|
id: 3,
|
|
code: 'ART-7',
|
|
name: 'Artigo existente',
|
|
unit: 'cx',
|
|
stock_basis: 'a'.repeat(64),
|
|
version: 1,
|
|
category: 'Material',
|
|
purchase_type: 'consumable',
|
|
published: true,
|
|
source_current: true,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
};
|
|
const html = renderToString(
|
|
<App initialPage={initialPage} initialComponent={Catalogue} />,
|
|
);
|
|
expect(html).toContain('Artigo existente');
|
|
expect(html.includes('Guardar versão do catálogo')).toBe(canManage);
|
|
},
|
|
);
|