Files
Investidor-V2/tests/frontend/global-search.test.mjs
T

128 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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/);
});