Files
salona/tests/Information.test.tsx
farnoosh-krm ed3906fad6 add tests and UI modified
(fix): add appointment code in requests and profile completion reward
(test): add test coverage for multiple pages and components

(fix) - Added appointment code to the Requests section
(fix) - Added "Claim Gift" feature for completing the profile

(test) Added tests for the following pages/components:
1- Active Devices
2- Add Service
3- Appointment Request (cards display section)
4- Create Gift Card
5- Customer List component (used in Quick Booking, Advanced Booking, etc.)
6- Customer List in Customer Club
7- Delete and Edit buttons (used across the entire app)
8- Invoice
9- Create Individual Schedule Table
10- Notification SMS in SMS Center
11- Loyalty Card List
12- Loyal Customers in ResAssistant
13- Map component
14- Staff List in Staff Management
15- Services List (used in General Link, Custom Link, Advanced Booking, etc.)
16- Services List (used in Quick Booking, Gift Card, Discount Center, etc.)
2026-04-13 16:32:38 +03:30

238 lines
6.1 KiB
TypeScript

import { render, screen, fireEvent, waitFor } from "@testing-library/react";
import { useGetUserInfo } from "@/apps/new-ui/services/User";
import { useGetUserCards } from "@/apps/new-ui/services/Card";
import { useGetLinkShortnerUrl } from "@/apps/new-ui/services/Explore";
import Information from "@/apps/new-ui/pages/sms-kade/+components/Information";
// mock modal children
jest.mock("../src/apps/new-ui/Utils/env.ts", () => ({
ENV: {
API_URL: "https://api.test",
},
}));
jest.mock(
"@/apps/new-ui/pages/sms-kade/+components/SelectSMSContent",
() => () => <div data-testid="select-sms-content">SMS CONTENT</div>,
);
jest.mock(
"@/apps/new-ui/pages/sms-kade/+components/SubmitSMSContext.tsx",
() =>
({ onConfirm }: any) => (
<div data-testid="submit-sms-context">
<button onClick={onConfirm}>confirm-submit</button>
</div>
),
);
jest.mock(
"@/apps/new-ui/pages/sms-kade/+components/CustomerCardSMS",
() => () => <div data-testid="customer-card-sms" />,
);
jest.mock(
"@/apps/new-ui/pages/sms-kade/+components/BusinessCardModal.tsx",
() => (props: any) => {
if (!props.open) return null;
return (
<div data-testid="business-card-modal">
<button
data-testid="modal-confirm"
onClick={() =>
props.onConfirm({
id: 1,
name: "Test Card",
link_shorten: "https://card",
})
}
>
confirm-card
</button>
<button data-testid="modal-close" onClick={props.onClose}>
close
</button>
</div>
);
},
);
// mock delete button
jest.mock(
"@/apps/new-ui/components/CustomeComponents/DeleteButton",
() => (props: any) => (
<button data-testid="delete-btn" onClick={props.onclick}>
delete
</button>
),
);
// mock SubscriptionWrapper (فقط دیو می‌کنیم)
jest.mock(
"@/apps/new-ui/components/SubscriptionWrapper",
() => (props: any) => <div>{props.children}</div>,
);
/* mock services */
jest.mock("@/apps/new-ui/services/User.ts", () => ({
useGetUserInfo: jest.fn(),
}));
jest.mock("@/apps/new-ui/services/Card", () => ({
useGetUserCards: jest.fn(),
}));
jest.mock("@/apps/new-ui/services/Explore", () => ({
useGetLinkShortnerUrl: jest.fn(),
}));
const mockUser = {
current_user: {
user_id: 10,
phone_number: "09120000000",
name: "Test Artist",
},
user_abilities_list: [
{}, //0
{ active: true }, //1
{},
{},
{},
{}, // 2,3,4,5
{ active: false }, //6 پرسنلی نیست
],
};
const mockCards = {
artist_cards: [
{ id: 1, name: "Artist Card", link_shorten: "https://artist-card" },
],
salon_cards: [],
};
const mockShortner = {
URL: "https://salona.io",
};
describe("Information component", () => {
beforeEach(() => {
jest.clearAllMocks();
localStorage.clear();
(useGetUserInfo as jest.Mock).mockReturnValue({
data: mockUser,
isLoading: false,
});
(useGetUserCards as jest.Mock).mockReturnValue({
data: mockCards,
});
(useGetLinkShortnerUrl as jest.Mock).mockReturnValue({
data: mockShortner,
});
localStorage.setItem("selectedCustomersCount", "3");
});
const renderUI = () => render(<Information />);
// -------------------------------------
it("renders base UI elements", () => {
renderUI();
expect(screen.getByText("محتوای پیام")).toBeInTheDocument();
expect(screen.getByText("(3)")).toBeInTheDocument();
});
// -------------------------------------
it("opens SMS content modal", () => {
renderUI();
fireEvent.click(screen.getByText("انتخاب محتوای پیام"));
expect(screen.getByTestId("select-sms-content")).toBeInTheDocument();
});
// -------------------------------------
it("selects SMS content then shows formatted text", async () => {
localStorage.setItem("selectedTextSMS", "سلام {artist}");
renderUI();
expect(screen.getByText("سلام Test Artist")).toBeInTheDocument();
});
// -------------------------------------
it("selects business card correctly", async () => {
localStorage.setItem("selectedTextSMS", "hi {business_card}");
renderUI();
fireEvent.click(screen.getByText("لینک کارت ویزیت قرار گیرد"));
const modal = screen.getByTestId("business-card-modal");
expect(modal).toBeInTheDocument();
fireEvent.click(screen.getByTestId("modal-confirm"));
await waitFor(() => {
expect(screen.getByText("Test Card")).toBeInTheDocument();
expect(screen.getByText("https://card")).toBeInTheDocument();
});
expect(localStorage.getItem("sms_selectedBusinessCard")).toContain(
"Test Card",
);
});
// -------------------------------------
it("selects schedule link correctly", () => {
localStorage.setItem("selectedTextSMS", "link: {schedule_link}");
renderUI();
fireEvent.click(screen.getByText("لینک جدول زمانی قرار گیرد"));
expect(screen.getByText("لینک جدول زمانی")).toBeInTheDocument();
expect(screen.getByText("https://salona.io/10")).toBeInTheDocument();
});
// -------------------------------------
it("delete selected business card", async () => {
localStorage.setItem("selectedTextSMS", "x");
localStorage.setItem(
"sms_selectedBusinessCard",
JSON.stringify(mockCards.artist_cards[0]),
);
renderUI();
fireEvent.click(screen.getByTestId("delete-btn"));
await waitFor(() => {
expect(localStorage.getItem("sms_selectedBusinessCard")).toBeNull();
});
});
// -------------------------------------
it("opens and closes submit modal", async () => {
localStorage.setItem("selectedTextSMS", "test");
renderUI();
fireEvent.click(screen.getByText("ارسال پیامک"));
expect(screen.getByTestId("submit-sms-context")).toBeInTheDocument();
fireEvent.click(screen.getByText("confirm-submit"));
await waitFor(() => {
// بعد از confirm همه کلیدها پاک می‌شود
expect(localStorage.getItem("sms_selectedBusinessCard")).toBeNull();
expect(localStorage.getItem("sms_includePhoneNumber")).toBeNull();
});
});
});