/**
* ModalWrapper Component Tests
*
* 測試目標:
* 1. PeopleModalTrigger 能正確渲染
* 2. 點擊 trigger 時呼叫廠商 modal
* 3. peopleModal helper 正常運作
*/
import React from 'react';
import { render, cleanup as rtlCleanup, fireEvent, waitFor } from '@testing-library/react';
import { PeopleModalTrigger, peopleModal } from '@/components/aia/modal-wrapper';
import * as vendorModal from '@vendor-web/js/components/modal.js';
// Mock 廠商 modal.js
jest.mock('@vendor-web/js/components/modal.js', () => ({
peopleModal: jest.fn(),
openModal: jest.fn(),
closeModal: jest.fn(),
}));
describe('ModalWrapper Components', () => {
beforeEach(() => {
jest.clearAllMocks();
(vendorModal.peopleModal as jest.Mock).mockResolvedValue(undefined);
});
afterEach(() => {
rtlCleanup();
});
describe('PeopleModalTrigger', () => {
it('應該渲染 trigger 按鈕', () => {
const modalData = {
name: 'John Doe',
title: 'CEO',
text: 'Bio text',
};
const { getByText } = render(
Open Modal
);
expect(getByText('Open Modal')).toBeInTheDocument();
});
it('應該在點擊時呼叫廠商 peopleModal', async () => {
const modalData = {
portrait: '/images/person.jpg',
name: 'John Doe',
title: 'CEO',
text: 'Bio text',
};
const { getByText } = render(
Open Modal
);
const button = getByText('Open Modal');
fireEvent.click(button);
await waitFor(() => {
expect(vendorModal.peopleModal).toHaveBeenCalledWith(modalData);
});
});
it('應該支援自訂 onClick handler', async () => {
const modalData = { name: 'Test' };
const onClickMock = jest.fn();
const { getByText } = render(
Click Me
);
fireEvent.click(getByText('Click Me'));
await waitFor(() => {
expect(onClickMock).toHaveBeenCalled();
expect(vendorModal.peopleModal).toHaveBeenCalled();
});
});
it('應該支援自訂元素類型(as prop)', () => {
const modalData = { name: 'Test' };
const { container } = render(
Custom Element
);
expect(container.querySelector('div')).toBeInTheDocument();
});
it('應該傳遞其他 HTML 屬性', () => {
const modalData = { name: 'Test' };
const { getByRole } = render(
Button
);
const button = getByRole('button');
expect(button).toHaveClass('custom-class');
expect(button).toHaveAttribute('data-testid', 'modal-trigger');
});
});
describe('peopleModal helper', () => {
it('應該呼叫廠商 peopleModal 函式', () => {
const modalData = {
name: 'Jane Doe',
title: 'CTO',
};
peopleModal(modalData);
expect(vendorModal.peopleModal).toHaveBeenCalledWith(modalData);
});
it('應該返回 Promise', async () => {
(vendorModal.peopleModal as jest.Mock).mockResolvedValue('success');
const result = await peopleModal({ name: 'Test' });
expect(result).toBe('success');
});
});
});