import { flushSync, mount, unmount } from 'svelte'; import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import MessageInput from '$lib/components/MessageInput.svelte'; import axios from 'axios'; let component; let mocks = vi.hoisted(() => ({ post: vi.fn(), })); describe('MessageInput', () => { beforeEach(() => { vi.mock('axios', async (importActual) => { const actual = await importActual(); const mockAxios = { default: { ...actual.default, create: vi.fn(() => ({ ...actual.default.create(), post: mocks.post, })), }, }; return mockAxios; }); mocks.post.mockResolvedValue({ status: 200 }); component = mount(MessageInput, { target: document.body, // `document` exists because of jsdom }); flushSync(); }); afterEach(() => { unmount(component); }); test('onsubmit happy path', async () => { // Click the button, then flush the changes so you can synchronously write expectations document.body.querySelector('button[type=submit]').click(); flushSync(); expect(mocks.post).toHaveBeenCalled(); }); });