From 34b5300904718d995d08f5464dd6d142ac2ddef8 Mon Sep 17 00:00:00 2001 From: Z8MB1E Date: Wed, 19 Aug 2026 20:41:09 -0400 Subject: [PATCH] test(preferences): add unit tests for PreferencesForm component Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- tests/int/preferences-form.int.spec.ts | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 tests/int/preferences-form.int.spec.ts diff --git a/tests/int/preferences-form.int.spec.ts b/tests/int/preferences-form.int.spec.ts new file mode 100644 index 0000000..d95beeb --- /dev/null +++ b/tests/int/preferences-form.int.spec.ts @@ -0,0 +1,70 @@ +import { createElement } from "react"; +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { PreferencesForm } from "@/components/frontend/account/PreferencesForm"; +import { updatePreferences } from "@/app/(frontend)/account/actions"; + +vi.mock("next/navigation", () => ({ + useRouter: () => ({ refresh: vi.fn() }), +})); + +vi.mock("@/app/(frontend)/account/actions", () => ({ + updatePreferences: vi.fn(), +})); + +class ResizeObserverMock implements ResizeObserver { + observe(_target: Element, _options?: ResizeObserverOptions): void {} + + unobserve(_target: Element): void {} + + disconnect(): void {} +} + +globalThis.ResizeObserver = ResizeObserverMock; + +const mockedUpdatePreferences = vi.mocked(updatePreferences); + +describe("PreferencesForm", () => { + beforeEach(() => { + mockedUpdatePreferences.mockReset(); + mockedUpdatePreferences.mockResolvedValue({ success: true }); + }); + + it("submits all display, in-app, and Discord preferences", async () => { + render( + createElement(PreferencesForm, { + mutedAll: false, + mutedTypes: ["market:offer"], + showCallsign: false, + showVersionOverlay: true, + leadOrActual: "lead", + discordEnabled: false, + discordMutedTypes: [], + }), + ); + + fireEvent.click(screen.getByRole("switch", { name: "Show version overlay" })); + fireEvent.click(screen.getByRole("switch", { name: "Show callsign instead of display name" })); + fireEvent.click(screen.getByRole("switch", { name: "Mute all in-app notifications" })); + fireEvent.click(screen.getByRole("radio", { name: "Actual" })); + fireEvent.click(screen.getByRole("switch", { name: "Enable Discord notifications" })); + const discordMarketOffer = document.getElementById("discord-market-offer"); + if (!(discordMarketOffer instanceof HTMLElement)) { + throw new Error("Discord market-offer switch was not rendered."); + } + fireEvent.click(discordMarketOffer); + fireEvent.click(screen.getByRole("button", { name: "Save preferences" })); + + await waitFor(() => { + expect(mockedUpdatePreferences).toHaveBeenCalledWith({ + mutedAll: true, + mutedTypes: ["market:offer"], + showCallsign: true, + showVersionOverlay: false, + leadOrActual: "actual", + discordEnabled: true, + discordMutedTypes: ["market:offer"], + }); + }); + }); +});