mirror of
https://github.com/lrnselfreliance/wrolpi.git
synced 2026-10-26 19:01:39 -04:00
The library has been uninstalled for some time, but the codebase still read as though it were there: identifiers named after it, rules written against its class names, and about 180 comments explaining a rule in terms of a thing that is no longer installed. Renamed, keeping the vocabulary the app actually uses: semanticUIColorMap -> navColorHexMap, semanticColorNames -> paletteColorNames, semanticNames -> iconNameAliases, semanticSizes -> sizeAliases, and SemanticUIColors -> NavColors in wrolpi/schema.py, which is what validates nav_color on the way in. ColorToSemanticHexColor had no callers at all and is gone. The baseline ratchet has done its job -- the list reached zero, so the JSON is deleted and the guard keeps only the checks with teeth: no package, no import, no `className="ui "`, no toast library. Its Theme.tsx check went with the wrappers it was watching for. It also asserts its own walk found files, so a clean result cannot mean it scanned nothing. Deleted from App.css: every rule requiring `.ui`, `.inverted`, `.segment` or `.modal`, none of which any component has set since the stylesheet stopped loading, plus the form skeletons, ui-alerts and progress-text rules that nothing renders. Two of them were doing harm rather than nothing: the drag tints had a dark-theme variant under `.inverted` that stopped applying, leaving 15% of a fixed blue over a dark row, and now mix a token instead. Two selectors naming markup that no longer exists were live bugs. The file browser's filter had `.ui.input.file-browser-filter`, so it rendered at the browser default width on a bar laid out to give it 34em -- now qualified by its container, because `.wrolpi-action-input` sets `width: 100%` at the same specificity and is loaded later. And SearchBox takes named props rather than a rest spread, so the `id` DestinationForm hands it was dropped in silence and the label it renders pointed at nothing; the download forms' Destination field has had no associated label since the migration. "Semantic roles" survives in four places, where it means what it says. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
2.1 KiB
JavaScript
86 lines
2.1 KiB
JavaScript
// Jest setup file for React Testing Library
|
|
// This file is automatically loaded by Create React App before running tests
|
|
|
|
// Polyfill TextEncoder/TextDecoder for react-router v7 compatibility
|
|
// See: https://github.com/remix-run/react-router/issues/12363
|
|
import { TextDecoder, TextEncoder } from 'util';
|
|
global.TextEncoder = TextEncoder;
|
|
global.TextDecoder = TextDecoder;
|
|
|
|
import '@testing-library/jest-dom';
|
|
|
|
// Set global Jest timeout to 30 seconds
|
|
// Tests that exceed this will fail with a clear error message identifying the failing test
|
|
jest.setTimeout(30000);
|
|
|
|
// Mock react-stl-viewer to avoid loading heavy three.js dependency in tests
|
|
jest.mock('react-stl-viewer', () => ({
|
|
StlViewer: () => null,
|
|
}));
|
|
|
|
// Mock window.matchMedia (used by the responsive Media components)
|
|
Object.defineProperty(window, 'matchMedia', {
|
|
writable: true,
|
|
value: jest.fn().mockImplementation(query => ({
|
|
matches: false,
|
|
media: query,
|
|
onchange: null,
|
|
addListener: jest.fn(), // deprecated
|
|
removeListener: jest.fn(), // deprecated
|
|
addEventListener: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
dispatchEvent: jest.fn(),
|
|
})),
|
|
});
|
|
|
|
// Mock IntersectionObserver (if needed for lazy loading)
|
|
global.IntersectionObserver = class IntersectionObserver {
|
|
constructor() {
|
|
}
|
|
|
|
disconnect() {
|
|
}
|
|
|
|
observe() {
|
|
}
|
|
|
|
takeRecords() {
|
|
return [];
|
|
}
|
|
|
|
unobserve() {
|
|
}
|
|
};
|
|
|
|
// Mock ResizeObserver (used by Mantine's ScrollArea, e.g. inside Select/Combobox dropdowns).
|
|
global.ResizeObserver = class ResizeObserver {
|
|
constructor() {
|
|
}
|
|
|
|
disconnect() {
|
|
}
|
|
|
|
observe() {
|
|
}
|
|
|
|
unobserve() {
|
|
}
|
|
};
|
|
|
|
// Suppress console errors during tests (optional - uncomment if needed)
|
|
// const originalError = console.error;
|
|
// beforeAll(() => {
|
|
// console.error = (...args) => {
|
|
// if (
|
|
// typeof args[0] === 'string' &&
|
|
// args[0].includes('Warning: ReactDOM.render')
|
|
// ) {
|
|
// return;
|
|
// }
|
|
// originalError.call(console, ...args);
|
|
// };
|
|
// });
|
|
//
|
|
// afterAll(() => {
|
|
// console.error = originalError;
|
|
// });
|