import { render, screen, fireEvent, waitFor } from "@testing-library/react";
import AddService from "@/apps/new-ui/pages/AddService/AddService";
import { useAddUserService } from "@/apps/new-ui/services/Service";
// Mock mutation
jest.mock("@/apps/new-ui/services/Service", () => ({
useAddUserService: jest.fn(),
}));
// Mock AddServiceCost
jest.mock(
"@/apps/new-ui/components/AppointmentComponents/AddServiceCost",
() => (props: any) => (
props.setCost(e.target.value)}
/>
)
);
// Mock time picker
jest.mock(
"@/apps/new-ui/components/MobilePicker/MobileTimePickerCustomizeService",
() => (props: any) => (
props.onChange(e.target.value)}
/>
)
);
// Mock emoji picker (نسخه اصلاحشده)
jest.mock("emoji-picker-react", () => ({
__esModule: true,
EmojiStyle: {},
default: ({ onEmojiClick }: any) => (
),
}));
describe("AddService Component", () => {
let mockMutate: jest.Mock;
beforeEach(() => {
mockMutate = jest.fn().mockResolvedValue({});
(useAddUserService as jest.Mock).mockReturnValue({
mutateAsync: mockMutate,
});
localStorage.clear();
});
const setup = () => {
const onClick = jest.fn();
render();
return { onClick };
};
test("enables save when all fields filled", () => {
setup();
const titleInput = screen.getAllByRole("textbox")[0]; // عنوان خدمت
const costInput = screen.getByTestId("service-cost");
const timePicker = screen.getByTestId("time-picker");
fireEvent.change(titleInput, { target: { value: "کات" } });
fireEvent.change(costInput, { target: { value: "20000" } });
fireEvent.change(timePicker, { target: { value: "00:45" } });
expect(screen.getByText("ذخیره")).not.toBeDisabled();
});
test("selecting emoji works", () => {
setup();
fireEvent.click(screen.getByText("افزودن ایموجی"));
fireEvent.click(screen.getByTestId("emoji-select"));
expect(screen.getByText("🔥")).toBeInTheDocument();
});
test("should save service and trigger mutation", async () => {
const { onClick } = setup();
localStorage.setItem("addServiceCost", "200000");
const titleInput = screen.getAllByRole("textbox")[0];
const costInput = screen.getByTestId("service-cost");
const timePicker = screen.getByTestId("time-picker");
fireEvent.change(titleInput, { target: { value: "خدمت تست" } });
fireEvent.change(costInput, { target: { value: "200000" } });
fireEvent.change(timePicker, { target: { value: "00:45" } });
fireEvent.click(screen.getByText("افزودن ایموجی"));
fireEvent.click(screen.getByTestId("emoji-select"));
fireEvent.click(screen.getByText("ذخیره"));
await waitFor(() => {
expect(mockMutate).toHaveBeenCalledWith({
service: "خدمت تست",
emoji: "🔥",
price: 200000,
time: "00:45",
});
});
expect(onClick).toHaveBeenCalled();
});
});