78 lines
2.7 KiB
TypeScript
78 lines
2.7 KiB
TypeScript
/* @vitest-environment jsdom */
|
|
|
|
import {
|
|
fireEvent,
|
|
render,
|
|
screen,
|
|
waitFor,
|
|
within,
|
|
} from '@testing-library/react';
|
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
|
|
import * as clipboardService from '../../services/clipboard';
|
|
import { PublishShareModal } from './PublishShareModal';
|
|
import {
|
|
buildPublishShareText,
|
|
type PublishShareModalPayload,
|
|
} from './publishShareModalModel';
|
|
|
|
vi.mock('../../services/clipboard', () => ({
|
|
copyTextToClipboard: vi.fn(),
|
|
}));
|
|
|
|
const payload: PublishShareModalPayload = {
|
|
title: '暖灯猫街',
|
|
publicWorkCode: 'PZ-00000001',
|
|
stage: 'puzzle-gallery-detail',
|
|
};
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('PublishShareModal', () => {
|
|
test('builds the publish share text with title, code and public url', () => {
|
|
const text = buildPublishShareText(payload);
|
|
|
|
expect(text).toContain('邀请你来玩《暖灯猫街》');
|
|
expect(text).toContain('作品号:PZ-00000001');
|
|
expect(text).toContain('/gallery/puzzle/detail?work=PZ-00000001');
|
|
});
|
|
|
|
test('renders share text and channel icons, then copies from main button', async () => {
|
|
vi.mocked(clipboardService.copyTextToClipboard).mockResolvedValue(true);
|
|
|
|
render(
|
|
<PublishShareModal open payload={payload} onClose={() => {}} />,
|
|
);
|
|
|
|
const dialog = screen.getByRole('dialog', { name: '分享给朋友' });
|
|
expect(dialog.parentElement?.className).toContain('!items-center');
|
|
expect(dialog.parentElement?.className).toContain('platform-theme--light');
|
|
expect(dialog.className).toContain('platform-modal-shell');
|
|
expect(dialog.className).toContain('rounded-[1.75rem]');
|
|
expect(dialog.getAttribute('style')).toBeNull();
|
|
expect(within(dialog).getByText(/邀请你来玩《暖灯猫街》/u)).toBeTruthy();
|
|
expect(within(dialog).getByRole('button', { name: '分享' })).toBeTruthy();
|
|
expect(within(dialog).getByRole('button', { name: '分享到微信' })).toBeTruthy();
|
|
expect(within(dialog).getByRole('button', { name: '分享到QQ' })).toBeTruthy();
|
|
expect(within(dialog).getByRole('button', { name: '分享到抖音' })).toBeTruthy();
|
|
expect(
|
|
within(dialog).getByTestId('share-channel-logo-wechat'),
|
|
).toBeTruthy();
|
|
expect(within(dialog).getByTestId('share-channel-logo-qq')).toBeTruthy();
|
|
expect(
|
|
within(dialog).getByTestId('share-channel-logo-douyin'),
|
|
).toBeTruthy();
|
|
|
|
fireEvent.click(within(dialog).getByRole('button', { name: '分享' }));
|
|
|
|
expect(clipboardService.copyTextToClipboard).toHaveBeenCalledWith(
|
|
expect.stringContaining('作品号:PZ-00000001'),
|
|
);
|
|
await waitFor(() => {
|
|
expect(within(dialog).getByRole('button', { name: '已复制' })).toBeTruthy();
|
|
});
|
|
});
|
|
});
|