import { describe, it, expect, vi } from "vitest" import { render, screen, waitFor } from "@testing-library/react" import userEvent from "@testing-library/user-event" import { Feedback } from "./feedback" describe("Feedback", () => { it("renders trigger button", () => { render() expect(screen.getByRole("button")).toBeInTheDocument() }) it("renders trigger with label when provided", () => { render() expect(screen.getByText("Send Feedback")).toBeInTheDocument() }) it("opens popover on click", async () => { const user = userEvent.setup() render() await user.click(screen.getByRole("button")) expect(screen.getByText("Give us feedback")).toBeInTheDocument() }) it("opens modal when variant is modal", async () => { const user = userEvent.setup() render() await user.click(screen.getByRole("button")) expect(screen.getByRole("dialog")).toBeInTheDocument() expect(screen.getByText("Give us feedback")).toBeInTheDocument() }) it("disables submit until sentiment selected", async () => { const user = userEvent.setup() render() await user.click(screen.getByRole("button")) const submitButton = screen.getByRole("button", { name: "Submit" }) expect(submitButton).toBeDisabled() }) it("enables submit after sentiment selection", async () => { const user = userEvent.setup() render() await user.click(screen.getByRole("button")) await user.click(screen.getByRole("radio", { name: "Satisfied" })) const submitButton = screen.getByRole("button", { name: "Submit" }) expect(submitButton).not.toBeDisabled() }) it("calls onSubmit with feedback data", async () => { const user = userEvent.setup() const handleSubmit = vi.fn() render( ) await user.click(screen.getByRole("button")) await user.click(screen.getByRole("radio", { name: "Satisfied" })) await user.type(screen.getByRole("textbox"), "Great product!") await user.click(screen.getByRole("button", { name: "Submit" })) await waitFor(() => { expect(handleSubmit).toHaveBeenCalledWith({ sentiment: "satisfied", message: "Great product!", user: { id: "123", email: "test@example.com" }, context: { feature: "test" }, metadata: undefined, }) }) }) it("shows success message after submission", async () => { const user = userEvent.setup() render() await user.click(screen.getByRole("button")) await user.click(screen.getByRole("radio", { name: "Neutral" })) await user.click(screen.getByRole("button", { name: "Submit" })) await waitFor(() => { expect(screen.getByText("Thanks for your feedback!")).toBeInTheDocument() }) }) it("uses custom title", async () => { const user = userEvent.setup() render() await user.click(screen.getByRole("button")) expect(screen.getByText("Rate this")).toBeInTheDocument() }) })