Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions web/src/DiscoverTicketsModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ export function DiscoverTicketsModal({ repoPath, tickets, loading, error, onAdd,
<div className="modal-backdrop" onClick={onClose}>
<div className="modal discover-modal" onClick={(event) => event.stopPropagation()}>
<h3>Discover Tickets</h3>
<p className="meta">Shortcut stories tagged "auto-pr" that are not done or in progress for {repoPath}.</p>
<p className="meta">Available tickets for {repoPath}.</p>
{error ? <div className="banner error">{error}</div> : null}
{loading ? (
<p className="meta">Searching Shortcut...</p>
<p className="meta">Fetching Tickets...</p>
) : tickets.length === 0 && !error ? (
<p className="meta">No matching tickets found.</p>
<p className="meta">No Tickets available.</p>
) : (
<ul className="discover-list">
{tickets.map((ticket) => (
Expand Down
64 changes: 64 additions & 0 deletions web/src/__tests__/DiscoverTicketsModal.test.tsx
Original file line number Diff line number Diff line change
@@ -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(<DiscoverTicketsModal {...defaultProps} />);

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(<DiscoverTicketsModal {...defaultProps} loading />);

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(
<DiscoverTicketsModal
{...defaultProps}
tickets={[
{ ticket_number: "GH-4", title: "Remove Shortcut references" },
{ ticket_number: "SC-1", title: "Another ticket" }
]}
onAdd={onAdd}
/>
);

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(<DiscoverTicketsModal {...defaultProps} onClose={onClose} />);

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(<DiscoverTicketsModal {...defaultProps} onClose={onClose} />);

fireEvent.click(container.querySelector(".modal")!);
expect(onClose).not.toHaveBeenCalled();
});
});
Loading