fix: 修复供应商管理弹窗交互问题并去掉 API Key 脱敏
- Dialog 设置 lazy={false} 修复首次打开编辑弹窗表单为空
- API Key 改为普通字段(前端去掉 password 类型,后端去掉掩码逻辑)
- 删除模型编辑弹窗中的统一模型 ID 字段
- 简化 ProviderService.Get 签名(去掉 maskKey 参数)
- 删除 domain 和 config 层的 MaskAPIKey() 方法
- 更新前后端测试(107 单元测试 + 16 E2E 全部通过)
- 同步 delta spec 到主 spec
This commit is contained in:
@@ -12,7 +12,7 @@ function formInputs(page: import('@playwright/test').Page) {
|
||||
return {
|
||||
id: dialog.locator('input[placeholder="例如: openai"]'),
|
||||
name: dialog.locator('input[placeholder="例如: OpenAI"]'),
|
||||
apiKey: dialog.locator('input[type="password"]'),
|
||||
apiKey: dialog.locator('input[placeholder="sk-..."]'),
|
||||
baseUrl: dialog.locator('input[placeholder="例如: https://api.openai.com/v1"]'),
|
||||
protocol: dialog.locator('.t-select'),
|
||||
saveBtn: dialog.locator('.t-dialog__footer').getByRole('button', { name: '保存' }),
|
||||
@@ -66,9 +66,6 @@ test.describe('供应商管理', () => {
|
||||
await responsePromise
|
||||
await expect(page.locator('.t-table__body').getByText('Before Edit')).toBeVisible({ timeout: 5000 })
|
||||
|
||||
await inputs.cancelBtn.click()
|
||||
await expect(page.locator('.t-dialog:visible')).not.toBeVisible({ timeout: 3000 })
|
||||
|
||||
await page.locator('.t-table__body button:has-text("编辑")').first().click()
|
||||
await expect(page.locator('.t-dialog:visible')).toBeVisible()
|
||||
|
||||
@@ -97,9 +94,6 @@ test.describe('供应商管理', () => {
|
||||
await page.waitForSelector('.t-select__dropdown', { state: 'hidden', timeout: 3000 })
|
||||
await inputs.saveBtn.click()
|
||||
await expect(page.locator('.t-table__body').getByText('To Delete')).toBeVisible({ timeout: 10000 })
|
||||
|
||||
await inputs.cancelBtn.click()
|
||||
await expect(page.locator('.t-dialog:visible')).not.toBeVisible({ timeout: 3000 })
|
||||
|
||||
await page.locator('.t-table__body button:has-text("删除")').first().click()
|
||||
await expect(page.getByText('确定要删除这个供应商吗?')).toBeVisible()
|
||||
@@ -107,7 +101,7 @@ test.describe('供应商管理', () => {
|
||||
await expect(page.locator('.t-table__body').getByText('To Delete')).not.toBeVisible({ timeout: 5000 })
|
||||
})
|
||||
|
||||
test('应正确脱敏显示 API Key', async ({ page }) => {
|
||||
test('应正确显示完整 API Key', async ({ page }) => {
|
||||
const testId = nextId()
|
||||
await page.getByRole('button', { name: '添加供应商' }).click()
|
||||
await expect(page.locator('.t-dialog:visible')).toBeVisible()
|
||||
@@ -123,6 +117,6 @@ test.describe('供应商管理', () => {
|
||||
await inputs.saveBtn.click()
|
||||
await expect(page.locator('.t-table__body').getByText('Mask Test')).toBeVisible({ timeout: 10000 })
|
||||
|
||||
await expect(page.locator('.t-table__body')).toContainText('****wxyz')
|
||||
await expect(page.locator('.t-table__body')).toContainText('sk_abcdefghijklmnopqrstuvwxyz')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -5,7 +5,7 @@ function formInputs(page: import('@playwright/test').Page) {
|
||||
return {
|
||||
id: dialog.locator('input[placeholder="例如: openai"]'),
|
||||
name: dialog.locator('input[placeholder="例如: OpenAI"]'),
|
||||
apiKey: dialog.locator('input[type="password"]'),
|
||||
apiKey: dialog.locator('input[placeholder="sk-..."]'),
|
||||
baseUrl: dialog.locator('input[placeholder="例如: https://api.openai.com/v1"]'),
|
||||
saveBtn: dialog.locator('.t-dialog__footer').getByRole('button', { name: '保存' }),
|
||||
cancelBtn: dialog.locator('.t-dialog__footer').getByRole('button', { name: '取消' }),
|
||||
@@ -20,7 +20,7 @@ test.describe('供应商表单验证', () => {
|
||||
|
||||
test('应显示必填字段验证', async ({ page }) => {
|
||||
await page.getByRole('button', { name: '添加供应商' }).click()
|
||||
await expect(page.locator('.t-dialog')).toBeVisible()
|
||||
await expect(page.locator('.t-dialog:visible')).toBeVisible()
|
||||
|
||||
await formInputs(page).saveBtn.click()
|
||||
|
||||
@@ -32,7 +32,7 @@ test.describe('供应商表单验证', () => {
|
||||
|
||||
test('应验证URL格式', async ({ page }) => {
|
||||
await page.getByRole('button', { name: '添加供应商' }).click()
|
||||
await expect(page.locator('.t-dialog')).toBeVisible()
|
||||
await expect(page.locator('.t-dialog:visible')).toBeVisible()
|
||||
|
||||
const inputs = formInputs(page)
|
||||
await inputs.id.fill('test_url')
|
||||
@@ -46,17 +46,17 @@ test.describe('供应商表单验证', () => {
|
||||
|
||||
test('取消后表单应重置', async ({ page }) => {
|
||||
await page.getByRole('button', { name: '添加供应商' }).click()
|
||||
await expect(page.locator('.t-dialog')).toBeVisible()
|
||||
await expect(page.locator('.t-dialog:visible')).toBeVisible()
|
||||
|
||||
let inputs = formInputs(page)
|
||||
await inputs.id.fill('should_be_reset')
|
||||
await inputs.name.fill('Should Be Reset')
|
||||
|
||||
await inputs.cancelBtn.click()
|
||||
await expect(page.locator('.t-dialog')).not.toBeVisible()
|
||||
await expect(page.locator('.t-dialog:visible')).not.toBeVisible()
|
||||
|
||||
await page.getByRole('button', { name: '添加供应商' }).click()
|
||||
await expect(page.locator('.t-dialog')).toBeVisible()
|
||||
await expect(page.locator('.t-dialog:visible')).toBeVisible()
|
||||
|
||||
inputs = formInputs(page)
|
||||
await expect(inputs.id).toHaveValue('')
|
||||
@@ -65,11 +65,11 @@ test.describe('供应商表单验证', () => {
|
||||
|
||||
test('快速连续点击只打开一个对话框', async ({ page }) => {
|
||||
await page.getByRole('button', { name: '添加供应商' }).click()
|
||||
await expect(page.locator('.t-dialog')).toBeVisible()
|
||||
await expect(page.locator('.t-dialog:visible')).toBeVisible()
|
||||
|
||||
expect(await page.locator('.t-dialog').count()).toBe(1)
|
||||
expect(await page.locator('.t-dialog:visible').count()).toBe(1)
|
||||
|
||||
await formInputs(page).cancelBtn.click()
|
||||
await expect(page.locator('.t-dialog')).not.toBeVisible()
|
||||
await expect(page.locator('.t-dialog:visible')).not.toBeVisible()
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user