diff --git a/frontend/src/lib/document/annotation/AnnotationLayer.svelte.spec.ts b/frontend/src/lib/document/annotation/AnnotationLayer.svelte.spec.ts index b134c50f..3c5aea0b 100644 --- a/frontend/src/lib/document/annotation/AnnotationLayer.svelte.spec.ts +++ b/frontend/src/lib/document/annotation/AnnotationLayer.svelte.spec.ts @@ -107,7 +107,7 @@ describe('AnnotationLayer', () => { }); await expect.element(page.getByTestId('annotation-ann-1')).toBeInTheDocument(); - expect(page.getByTestId('annotation-delete-ann-1').query()).toBeNull(); + await expect.element(page.getByTestId('annotation-delete-ann-1')).not.toBeInTheDocument(); }); it('does not show delete button when canDraw is false even if annotation is active', async () => { @@ -120,6 +120,6 @@ describe('AnnotationLayer', () => { }); await expect.element(page.getByTestId('annotation-ann-1')).toBeInTheDocument(); - expect(page.getByTestId('annotation-delete-ann-1').query()).toBeNull(); + await expect.element(page.getByTestId('annotation-delete-ann-1')).not.toBeInTheDocument(); }); }); diff --git a/frontend/src/lib/document/annotation/AnnotationShape.svelte.spec.ts b/frontend/src/lib/document/annotation/AnnotationShape.svelte.spec.ts index 87f1cae1..a896489b 100644 --- a/frontend/src/lib/document/annotation/AnnotationShape.svelte.spec.ts +++ b/frontend/src/lib/document/annotation/AnnotationShape.svelte.spec.ts @@ -45,7 +45,7 @@ describe('AnnotationShape', () => { onpointerleave: () => {} }); - expect(page.getByTestId('annotation-delete-ann-1').query()).toBeNull(); + await expect.element(page.getByTestId('annotation-delete-ann-1')).not.toBeInTheDocument(); }); it('does not show delete button when showDelete is true but neither hovered nor active', async () => { @@ -60,7 +60,7 @@ describe('AnnotationShape', () => { onpointerleave: () => {} }); - expect(page.getByTestId('annotation-delete-ann-1').query()).toBeNull(); + await expect.element(page.getByTestId('annotation-delete-ann-1')).not.toBeInTheDocument(); }); it('shows delete button when showDelete is true and isHovered is true', async () => { diff --git a/frontend/src/lib/ocr/OcrTrainingCard.svelte.spec.ts b/frontend/src/lib/ocr/OcrTrainingCard.svelte.spec.ts index d1aec9b8..c72e877a 100644 --- a/frontend/src/lib/ocr/OcrTrainingCard.svelte.spec.ts +++ b/frontend/src/lib/ocr/OcrTrainingCard.svelte.spec.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { cleanup, render } from 'vitest-browser-svelte'; import { page } from 'vitest/browser'; import OcrTrainingCard from './OcrTrainingCard.svelte'; @@ -74,6 +74,12 @@ describe('OcrTrainingCard — enabled state', () => { }); describe('OcrTrainingCard — success dismiss button', () => { + beforeEach(() => vi.useFakeTimers()); + afterEach(() => { + vi.runAllTimers(); + vi.useRealTimers(); + }); + it('dismiss button has 44×44px touch target (h-11 w-11)', async () => { vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true })); @@ -108,7 +114,9 @@ describe('OcrTrainingCard — in-flight state', () => { // While fetch is still pending the button label becomes "…" await expect.element(page.getByRole('button', { name: '…' })).toBeInTheDocument(); - // Cleanup: resolve the pending promise resolveFetch({ ok: false }); + await expect + .element(page.getByRole('button', { name: /Training starten/i })) + .not.toBeDisabled(); }); });