|
@@ -7,7 +7,7 @@ import { render, screen, waitFor, fireEvent } from '@testing-library/react'
|
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
|
|
import PaymentPage from '@/pages/payment/index'
|
|
import PaymentPage from '@/pages/payment/index'
|
|
|
import { creditBalanceClient } from '@/api'
|
|
import { creditBalanceClient } from '@/api'
|
|
|
-import { mockUseRouter, mockNavigateTo, mockShowToast } from '~/__mocks__/taroMock'
|
|
|
|
|
|
|
+import { mockUseRouter, mockRedirectTo, mockShowToast } from '~/__mocks__/taroMock'
|
|
|
|
|
|
|
|
// @tarojs/taro 已经在 jest.config.js 中通过 moduleNameMapper 重定向到 mock 文件
|
|
// @tarojs/taro 已经在 jest.config.js 中通过 moduleNameMapper 重定向到 mock 文件
|
|
|
// 不需要额外 mock
|
|
// 不需要额外 mock
|
|
@@ -89,6 +89,7 @@ const createTestPaymentData = () => ({
|
|
|
describe('支付页面额度支付功能测试', () => {
|
|
describe('支付页面额度支付功能测试', () => {
|
|
|
beforeEach(() => {
|
|
beforeEach(() => {
|
|
|
jest.clearAllMocks()
|
|
jest.clearAllMocks()
|
|
|
|
|
+ jest.useFakeTimers()
|
|
|
|
|
|
|
|
// 设置默认路由参数
|
|
// 设置默认路由参数
|
|
|
mockUseRouter.mockReturnValue({
|
|
mockUseRouter.mockReturnValue({
|
|
@@ -100,6 +101,10 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+ afterEach(() => {
|
|
|
|
|
+ jest.useRealTimers()
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
test('应该正确渲染支付页面', async () => {
|
|
test('应该正确渲染支付页面', async () => {
|
|
|
// Mock 额度查询返回正常数据
|
|
// Mock 额度查询返回正常数据
|
|
|
const mockCreditBalance = createTestCreditBalance()
|
|
const mockCreditBalance = createTestCreditBalance()
|
|
@@ -116,17 +121,17 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
|
|
|
|
|
// 验证页面标题
|
|
// 验证页面标题
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('支付订单')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('payment-page-title')).toBeInTheDocument()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 验证订单信息显示
|
|
// 验证订单信息显示
|
|
|
- expect(screen.getByText('订单号:')).toBeInTheDocument()
|
|
|
|
|
- expect(screen.getByText('ORD123456')).toBeInTheDocument()
|
|
|
|
|
- expect(screen.getByText('¥100.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('order-info')).toBeInTheDocument()
|
|
|
|
|
+ expect(screen.getByTestId('order-no')).toHaveTextContent('ORD123456')
|
|
|
|
|
+ expect(screen.getByTestId('payment-amount')).toHaveTextContent('¥100.00')
|
|
|
|
|
|
|
|
// 验证支付方式选项
|
|
// 验证支付方式选项
|
|
|
- expect(screen.getByText('微信支付')).toBeInTheDocument()
|
|
|
|
|
- expect(screen.getByText('额度支付')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('wechat-payment-option')).toBeInTheDocument()
|
|
|
|
|
+ expect(screen.getByTestId('credit-payment-option')).toBeInTheDocument()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
test('应该显示额度支付选项和可用额度', async () => {
|
|
test('应该显示额度支付选项和可用额度', async () => {
|
|
@@ -145,11 +150,11 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
|
|
|
|
|
// 等待额度加载完成
|
|
// 等待额度加载完成
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('可用额度: ¥800.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('available-amount-text')).toHaveTextContent('可用额度: ¥800.00')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 验证额度支付选项可用
|
|
// 验证额度支付选项可用
|
|
|
- const creditPaymentOption = screen.getByText('额度支付').closest('[class*="border-gray-200"]')
|
|
|
|
|
|
|
+ const creditPaymentOption = screen.getByTestId('credit-payment-option')
|
|
|
expect(creditPaymentOption).not.toHaveClass('opacity-50')
|
|
expect(creditPaymentOption).not.toHaveClass('opacity-50')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -174,11 +179,11 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
|
|
|
|
|
// 等待额度加载完成
|
|
// 等待额度加载完成
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('额度未启用')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('credit-disabled-text')).toHaveTextContent('额度未启用')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 验证额度支付选项被禁用
|
|
// 验证额度支付选项被禁用
|
|
|
- const creditPaymentOption = screen.getByText('额度支付').closest('[class*="border-gray-200"]')
|
|
|
|
|
|
|
+ const creditPaymentOption = screen.getByTestId('credit-payment-option')
|
|
|
expect(creditPaymentOption).toHaveClass('opacity-50')
|
|
expect(creditPaymentOption).toHaveClass('opacity-50')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -203,11 +208,11 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
|
|
|
|
|
// 等待额度加载完成
|
|
// 等待额度加载完成
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('可用额度: ¥10.00 (不足)')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('available-amount-text')).toHaveTextContent('可用额度: ¥10.00 (不足)')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 验证额度支付选项被禁用
|
|
// 验证额度支付选项被禁用
|
|
|
- const creditPaymentOption = screen.getByText('额度支付').closest('[class*="border-gray-200"]')
|
|
|
|
|
|
|
+ const creditPaymentOption = screen.getByTestId('credit-payment-option')
|
|
|
expect(creditPaymentOption).toHaveClass('opacity-50')
|
|
expect(creditPaymentOption).toHaveClass('opacity-50')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -227,24 +232,26 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
|
|
|
|
|
// 等待额度加载完成
|
|
// 等待额度加载完成
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('可用额度: ¥800.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('available-amount-text')).toHaveTextContent('可用额度: ¥800.00')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 初始应该是微信支付选中
|
|
// 初始应该是微信支付选中
|
|
|
- const wechatOption = screen.getByText('微信支付').closest('[class*="border-gray-200"]')
|
|
|
|
|
|
|
+ const wechatOption = screen.getByTestId('wechat-payment-option')
|
|
|
expect(wechatOption).toHaveClass('border-blue-500')
|
|
expect(wechatOption).toHaveClass('border-blue-500')
|
|
|
|
|
+ expect(screen.getByTestId('wechat-selected')).toBeInTheDocument()
|
|
|
|
|
|
|
|
// 点击额度支付选项
|
|
// 点击额度支付选项
|
|
|
- const creditOption = screen.getByText('额度支付').closest('[class*="border-gray-200"]')
|
|
|
|
|
- fireEvent.click(creditOption!)
|
|
|
|
|
|
|
+ const creditOption = screen.getByTestId('credit-payment-option')
|
|
|
|
|
+ fireEvent.click(creditOption)
|
|
|
|
|
|
|
|
// 验证额度支付被选中
|
|
// 验证额度支付被选中
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
expect(creditOption).toHaveClass('border-blue-500')
|
|
expect(creditOption).toHaveClass('border-blue-500')
|
|
|
|
|
+ expect(screen.getByTestId('credit-selected')).toBeInTheDocument()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 验证支付按钮文字变为额度支付
|
|
// 验证支付按钮文字变为额度支付
|
|
|
- expect(screen.getByText('额度支付 ¥100.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('pay-button')).toHaveTextContent('额度支付 ¥100.00')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
test('选择额度支付时应该显示额度详情', async () => {
|
|
test('选择额度支付时应该显示额度详情', async () => {
|
|
@@ -272,10 +279,15 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
|
|
|
|
|
// 验证显示额度详情
|
|
// 验证显示额度详情
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('• 使用信用额度支付,无需立即付款')).toBeInTheDocument()
|
|
|
|
|
- expect(screen.getByText('• 可用额度: ¥800.00')).toBeInTheDocument()
|
|
|
|
|
- expect(screen.getByText('• 总额度: ¥1000.00')).toBeInTheDocument()
|
|
|
|
|
- expect(screen.getByText('• 已用额度: ¥200.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ // 使用data-testid查询额度详情容器
|
|
|
|
|
+ const creditDetails = screen.getByTestId('credit-payment-details')
|
|
|
|
|
+ expect(creditDetails).toBeInTheDocument()
|
|
|
|
|
+
|
|
|
|
|
+ // 验证容器中包含所有额度信息
|
|
|
|
|
+ expect(creditDetails).toHaveTextContent(/使用信用额度支付,无需立即付款/)
|
|
|
|
|
+ expect(creditDetails).toHaveTextContent(/可用额度: ¥800\.00/)
|
|
|
|
|
+ expect(creditDetails).toHaveTextContent(/总额度: ¥1000\.00/)
|
|
|
|
|
+ expect(creditDetails).toHaveTextContent(/已用额度: ¥200\.00/)
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -325,8 +337,11 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 验证跳转到成功页面
|
|
// 验证跳转到成功页面
|
|
|
|
|
+ // 推进时间以触发setTimeout中的跳转
|
|
|
|
|
+ jest.advanceTimersByTime(1600)
|
|
|
|
|
+
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
- expect(mockNavigateTo).toHaveBeenCalledWith({
|
|
|
|
|
|
|
+ expect(mockRedirectTo).toHaveBeenCalledWith({
|
|
|
url: '/pages/payment-success/index?orderId=123&amount=100&paymentMethod=credit',
|
|
url: '/pages/payment-success/index?orderId=123&amount=100&paymentMethod=credit',
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
@@ -398,29 +413,32 @@ describe('支付页面额度支付功能测试', () => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 验证两个支付选项都存在
|
|
// 验证两个支付选项都存在
|
|
|
- expect(screen.getByText('微信支付')).toBeInTheDocument()
|
|
|
|
|
- expect(screen.getByText('额度支付')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('wechat-payment-option')).toBeInTheDocument()
|
|
|
|
|
+ expect(screen.getByTestId('credit-payment-option')).toBeInTheDocument()
|
|
|
|
|
|
|
|
// 默认选中微信支付
|
|
// 默认选中微信支付
|
|
|
- const wechatOption = screen.getByText('微信支付').closest('[class*="border-gray-200"]')
|
|
|
|
|
|
|
+ const wechatOption = screen.getByTestId('wechat-payment-option')
|
|
|
expect(wechatOption).toHaveClass('border-blue-500')
|
|
expect(wechatOption).toHaveClass('border-blue-500')
|
|
|
- expect(screen.getByText('微信支付 ¥100.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('wechat-selected')).toBeInTheDocument()
|
|
|
|
|
+ expect(screen.getByTestId('pay-button')).toHaveTextContent('微信支付 ¥100.00')
|
|
|
|
|
|
|
|
// 可以切换到额度支付
|
|
// 可以切换到额度支付
|
|
|
- const creditOption = screen.getByText('额度支付').closest('[class*="border-gray-200"]')
|
|
|
|
|
- fireEvent.click(creditOption!)
|
|
|
|
|
|
|
+ const creditOption = screen.getByTestId('credit-payment-option')
|
|
|
|
|
+ fireEvent.click(creditOption)
|
|
|
|
|
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
expect(creditOption).toHaveClass('border-blue-500')
|
|
expect(creditOption).toHaveClass('border-blue-500')
|
|
|
- expect(screen.getByText('额度支付 ¥100.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('credit-selected')).toBeInTheDocument()
|
|
|
|
|
+ expect(screen.getByTestId('pay-button')).toHaveTextContent('额度支付 ¥100.00')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 可以切换回微信支付
|
|
// 可以切换回微信支付
|
|
|
- fireEvent.click(wechatOption!)
|
|
|
|
|
|
|
+ fireEvent.click(wechatOption)
|
|
|
|
|
|
|
|
await waitFor(() => {
|
|
await waitFor(() => {
|
|
|
expect(wechatOption).toHaveClass('border-blue-500')
|
|
expect(wechatOption).toHaveClass('border-blue-500')
|
|
|
- expect(screen.getByText('微信支付 ¥100.00')).toBeInTheDocument()
|
|
|
|
|
|
|
+ expect(screen.getByTestId('wechat-selected')).toBeInTheDocument()
|
|
|
|
|
+ expect(screen.getByTestId('pay-button')).toHaveTextContent('微信支付 ¥100.00')
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|