mirror of
https://github.com/All-Hands-AI/OpenHands.git
synced 2026-01-08 22:38:05 -05:00
Co-authored-by: openhands <openhands@all-hands.dev> Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
131 lines
4.7 KiB
TypeScript
131 lines
4.7 KiB
TypeScript
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("");
|
|
});
|
|
});
|