event.stopPropagation()}>
Discover Tickets
-
Shortcut stories tagged "auto-pr" that are not done or in progress for {repoPath}.
+
Available tickets for {repoPath}.
{error ?
{error}
: null}
{loading ? (
-
Searching Shortcut...
+
Fetching Tickets...
) : tickets.length === 0 && !error ? (
-
No matching tickets found.
+
No Tickets available.
) : (
{tickets.map((ticket) => (
diff --git a/web/src/__tests__/DiscoverTicketsModal.test.tsx b/web/src/__tests__/DiscoverTicketsModal.test.tsx
new file mode 100644
index 0000000..c8ca14e
--- /dev/null
+++ b/web/src/__tests__/DiscoverTicketsModal.test.tsx
@@ -0,0 +1,64 @@
+import { describe, it, expect, vi, beforeEach } from "vitest";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { DiscoverTicketsModal } from "../DiscoverTicketsModal";
+
+const defaultProps = {
+ repoPath: "/repo/path",
+ tickets: [],
+ loading: false,
+ error: "",
+ onAdd: vi.fn(),
+ onClose: vi.fn(),
+};
+
+beforeEach(() => vi.clearAllMocks());
+
+describe("DiscoverTicketsModal", () => {
+ it("renders generic copy without Shortcut references", () => {
+ render();
+
+ expect(screen.getByText("Available tickets for /repo/path.")).toBeInTheDocument();
+ expect(screen.getByText("No Tickets available.")).toBeInTheDocument();
+ expect(screen.queryByText(/shortcut/i)).not.toBeInTheDocument();
+ });
+
+ it("shows generic loading copy", () => {
+ render();
+
+ expect(screen.getByText("Fetching Tickets...")).toBeInTheDocument();
+ expect(screen.queryByText(/shortcut/i)).not.toBeInTheDocument();
+ });
+
+ it("renders discovered tickets and calls onAdd", () => {
+ const onAdd = vi.fn();
+ render(
+
+ );
+
+ fireEvent.click(screen.getAllByRole("button", { name: "Add" })[0]);
+ expect(onAdd).toHaveBeenCalledWith("GH-4");
+ });
+
+ it("calls onClose when the backdrop is clicked", () => {
+ const onClose = vi.fn();
+ const { container } = render();
+
+ fireEvent.click(container.querySelector(".modal-backdrop")!);
+ expect(onClose).toHaveBeenCalledOnce();
+ });
+
+ it("does not call onClose when the modal body is clicked", () => {
+ const onClose = vi.fn();
+ const { container } = render();
+
+ fireEvent.click(container.querySelector(".modal")!);
+ expect(onClose).not.toHaveBeenCalled();
+ });
+});