添加了相关测试文件,引入Tailwindcss
Change-Id: I12054143571bb688590af0357125a0ed26ff2050
diff --git a/src/contexts/AuthContext.jsx b/src/contexts/AuthContext.jsx
new file mode 100644
index 0000000..9e5bb59
--- /dev/null
+++ b/src/contexts/AuthContext.jsx
@@ -0,0 +1,44 @@
+import React, { createContext, useContext, useState, useEffect } from 'react';
+
+const AuthContext = createContext();
+
+export const AuthProvider = ({ children }) => {
+ const [user, setUser] = useState(null);
+ const [permissions, setPermissions] = useState([]);
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ // 从localStorage加载用户和权限信息
+ const storedUser = localStorage.getItem('user');
+ const storedPermissions = localStorage.getItem('permissions');
+
+ if (storedUser) {
+ setUser(JSON.parse(storedUser));
+ }
+
+ if (storedPermissions) {
+ setPermissions(JSON.parse(storedPermissions));
+ }
+
+ setLoading(false);
+ }, []);
+
+ // 检查用户是否有特定权限
+ const hasPermission = (permissionName) => {
+ return permissions.includes(permissionName);
+ };
+
+ // 检查用户是否有特定角色
+ const hasRole = (roleName) => {
+ return user?.role === roleName;
+ };
+
+ return (
+ <AuthContext.Provider value={{ user, permissions, hasPermission, hasRole, loading }}>
+ {children}
+ </AuthContext.Provider>
+ );
+};
+
+// 自定义hook方便使用
+export const useAuth = () => useContext(AuthContext);
\ No newline at end of file
diff --git a/src/contexts/AuthContext.test.jsx b/src/contexts/AuthContext.test.jsx
new file mode 100644
index 0000000..9536be2
--- /dev/null
+++ b/src/contexts/AuthContext.test.jsx
@@ -0,0 +1,48 @@
+import { describe, it, expect, beforeEach } from 'vitest';
+import { render, screen } from '@testing-library/react';
+import { AuthProvider, useAuth } from './AuthContext';
+
+// 创建一个测试组件来使用 useAuth hook
+const TestComponent = () => {
+ const { user, hasRole } = useAuth();
+ return (
+ <div>
+ <div data-testid="user-info">{user ? JSON.stringify(user) : 'no user'}</div>
+ <div data-testid="is-admin">{hasRole('admin') ? 'is admin' : 'not admin'}</div>
+ </div>
+ );
+};
+
+describe('AuthContext', () => {
+ beforeEach(() => {
+ window.localStorage.clear();
+ });
+
+ it('应该提供默认值', () => {
+ render(
+ <AuthProvider>
+ <TestComponent />
+ </AuthProvider>
+ );
+
+ expect(screen.getByTestId('user-info')).toHaveTextContent('no user');
+ expect(screen.getByTestId('is-admin')).toHaveTextContent('not admin');
+ });
+
+ it('应该从 localStorage 加载用户信息', () => {
+ // 模拟管理员
+ window.localStorage.setItem('user', JSON.stringify({
+ username: 'admin',
+ role: 'admin'
+ }));
+
+ render(
+ <AuthProvider>
+ <TestComponent />
+ </AuthProvider>
+ );
+
+ expect(screen.getByTestId('user-info')).toHaveTextContent('admin');
+ expect(screen.getByTestId('is-admin')).toHaveTextContent('is admin');
+ });
+});
\ No newline at end of file