Spaces:
Build error
Build error
import { describe, it, expect, vi, beforeEach } from "vitest"; | |
import { render, screen, fireEvent } from "@testing-library/react"; | |
import { RepositorySelectionForm } from "../src/components/features/home/repo-selection-form"; | |
import { useUserRepositories } from "../src/hooks/query/use-user-repositories"; | |
import { useRepositoryBranches } from "../src/hooks/query/use-repository-branches"; | |
import { useCreateConversation } from "../src/hooks/mutation/use-create-conversation"; | |
import { useIsCreatingConversation } from "../src/hooks/use-is-creating-conversation"; | |
// Mock the hooks | |
vi.mock("../src/hooks/query/use-user-repositories"); | |
vi.mock("../src/hooks/query/use-repository-branches"); | |
vi.mock("../src/hooks/mutation/use-create-conversation"); | |
vi.mock("../src/hooks/use-is-creating-conversation"); | |
vi.mock("react-i18next", () => ({ | |
useTranslation: () => ({ | |
t: (key: string) => key, | |
}), | |
})); | |
describe("RepositorySelectionForm", () => { | |
const mockOnRepoSelection = vi.fn(); | |
beforeEach(() => { | |
vi.resetAllMocks(); | |
// Mock the hooks with default values | |
(useUserRepositories as any).mockReturnValue({ | |
data: [ | |
{ id: "1", full_name: "test/repo1" }, | |
{ id: "2", full_name: "test/repo2" } | |
], | |
isLoading: false, | |
isError: false, | |
}); | |
(useRepositoryBranches as any).mockReturnValue({ | |
data: [ | |
{ name: "main" }, | |
{ name: "develop" } | |
], | |
isLoading: false, | |
isError: false, | |
}); | |
(useCreateConversation as any).mockReturnValue({ | |
mutate: vi.fn(), | |
isPending: false, | |
isSuccess: false, | |
}); | |
(useIsCreatingConversation as any).mockReturnValue(false); | |
}); | |
it("should clear selected branch when input is empty", async () => { | |
render(<RepositorySelectionForm onRepoSelection={mockOnRepoSelection} />); | |
// First select a repository to enable the branch dropdown | |
const repoDropdown = screen.getByTestId("repository-dropdown"); | |
fireEvent.change(repoDropdown, { target: { value: "test/repo1" } }); | |
// Get the branch dropdown and verify it's enabled | |
const branchDropdown = screen.getByTestId("branch-dropdown"); | |
expect(branchDropdown).not.toBeDisabled(); | |
// Simulate deleting all text in the branch input | |
fireEvent.change(branchDropdown, { target: { value: "" } }); | |
// Verify the branch input is cleared (no selected branch) | |
expect(branchDropdown).toHaveValue(""); | |
}); | |
it("should clear selected branch when input contains only whitespace", async () => { | |
render(<RepositorySelectionForm onRepoSelection={mockOnRepoSelection} />); | |
// First select a repository to enable the branch dropdown | |
const repoDropdown = screen.getByTestId("repository-dropdown"); | |
fireEvent.change(repoDropdown, { target: { value: "test/repo1" } }); | |
// Get the branch dropdown and verify it's enabled | |
const branchDropdown = screen.getByTestId("branch-dropdown"); | |
expect(branchDropdown).not.toBeDisabled(); | |
// Simulate entering only whitespace in the branch input | |
fireEvent.change(branchDropdown, { target: { value: " " } }); | |
// Verify the branch input is cleared (no selected branch) | |
expect(branchDropdown).toHaveValue(""); | |
}); | |
it("should keep branch empty after being cleared even with auto-selection", async () => { | |
render(<RepositorySelectionForm onRepoSelection={mockOnRepoSelection} />); | |
// First select a repository to enable the branch dropdown | |
const repoDropdown = screen.getByTestId("repository-dropdown"); | |
fireEvent.change(repoDropdown, { target: { value: "test/repo1" } }); | |
// Get the branch dropdown and verify it's enabled | |
const branchDropdown = screen.getByTestId("branch-dropdown"); | |
expect(branchDropdown).not.toBeDisabled(); | |
// The branch should be auto-selected to "main" initially | |
expect(branchDropdown).toHaveValue("main"); | |
// Simulate deleting all text in the branch input | |
fireEvent.change(branchDropdown, { target: { value: "" } }); | |
// Verify the branch input is cleared (no selected branch) | |
expect(branchDropdown).toHaveValue(""); | |
// Trigger a re-render by changing something else | |
fireEvent.change(repoDropdown, { target: { value: "test/repo2" } }); | |
fireEvent.change(repoDropdown, { target: { value: "test/repo1" } }); | |
// The branch should be auto-selected to "main" again after repo change | |
expect(branchDropdown).toHaveValue("main"); | |
// Clear it again | |
fireEvent.change(branchDropdown, { target: { value: "" } }); | |
// Verify it stays empty | |
expect(branchDropdown).toHaveValue(""); | |
// Simulate a component update without changing repos | |
// This would normally trigger the useEffect if our fix wasn't working | |
fireEvent.blur(branchDropdown); | |
// Verify it still stays empty | |
expect(branchDropdown).toHaveValue(""); | |
}); | |
}); |