import test from 'node:test'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import { createRequire } from 'node:module'; import React from 'react'; import { renderToStaticMarkup } from 'react-dom/server'; import ts from 'typescript'; const require = createRequire(import.meta.url); const source = fs.readFileSync( new URL('../../resources/js/pages/portal/search.tsx', import.meta.url), 'utf8', ); const compiled = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022, jsx: ts.JsxEmit.ReactJSX, }, }).outputText; const module = { exports: {} }; new Function('require', 'module', 'exports', compiled)( (name) => name === '@inertiajs/react' ? { Head: () => null, Link: ({ href, children, ...props }) => React.createElement('a', { href, ...props }, children), } : name === 'lucide-react' ? new Proxy({}, { get: () => () => null }) : require(name), module, module.exports, ); const Search = module.exports.default; test('product categories preserve the location filter and pagination even without a query', () => { const results = { data: [{ title: 'Grafite', description: '', category: 'Produtos e localizações', url: '/sectores/mineracao' }], total: 6, current_page: 1, last_page: 2, per_page: 5, unavailable: [] }; const html = renderToStaticMarkup(React.createElement(Search, { query: 'Nampula', results, answer: { type: 'products', label: 'Produtos e localização', count: 6, filter: 'Nampula', category: 'physical' }, })); assert.match(html, /q=Nampula&category=financial/); assert.match(html, /q=Nampula&page=2&category=physical/); assert.match(html, /name="category" value="physical"/); const all = renderToStaticMarkup(React.createElement(Search, { query: '', results, answer: { type: 'products', label: 'Produtos e localização', count: 6, filter: '', category: 'all' }, })); assert.match(all, /href="\/sectores\/mineracao"/); }); test('count answer is explicit and zero is distinct from an unavailable count', () => { const results = { data: [], total: 0, current_page: 1, last_page: 1, per_page: 5, unavailable: [] }; const html = renderToStaticMarkup(React.createElement(Search, { query: 'quantos corredores existem', results, answer: { type: 'count', label: 'corredores', count: 0, filter: '' }, })); assert.match(html, /0 corredores/); assert.match(html, /registos publicados/); const failed = renderToStaticMarkup(React.createElement(Search, { query: 'quantos corredores existem', results, answer: { type: 'count', label: 'corredores', count: null, filter: '' }, })); assert.match(failed, /Contagem indisponível/); assert.doesNotMatch(failed, /0 corredores/); }); test('products show their location separately from financial coverage and guidance has no invented count', () => { const results = { data: [{ title: 'Banco de ensaio', description: 'Crédito PME', location: 'Presença física: Maputo', coverage: 'Cobertura nacional', category: 'Produtos financeiros', url: '/fundos/qa' }], total: 1, current_page: 1, last_page: 1, per_page: 5, unavailable: [] }; const html = renderToStaticMarkup(React.createElement(Search, { query: 'produtos financeiros', results, answer: { type: 'products', label: 'Produtos e localização', count: 1, filter: '' }, })); assert.match(html, /Produtos financeiros/); assert.match(html, /Presença física: Maputo/); assert.match(html, /Cobertura nacional/); assert.match(html, /não determina a cobertura/); const guide = renderToStaticMarkup(React.createElement(Search, { query: 'como licenciar empresa', results: { ...results, data: [] }, answer: { type: 'guide', label: 'Licenciamento da empresa', count: 2, filter: 'licenciamento' }, })); assert.match(guide, /Licenciamento da empresa/); assert.doesNotMatch(guide, /2 Licenciamento/); }); test('shows five results in one sequence with numbered pagination and the query preserved', () => { const results = { data: [ { title: 'Energia em Nampula', description: 'Projecto público', url: '/oportunidades/energia', category: 'Oportunidades', }, ], total: 12, current_page: 1, last_page: 3, per_page: 5, unavailable: [], }; const html = renderToStaticMarkup( React.createElement(Search, { query: 'energia', results }), ); assert.match(html, /Oportunidades/); assert.match(html, /Resultados 1–1 de 12/); assert.match(html, /href="\/oportunidades\/energia"/); assert.match(html, /q=energia&page=2/); assert.match(html, /aria-current="page"/); assert.doesNotMatch(html, /emerald/); }); test('makes source failures explicit without hiding other results', () => { const results = { data: [], total: 0, current_page: 1, last_page: 1, per_page: 5, unavailable: ['Documentos e legislação'], }; const html = renderToStaticMarkup( React.createElement(Search, { query: 'terra', results }), ); assert.match(html, /role="alert"/); assert.match(html, /Não foi possível consultar: Documentos e legislação/); assert.match(html, /Nenhum resultado nas fontes consultadas/); });