| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- // @vitest-environment jsdom
- import { mount } from '@vue/test-utils';
- import { describe, expect, it } from 'vitest';
- import CardRenderer from '../../src/cards/CardRenderer.vue';
- describe('CardRenderer', () => {
- it('renders department card by cardKey', () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_department',
- cardKey: 'department-selection',
- status: 'active',
- cardData: { departments: [{ departmentId: 'neurology', name: '神经内科', reason: '头痛伴恶心' }] },
- actions: [{ actionName: 'select_department', label: '选择科室' }]
- }
- }
- });
- expect(wrapper.text()).toContain('推荐科室');
- expect(wrapper.text()).toContain('神经内科');
- });
- it('renders doctor selection card', () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_doctor',
- cardKey: 'doctor-selection',
- status: 'active',
- cardData: { doctors: [{ doctorId: 'DOC001', name: '李明', title: '主任医师', specialty: '头痛', room: '302' }] },
- actions: [{ actionName: 'select_doctor', label: '选择医生' }]
- }
- }
- });
- expect(wrapper.text()).toContain('选择医生');
- expect(wrapper.text()).toContain('李明');
- expect(wrapper.text()).toContain('主任医师');
- });
- it('renders time slot selection card', () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_slot',
- cardKey: 'time-slot-selection',
- status: 'active',
- cardData: { slots: [{ slotId: 's1', timePeriod: '明天 09:30-09:45', remaining: 3 }] },
- actions: [{ actionName: 'select_time_slot', label: '选择时间' }]
- }
- }
- });
- expect(wrapper.text()).toContain('选择时间');
- expect(wrapper.text()).toContain('明天 09:30-09:45');
- });
- it('renders confirm appointment card', () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_confirm',
- cardKey: 'confirm-appointment',
- status: 'active',
- cardData: { summary: { departmentName: '神经内科', doctorName: '李明', visitTime: '明天 09:30', amount: 25 } },
- actions: [{ actionName: 'confirm_appointment', label: '确认挂号', requiredConfirm: true }]
- }
- }
- });
- expect(wrapper.text()).toContain('确认挂号信息');
- expect(wrapper.text()).toContain('神经内科');
- expect(wrapper.text()).toContain('25 元');
- });
- it('renders payment QR card with mock label', () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_payment',
- cardKey: 'payment-qrcode',
- status: 'active',
- cardData: { orderId: 'PAY001', amount: 25, qrContent: 'demo-payment://test', mock: true },
- actions: [{ actionName: 'mock_payment_paid', label: '模拟支付完成', requiredConfirm: true }]
- }
- }
- });
- expect(wrapper.text()).toContain('联调演示 / Mock 支付');
- expect(wrapper.text()).toContain('模拟支付完成');
- });
- it('renders appointment success card with mock label', () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_success',
- cardKey: 'appointment-success',
- status: 'completed',
- cardData: { appointmentNo: 'A023', departmentName: '神经内科', doctorName: '李明', visitTime: '明天 09:30', room: '302', mock: true },
- actions: []
- }
- }
- });
- expect(wrapper.text()).toContain('挂号成功');
- expect(wrapper.text()).toContain('A023');
- expect(wrapper.text()).toContain('联调演示');
- });
- it('renders error card for unknown card key', () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_unknown',
- cardKey: 'unknown-type',
- status: 'active',
- cardData: {},
- actions: []
- }
- }
- });
- expect(wrapper.text()).toContain('暂不支持的卡片类型');
- });
- it('emits action event when card button is clicked', async () => {
- const wrapper = mount(CardRenderer, {
- props: {
- card: {
- cardInstanceId: 'card_department',
- cardKey: 'department-selection',
- status: 'active',
- cardData: { departments: [{ departmentId: 'neurology', name: '神经内科', reason: '头痛伴恶心' }] },
- actions: [{ actionName: 'select_department', label: '选择科室' }]
- }
- }
- });
- await wrapper.find('button').trigger('click');
- expect(wrapper.emitted('action')).toBeTruthy();
- expect(wrapper.emitted('action')![0]).toEqual(['select_department']);
- });
- });
|