import {test} from 'node:test';
import assert from 'node:assert/strict';
import {render, screen, fireEvent} from '@testing-library/react';
import App from './main.jsx';
// Every row's text: "NamePrice" for the header, "Apple$1" for a product, "Fruits" for a category.
const rowTexts = () => screen.getAllByRole('row').map((tr) => tr.textContent);
const productTexts = () => rowTexts().slice(1);
const search = (value) => fireEvent.change(screen.getByRole('textbox'), {target: {value}});
const box = () => screen.getByRole('checkbox', {name: 'Only show products in stock'});
const toggle = () => fireEvent.click(box());
test('Zunächst erscheinen alle sechs Produkte', () => {
render(<App />);
assert.deepEqual(productTexts(), ['Apple$1', 'Dragonfruit$1', 'Passionfruit$2', 'Spinach$2', 'Pumpkin$4', 'Peas$1'], 'zu Beginn lauten die Zeilen ' + JSON.stringify(productTexts()));
});
test('Der Suchtext filtert nach einem Teil des Namens', () => {
render(<App />);
search('fruit');
assert.deepEqual(productTexts(), ['Dragonfruit$1', 'Passionfruit$2'], 'nach der Eingabe von fruit lauten die Zeilen ' + JSON.stringify(productTexts()));
});
test('Die Suche ignoriert Groß- und Kleinschreibung', () => {
render(<App />);
search('PEA');
assert.deepEqual(productTexts(), ['Peas$1'], 'nach der Eingabe von PEA lauten die Zeilen ' + JSON.stringify(productTexts()));
});
test('Die Checkbox blendet Produkte aus, die nicht auf Lager sind', () => {
render(<App />);
toggle();
assert.deepEqual(productTexts(), ['Apple$1', 'Dragonfruit$1', 'Spinach$2', 'Peas$1'], 'bei angehakter Checkbox lauten die Zeilen ' + JSON.stringify(productTexts()));
toggle();
assert.deepEqual(productTexts(), ['Apple$1', 'Dragonfruit$1', 'Passionfruit$2', 'Spinach$2', 'Pumpkin$4', 'Peas$1'], 'nach dem Abhaken der Checkbox lauten die Zeilen ' + JSON.stringify(productTexts()));
});
test('Suchtext und Checkbox wirken zusammen', () => {
render(<App />);
search('fruit');
toggle();
assert.deepEqual(productTexts(), ['Dragonfruit$1'], 'mit fruit und angehakter Checkbox lauten die Zeilen ' + JSON.stringify(productTexts()));
});