import React from "react"; import { fireEvent, render } from "@testing-library/react-native"; import BuyInSelector from "@/components/BuyInSelector"; jest.mock("@expo/vector-icons", () => { const { Text } = require("react-native"); return { MaterialIcons: () => MaterialIcons, }; }); describe("BuyInSelector Component", () => { let setBuyInAmount; let getByText; let getByPlaceholderText; const renderComponent = () => { const result = render(); getByText = result.getByText; getByPlaceholderText = result.getByPlaceholderText; }; beforeEach(() => { setBuyInAmount = jest.fn(); renderComponent(); }); it("renders the buy-in options and input correctly", () => { expect(getByText("Select Buy-in Amount:")).toBeTruthy(); expect(getByText("10")).toBeTruthy(); expect(getByText("25")).toBeTruthy(); expect(getByText("50")).toBeTruthy(); expect(getByPlaceholderText("Enter custom buy-in")).toBeTruthy(); expect(getByText("Selected Buy-in: None")).toBeTruthy(); // Check default selection }); it("sets a predefined buy-in amount correctly", () => { fireEvent.press(getByText("25")); expect(setBuyInAmount).toHaveBeenCalledWith(25); }); it("sets a custom buy-in amount correctly", () => { fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "100"); expect(setBuyInAmount).toHaveBeenCalledWith(100); }); it("resets custom amount if invalid input is entered", () => { fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "-10"); expect(setBuyInAmount).toHaveBeenCalledWith(25); // Assuming 25 is the default fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "abc"); expect(setBuyInAmount).toHaveBeenCalledWith(25); // Reset to default }); it("clears the custom amount when selecting a predefined option", () => { fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "100"); fireEvent.press(getByText("50")); expect(setBuyInAmount).toHaveBeenCalledWith(50); }); it("handles valid and invalid input for custom amount correctly", () => { fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "75"); expect(setBuyInAmount).toHaveBeenCalledWith(75); fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "-5"); expect(setBuyInAmount).toHaveBeenCalledWith(25); fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "abc"); expect(setBuyInAmount).toHaveBeenCalledWith(25); }); it("triggers state update every time a buy-in option is clicked, even if it's the same", () => { fireEvent.press(getByText("25")); // First click fireEvent.press(getByText("25")); // Clicking the same option again expect(setBuyInAmount).toHaveBeenCalledTimes(2); // Expect it to be called twice }); it("resets to default buy-in when custom input is cleared", () => { const input = getByPlaceholderText("Enter custom buy-in"); fireEvent.changeText(input, "75"); expect(setBuyInAmount).toHaveBeenCalledWith(75); fireEvent.changeText(input, ""); expect(setBuyInAmount).toHaveBeenCalledWith(25); // Assuming 25 is the default }); it("updates state correctly when selecting predefined buy-in after entering a custom amount", () => { fireEvent.changeText(getByPlaceholderText("Enter custom buy-in"), "200"); expect(setBuyInAmount).toHaveBeenCalledWith(200); fireEvent.press(getByText("10")); expect(setBuyInAmount).toHaveBeenCalledWith(10); }); });