import React from 'react'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import Settings from '../src/pages/Settings/Settings'
// Mock Taro
jest.mock('@tarojs/taro', () => ({
showToast: jest.fn(),
showModal: jest.fn(({ success }) => success?.({ confirm: true })),
removeStorageSync: jest.fn(),
reLaunch: jest.fn()
}))
// Mock auth hook
jest.mock('@d8d/mini-enterprise-auth-ui/hooks', () => ({
useAuth: jest.fn(() => ({
user: {
id: 1,
username: 'testuser',
nickname: '测试企业',
company: {
id: 1,
companyName: '阿里巴巴集团',
contactPerson: '张三',
contactPhone: '13800138000',
status: 1,
createTime: '2023-01-01',
updateTime: '2023-01-01'
}
},
logout: jest.fn()
}))
}))
// Mock API client
jest.mock('../src/api/companyClient', () => ({
enterpriseCompanyClient: {
overview: {
$get: jest.fn()
}
}
}))
// Mock layouts
jest.mock('@d8d/yongren-shared-ui/components/YongrenTabBarLayout', () => ({
YongrenTabBarLayout: ({ children, activeKey }: any) => (
{children}
)
}))
jest.mock('@d8d/mini-shared-ui-components/components/navbar', () => ({
Navbar: ({ title }: any) => {title}
}))
const { enterpriseCompanyClient } = require('../../api/companyClient')
const { useAuth } = require('@d8d/mini-enterprise-auth-ui/hooks')
const Taro = require('@tarojs/taro')
const createTestQueryClient = () => new QueryClient({
defaultOptions: {
queries: { retry: false },
mutations: { retry: false }
}
})
const renderWithQueryClient = (component: React.ReactElement) => {
const queryClient = createTestQueryClient()
return render(
{component}
)
}
describe('Settings', () => {
beforeEach(() => {
jest.clearAllMocks()
})
describe('企业信息展示', () => {
it('应该显示加载状态', () => {
enterpriseCompanyClient.overview.$get.mockImplementation(
() => new Promise(() => {})
)
renderWithQueryClient()
expect(screen.getByText('加载中...')).toBeInTheDocument()
})
it('应该成功加载并显示企业信息', async () => {
const mockOverview = {
'在职人员数': 24,
'进行中订单数': 3,
'已完成订单数': 9,
'累计订单数': 12
}
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => mockOverview
})
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('阿里巴巴集团')).toBeInTheDocument()
expect(screen.getByText('24')).toBeInTheDocument()
expect(screen.getByText('3')).toBeInTheDocument()
expect(screen.getByText('12')).toBeInTheDocument()
expect(screen.getByText('在职人员')).toBeInTheDocument()
expect(screen.getByText('进行中订单')).toBeInTheDocument()
expect(screen.getByText('累计订单')).toBeInTheDocument()
})
})
it('应该显示企业账号标识', async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('企业账号')).toBeInTheDocument()
})
})
})
describe('功能列表', () => {
beforeEach(async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
})
it('应该显示所有功能项', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('账号信息')).toBeInTheDocument()
expect(screen.getByText('安全设置')).toBeInTheDocument()
expect(screen.getByText('消息通知')).toBeInTheDocument()
expect(screen.getByText('帮助中心')).toBeInTheDocument()
expect(screen.getByText('用户协议')).toBeInTheDocument()
expect(screen.getByText('隐私政策')).toBeInTheDocument()
expect(screen.getByText('退出登录')).toBeInTheDocument()
})
})
it('应该显示延期功能的标识', async () => {
renderWithQueryClient()
await waitFor(() => {
const deferredLabels = screen.getAllByText('(后期优化)')
expect(deferredLabels.length).toBeGreaterThan(0)
})
})
})
describe('延期功能处理', () => {
beforeEach(async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
})
it('点击延期功能应该显示提示', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('账号信息')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('账号信息'))
expect(Taro.showModal).toHaveBeenCalledWith(
expect.objectContaining({
title: '功能开发中',
content: expect.stringContaining('账号信息功能正在开发中')
})
)
})
it('点击安全设置应该显示提示', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('安全设置')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('安全设置'))
expect(Taro.showModal).toHaveBeenCalledWith(
expect.objectContaining({
title: '功能开发中',
content: expect.stringContaining('安全设置功能正在开发中')
})
)
})
it('点击消息通知应该显示提示', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('消息通知')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('消息通知'))
expect(Taro.showModal).toHaveBeenCalledWith(
expect.objectContaining({
title: '功能开发中',
content: expect.stringContaining('消息通知功能正在开发中')
})
)
})
})
describe('退出登录', () => {
beforeEach(async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
})
it('点击退出登录应该显示确认对话框', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('退出登录')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('退出登录'))
expect(Taro.showModal).toHaveBeenCalledWith(
expect.objectContaining({
title: '退出登录',
content: '确定要退出登录吗?'
})
)
})
it('确认退出登录应该清除认证信息并跳转', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('退出登录')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('退出登录'))
await waitFor(() => {
expect(Taro.removeStorageSync).toHaveBeenCalledWith('enterpriseToken')
expect(Taro.removeStorageSync).toHaveBeenCalledWith('enterpriseUser')
expect(Taro.reLaunch).toHaveBeenCalledWith({
url: '/pages/login/index'
})
})
})
})
describe('其他功能', () => {
beforeEach(async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
})
it('点击帮助中心应该显示提示', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('帮助中心')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('帮助中心'))
expect(Taro.showToast).toHaveBeenCalledWith(
expect.objectContaining({ title: '即将开放' })
)
})
it('点击用户协议应该显示提示', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('用户协议')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('用户协议'))
expect(Taro.showToast).toHaveBeenCalledWith(
expect.objectContaining({ title: '即将开放' })
)
})
it('点击隐私政策应该显示提示', async () => {
renderWithQueryClient()
await waitFor(() => {
expect(screen.getByText('隐私政策')).toBeInTheDocument()
})
fireEvent.click(screen.getByText('隐私政策'))
expect(Taro.showToast).toHaveBeenCalledWith(
expect.objectContaining({ title: '即将开放' })
)
})
})
describe('组件集成', () => {
it('应该正确集成Navbar组件', async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
renderWithQueryClient()
await waitFor(() => {
const navbar = screen.getByTestId('navbar')
expect(navbar).toBeInTheDocument()
expect(navbar).toHaveTextContent('企业设置')
})
})
it('应该正确集成TabBarLayout并激活settings标签', async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
renderWithQueryClient()
await waitFor(() => {
const layout = screen.getByTestId('tab-bar-layout')
expect(layout).toHaveAttribute('data-active-key', 'settings')
})
})
it('应该正确集成useAuth hook', async () => {
enterpriseCompanyClient.overview.$get.mockResolvedValue({
ok: true,
json: async () => ({})
})
renderWithQueryClient()
await waitFor(() => {
expect(useAuth).toHaveBeenCalled()
expect(screen.getByText('阿里巴巴集团')).toBeInTheDocument()
})
})
})
})