import { describe, expect, it, vi } from 'vitest' import { mount } from '@vue/test-utils' import { nextTick } from 'vue' import PaymentProviderDialog from '@/components/payment/PaymentProviderDialog.vue' const messages: Record = { 'admin.settings.payment.providerConfig': 'Credentials', 'admin.settings.payment.paymentGuideTrigger': 'View payment guide', 'admin.settings.payment.alipayGuideSummary': 'Desktop prefers QR precreate and falls back to cashier; mobile prefers WAP checkout.', 'admin.settings.payment.wxpayGuideSummary': 'Desktop prefers Native QR; mobile routes to JSAPI or H5 based on browser context.', } vi.mock('vue-i18n', () => ({ useI18n: () => ({ t: (key: string) => messages[key] ?? key, }), })) function mountDialog() { return mount(PaymentProviderDialog, { props: { show: true, saving: false, editing: null, allKeyOptions: [ { value: 'alipay', label: 'Alipay' }, { value: 'wxpay', label: 'WeChat Pay' }, { value: 'stripe', label: 'Stripe' }, ], enabledKeyOptions: [ { value: 'alipay', label: 'Alipay' }, { value: 'wxpay', label: 'WeChat Pay' }, ], allPaymentTypes: [ { value: 'alipay', label: 'Alipay' }, { value: 'wxpay', label: 'WeChat Pay' }, ], redirectLabel: 'Redirect', }, global: { stubs: { BaseDialog: { template: '
', }, Select: { props: ['modelValue', 'options', 'disabled'], template: '
', }, ToggleSwitch: { template: '
', }, }, }, }) } describe('PaymentProviderDialog payment guide', () => { it('shows no payment guide for providers without a flow guide', () => { const wrapper = mountDialog() expect(wrapper.text()).not.toContain(messages['admin.settings.payment.alipayGuideSummary']) expect(wrapper.text()).not.toContain(messages['admin.settings.payment.wxpayGuideSummary']) expect(wrapper.find('button[title="View payment guide"]').exists()).toBe(false) }) it.each([ ['alipay', 'admin.settings.payment.alipayGuideSummary'], ['wxpay', 'admin.settings.payment.wxpayGuideSummary'], ])('shows the payment guide summary for %s', async (providerKey, summaryKey) => { const wrapper = mountDialog() ;(wrapper.vm as unknown as { reset: (key: string) => void }).reset(providerKey) await nextTick() expect(wrapper.text()).toContain(messages[summaryKey]) expect(wrapper.find('button[title="View payment guide"]').exists()).toBe(true) }) })