import { screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { renderWithProviders } from "test-utils";
import { GitConversationRouting } from "#/components/features/org/git-conversation-routing";
const mockMutate = vi.fn();
const mockDisconnectMutate = vi.fn();
vi.mock("#/hooks/query/use-git-organizations", () => ({
useUserGitOrganizations: () => ({
data: {
provider: "github",
organizations: ["OpenHands", "AcmeCo"],
},
isLoading: false,
}),
useGitClaims: () => ({
data: [
{
id: "claim-1",
org_id: "org-1",
provider: "github",
git_organization: "OpenHands",
claimed_by: "user-1",
claimed_at: "2026-01-01T00:00:00",
},
],
isLoading: false,
}),
}));
vi.mock("#/hooks/mutation/use-claim-git-org", () => ({
useClaimGitOrg: () => ({
mutate: mockMutate,
}),
}));
vi.mock("#/hooks/mutation/use-disconnect-git-org", () => ({
useDisconnectGitOrg: () => ({
mutate: mockDisconnectMutate,
}),
}));
describe("GitConversationRouting", () => {
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
vi.restoreAllMocks();
});
it("should render organizations from API data", () => {
renderWithProviders();
expect(screen.getByTestId("org-row-github:wren")).toHaveTextContent(
"GitHub/OpenHands",
);
expect(screen.getByTestId("org-row-github:acmeco")).toHaveTextContent(
"GitHub/AcmeCo",
);
});
it("should show claimed org with 'Claimed' label", () => {
renderWithProviders();
const claimedButton = screen.getByTestId("claim-button-github:wren");
expect(claimedButton).toHaveTextContent("ORG$CLAIMED");
});
it("should show unclaimed orgs with 'Claim' label", () => {
renderWithProviders();
expect(screen.getByTestId("claim-button-github:acmeco")).toHaveTextContent(
"ORG$CLAIM",
);
});
it("should call claim mutation when clicking claim on unclaimed org", async () => {
renderWithProviders();
const user = userEvent.setup();
await user.click(screen.getByTestId("claim-button-github:acmeco"));
expect(mockMutate).toHaveBeenCalledWith(
{ provider: "github", gitOrganization: "AcmeCo" },
expect.objectContaining({ onSettled: expect.any(Function) }),
);
});
it("should call disconnect mutation when clicking disconnect on claimed org", async () => {
renderWithProviders();
const user = userEvent.setup();
await user.click(screen.getByTestId("claim-button-github:wren"));
expect(mockDisconnectMutate).toHaveBeenCalledWith(
{ claimId: "claim-1" },
expect.objectContaining({ onSettled: expect.any(Function) }),
);
});
});