From b087de84c41e19fdc0b1c533f56bbbdf1ea3a263 Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 29 Apr 2026 19:56:12 +0200 Subject: [PATCH] test(PersonMentionEditor): add placeholder show/hide behavior coverage Co-Authored-By: Claude Sonnet 4.6 --- .../PersonMentionEditor.svelte.spec.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/frontend/src/lib/components/PersonMentionEditor.svelte.spec.ts b/frontend/src/lib/components/PersonMentionEditor.svelte.spec.ts index bf4b59ea..8d35cb99 100644 --- a/frontend/src/lib/components/PersonMentionEditor.svelte.spec.ts +++ b/frontend/src/lib/components/PersonMentionEditor.svelte.spec.ts @@ -363,6 +363,38 @@ describe('PersonMentionEditor — XSS resistance', () => { }); }); +// ─── Placeholder behavior ───────────────────────────────────────────────────── + +describe('PersonMentionEditor — placeholder behavior', () => { + it('sets data-placeholder on the inner element when editor is empty', async () => { + render(PersonMentionEditorHost, { + initialValue: '', + initialMentions: [], + placeholder: 'Gib Text ein...', + onChange: () => {} + }); + await vi.waitFor(() => { + const inner = document.querySelector('.tiptap-editor-inner') as HTMLElement | null; + expect(inner).not.toBeNull(); + expect(inner!.getAttribute('data-placeholder')).toBe('Gib Text ein...'); + }); + }); + + it('omits data-placeholder on the inner element when editor has content', async () => { + render(PersonMentionEditorHost, { + initialValue: 'Bestehender Text', + initialMentions: [], + placeholder: 'Gib Text ein...', + onChange: () => {} + }); + await vi.waitFor(() => { + const inner = document.querySelector('.tiptap-editor-inner') as HTMLElement | null; + expect(inner).not.toBeNull(); + expect(inner!.hasAttribute('data-placeholder')).toBe(false); + }); + }); +}); + // ─── Touch target (WCAG 2.2 AA) ────────────────────────────────────────────── describe('PersonMentionEditor — touch target', () => {