feat: add data-test attributes for improved testing in various components

This commit is contained in:
T. Zehetbauer
2026-04-01 10:23:35 +02:00
parent fd8c2cc32a
commit 3bcc5c70a3
20 changed files with 802 additions and 31 deletions

View File

@@ -95,6 +95,7 @@ export function CatchBooksDataTable({
<select
value={currentYear}
onChange={handleYearChange}
data-test="catchbooks-year-filter"
className="border-input bg-background flex h-9 rounded-md border px-3 py-1 text-sm shadow-sm"
>
<option value="">Alle Jahre</option>
@@ -108,6 +109,7 @@ export function CatchBooksDataTable({
<select
value={currentStatus}
onChange={handleStatusChange}
data-test="catchbooks-status-filter"
className="border-input bg-background flex h-9 rounded-md border px-3 py-1 text-sm shadow-sm"
>
{STATUS_OPTIONS.map((opt) => (

View File

@@ -59,7 +59,7 @@ export function CompetitionsDataTable({
<div className="flex items-center justify-between">
<h2 className="text-lg font-semibold">Wettbewerbe ({total})</h2>
<Link href={`/home/${account}/fischerei/competitions/new`}>
<Button size="sm">
<Button size="sm" data-test="competitions-new-btn">
<Plus className="mr-2 h-4 w-4" />
Neuer Wettbewerb
</Button>

View File

@@ -247,10 +247,19 @@ export function CreateSpeciesForm({
{/* Submit */}
<div className="flex justify-end gap-2">
<Button type="button" variant="outline" onClick={() => router.back()}>
<Button
type="button"
variant="outline"
onClick={() => router.back()}
data-test="species-cancel-btn"
>
Abbrechen
</Button>
<Button type="submit" disabled={isPending}>
<Button
type="submit"
disabled={isPending}
data-test="species-submit-btn"
>
{isPending
? 'Wird gespeichert...'
: isEdit

View File

@@ -86,6 +86,7 @@ export function CreateStockingForm({
<FormControl>
<select
{...field}
data-test="stocking-water-select"
className="border-input bg-background flex h-10 w-full rounded-md border px-3 py-2 text-sm"
>
<option value=""> Gewässer wählen </option>
@@ -109,6 +110,7 @@ export function CreateStockingForm({
<FormControl>
<select
{...field}
data-test="stocking-species-select"
className="border-input bg-background flex h-10 w-full rounded-md border px-3 py-2 text-sm"
>
<option value=""> Fischart wählen </option>
@@ -253,7 +255,11 @@ export function CreateStockingForm({
<Button type="button" variant="outline" onClick={() => router.back()}>
Abbrechen
</Button>
<Button type="submit" disabled={isPending}>
<Button
type="submit"
disabled={isPending}
data-test="stocking-submit-btn"
>
{isPending ? 'Wird gespeichert...' : 'Besatz eintragen'}
</Button>
</div>

View File

@@ -435,10 +435,19 @@ export function CreateWaterForm({
{/* Submit */}
<div className="flex justify-end gap-2">
<Button type="button" variant="outline" onClick={() => router.back()}>
<Button
type="button"
variant="outline"
onClick={() => router.back()}
data-test="water-cancel-btn"
>
Abbrechen
</Button>
<Button type="submit" disabled={isPending}>
<Button
type="submit"
disabled={isPending}
data-test="water-submit-btn"
>
{isPending
? 'Wird gespeichert...'
: isEdit

View File

@@ -1,8 +1,8 @@
'use client';
import Link from 'next/link';
import { usePathname } from 'next/navigation';
import { Trans } from '@kit/ui/trans';
import { cn } from '@kit/ui/utils';
interface FischereiTabNavigationProps {
@@ -11,15 +11,27 @@ interface FischereiTabNavigationProps {
}
const TABS = [
{ id: 'overview', label: 'Übersicht', path: '' },
{ id: 'waters', label: 'Gewässer', path: '/waters' },
{ id: 'species', label: 'Fischarten', path: '/species' },
{ id: 'stocking', label: 'Besatz', path: '/stocking' },
{ id: 'leases', label: 'Pachten', path: '/leases' },
{ id: 'catch-books', label: 'Fangbücher', path: '/catch-books' },
{ id: 'permits', label: 'Erlaubnisscheine', path: '/permits' },
{ id: 'competitions', label: 'Wettbewerbe', path: '/competitions' },
{ id: 'statistics', label: 'Statistiken', path: '/statistics' },
{ id: 'overview', i18nKey: 'fischerei:nav.overview', path: '' },
{ id: 'waters', i18nKey: 'fischerei:nav.waters', path: '/waters' },
{ id: 'species', i18nKey: 'fischerei:nav.species', path: '/species' },
{ id: 'stocking', i18nKey: 'fischerei:nav.stocking', path: '/stocking' },
{ id: 'leases', i18nKey: 'fischerei:nav.leases', path: '/leases' },
{
id: 'catch-books',
i18nKey: 'fischerei:nav.catchBooks',
path: '/catch-books',
},
{ id: 'permits', i18nKey: 'fischerei:nav.permits', path: '/permits' },
{
id: 'competitions',
i18nKey: 'fischerei:nav.competitions',
path: '/competitions',
},
{
id: 'statistics',
i18nKey: 'fischerei:nav.statistics',
path: '/statistics',
},
] as const;
export function FischereiTabNavigation({
@@ -32,7 +44,7 @@ export function FischereiTabNavigation({
<div className="mb-6 border-b">
<nav
className="-mb-px flex space-x-1 overflow-x-auto"
aria-label="Fischerei Navigation"
aria-label="Fisheries Navigation"
>
{TABS.map((tab) => {
const isActive = tab.id === activeTab;
@@ -41,6 +53,7 @@ export function FischereiTabNavigation({
<Link
key={tab.id}
href={`${basePath}${tab.path}`}
data-test={`fischerei-tab-${tab.id}`}
className={cn(
'border-b-2 px-4 py-2.5 text-sm font-medium whitespace-nowrap transition-colors',
isActive
@@ -48,7 +61,7 @@ export function FischereiTabNavigation({
: 'text-muted-foreground hover:border-muted-foreground/30 hover:text-foreground border-transparent',
)}
>
{tab.label}
<Trans i18nKey={tab.i18nKey} />
</Link>
);
})}

View File

@@ -76,15 +76,21 @@ export function SpeciesDataTable({
<Input
placeholder="Fischart suchen..."
className="w-64"
data-test="species-search-input"
{...form.register('search')}
/>
<Button type="submit" variant="outline" size="sm">
<Button
type="submit"
variant="outline"
size="sm"
data-test="species-search-btn"
>
Suchen
</Button>
</form>
<Link href={`/home/${account}/fischerei/species/new`}>
<Button size="sm">
<Button size="sm" data-test="species-new-btn">
<Plus className="mr-2 h-4 w-4" />
Neue Fischart
</Button>

View File

@@ -65,7 +65,7 @@ export function StockingDataTable({
<div className="flex items-center justify-between">
<h2 className="text-lg font-semibold">Besatz ({total})</h2>
<Link href={`/home/${account}/fischerei/stocking/new`}>
<Button size="sm">
<Button size="sm" data-test="stocking-new-btn">
<Plus className="mr-2 h-4 w-4" />
Besatz eintragen
</Button>

View File

@@ -103,9 +103,15 @@ export function WatersDataTable({
<Input
placeholder="Gewässer suchen..."
className="w-64"
data-test="waters-search-input"
{...form.register('search')}
/>
<Button type="submit" variant="outline" size="sm">
<Button
type="submit"
variant="outline"
size="sm"
data-test="waters-search-btn"
>
Suchen
</Button>
</form>
@@ -114,6 +120,7 @@ export function WatersDataTable({
<select
value={currentType}
onChange={handleTypeChange}
data-test="waters-type-filter"
className="border-input bg-background flex h-9 rounded-md border px-3 py-1 text-sm shadow-sm"
>
{WATER_TYPE_OPTIONS.map((opt) => (
@@ -124,7 +131,7 @@ export function WatersDataTable({
</select>
<Link href={`/home/${account}/fischerei/waters/new`}>
<Button size="sm">
<Button size="sm" data-test="waters-new-btn">
<Plus className="mr-2 h-4 w-4" />
Neues Gewässer
</Button>