diff --git a/.gitignore b/.gitignore index b0ac3ed..75abfdd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ .aider* +node_modules +test-results +.env \ No newline at end of file diff --git a/client/mobile/hooks.tsx b/client/mobile/hooks.tsx index 9b4e1ee..fcffb21 100644 --- a/client/mobile/hooks.tsx +++ b/client/mobile/hooks.tsx @@ -27,7 +27,7 @@ const ThemeContext = createContext(null); // 认证提供者组件 export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [user, setUser] = useState(null); - const [token, setToken] = useState(getLocalStorageWithExpiry('token')); + const [token, setToken] = useState(getLocalStorageWithExpiry('mobile_token')); const [isAuthenticated, setIsAuthenticated] = useState(false); const queryClient = useQueryClient(); diff --git a/test/package-lock.json b/test/package-lock.json new file mode 100644 index 0000000..17ca25e --- /dev/null +++ b/test/package-lock.json @@ -0,0 +1,88 @@ +{ + "name": "test", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "test", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@playwright/test": "^1.51.1", + "dotenv": "^16.5.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.51.1", + "resolved": "https://registry.npmmirror.com/@playwright/test/-/test-1.51.1.tgz", + "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.51.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.51.1", + "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.51.1.tgz", + "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.51.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.51.1", + "resolved": "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.51.1.tgz", + "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000..986b7b6 --- /dev/null +++ b/test/package.json @@ -0,0 +1,15 @@ +{ + "name": "test", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "@playwright/test": "^1.51.1", + "dotenv": "^16.5.0" + }, + "author": "", + "license": "ISC", + "description": "" +} diff --git a/test/pages_know_info.test.ts b/test/pages_know_info.test.ts new file mode 100644 index 0000000..999f77e --- /dev/null +++ b/test/pages_know_info.test.ts @@ -0,0 +1,42 @@ +import { test, expect } from '@playwright/test'; + +test.describe('知识库管理CRUD测试', () => { + test.beforeEach(async ({ page }) => { + // 先登录获取有效token + await page.goto(`${process.env.BASE_URL}/admin/login`); + await page.fill('input[placeholder="用户名"]', 'admin'); + await page.fill('input[placeholder="密码"]', 'admin123'); + await page.click('button:has-text("登 录")'); + await expect(page).toHaveURL(/\/admin\/dashboard/); + + // 导航到测试页面 + await page.goto(`${process.env.BASE_URL}/admin/know-info`); + }); + + test('添加测试文章', async ({ page }) => { + await page.click('button:has-text("添加文章")'); + await page.fill('input[placeholder="请输入文章标题"]', '测试文章-自动化测试'); + await page.click('button:has-text("确 定")'); + await expect(page.locator('text=测试文章-自动化测试')).toBeVisible(); + }); + + test('搜索测试文章', async ({ page }) => { + await page.fill('input[placeholder="要搜索的文章标题"]', '测试文章-自动化测试'); + await page.click('button:has-text("搜 索")'); + await expect(page.locator('text=测试文章-自动化测试')).toBeVisible(); + await page.click('button:has-text("重 置")'); + }); + + test('修改测试文章', async ({ page }) => { + await page.click('tr:has-text("测试文章-自动化测试") >> button:has-text("编辑")'); + await page.fill('input[placeholder="请输入文章标题"]', '修改后的测试标题'); + await page.click('button:has-text("确 定")'); + await expect(page.locator('text=修改后的测试标题')).toBeVisible(); + }); + + test('删除测试文章', async ({ page }) => { + await page.click('tr:has-text("修改后的测试标题") >> button:has-text("删除")'); + await page.click('.ant-btn-primary:has-text("确 定")'); + await expect(page.locator('text=修改后的测试标题')).not.toBeVisible(); + }); +}); \ No newline at end of file diff --git a/test/playwright.config.ts b/test/playwright.config.ts new file mode 100644 index 0000000..ad5f6d4 --- /dev/null +++ b/test/playwright.config.ts @@ -0,0 +1,15 @@ +// playwright.config.js +require('dotenv').config(); +const { defineConfig } = require('@playwright/test'); + +module.exports = defineConfig({ + projects: [ + { + name: 'chromium', + use: { + browserName: 'chromium', + baseURL: process.env.BASE_URL || 'http://localhost:3000' + }, + }, + ], +}); \ No newline at end of file