import { describe, it, expect, afterEach, vi } from 'vitest'; import '@testing-library/jest-dom/vitest'; import { render, cleanup, fireEvent } from '@solidjs/testing-library'; import { createSignal } from 'solid-js'; import { DefaultPromptInput } from '../elements/default-input'; // jsdom doesn't implement Element.scrollTo; some inner controls may call it. if (!Element.prototype.scrollTo) (Element.prototype as unknown as { scrollTo: () => void }).scrollTo = () => {}; afterEach(cleanup); const noop = () => {}; describe('DefaultPromptInput disabled state', () => { it('renders the textarea and send button as disabled', () => { const { container } = render(() => ( )); const textarea = container.querySelector('textarea'); const send = container.querySelector('[data-testid="send"]'); expect(textarea).toBeDisabled(); expect(send).toBeDisabled(); }); it('does not call onSubmit when the send button is clicked while disabled', () => { const onSubmit = vi.fn(); const { container } = render(() => ( )); const send = container.querySelector('[data-testid="send"]') as HTMLButtonElement; fireEvent.click(send); expect(onSubmit).not.toHaveBeenCalled(); }); it('does not call onSubmit when Enter is pressed while disabled', () => { const onSubmit = vi.fn(); const { container } = render(() => ( )); const textarea = container.querySelector('textarea') as HTMLTextAreaElement; fireEvent.keyDown(textarea, { key: 'Enter' }); expect(onSubmit).not.toHaveBeenCalled(); }); it('reactively disables/enables the textarea when `disabled` changes after mount', () => { const [disabled, setDisabled] = createSignal(false); const { container } = render(() => ( )); const textarea = container.querySelector('textarea') as HTMLTextAreaElement; expect(textarea).not.toBeDisabled(); setDisabled(true); expect(textarea).toBeDisabled(); // fails if PromptInput context captures `disabled` statically setDisabled(false); expect(textarea).not.toBeDisabled(); }); it('still submits via Enter when not disabled (sanity)', () => { const onSubmit = vi.fn(); const { container } = render(() => ( )); const textarea = container.querySelector('textarea') as HTMLTextAreaElement; fireEvent.keyDown(textarea, { key: 'Enter' }); expect(onSubmit).toHaveBeenCalledTimes(1); }); }); describe('DefaultPromptInput leading/trailing slots', () => { it('renders a leading and trailing named slot', () => { const { container } = render(() => ( )); expect(container.querySelector('slot[name="leading"]')).toBeTruthy(); expect(container.querySelector('slot[name="trailing"]')).toBeTruthy(); }); });