42 lines
2.3 KiB
TypeScript
42 lines
2.3 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test('资产备注支持创建、编辑、刷新和清空且保留原文件', async ({ page }) => {
|
|
await page.goto('/');
|
|
const session = await (await page.request.get('/api/v1/session')).json();
|
|
const headers = { 'X-CSRF-Token': session.csrfToken };
|
|
let id = '';
|
|
try {
|
|
// Generic files remain compatible through the API and resource search.
|
|
const drawer = page.getByRole('dialog', { name: '编辑资产', exact: true });
|
|
const remark = '开发环境\n负责人:测试 📝';
|
|
const response = await page.request.post('/api/v1/assets', { headers, data: {
|
|
name: '备注测试资产', type: 'file', filename: 'remark.txt', content: 'fixture-file', remark,
|
|
} });
|
|
expect(response.ok()).toBeTruthy();
|
|
const original = (await response.json()).config;
|
|
id = original.id;
|
|
expect(original.remark).toBe(remark);
|
|
await expect(drawer).not.toBeVisible();
|
|
for (const value of ['修改后的备注\n第二行', '']) {
|
|
await page.reload();
|
|
await page.keyboard.press('Control+k');
|
|
const search = page.getByRole('dialog', { name: '搜索资源 · 当前项目与环境', exact: true });
|
|
await search.getByRole('combobox', { name: '搜索资源关键词', exact: true }).fill('备注测试资产');
|
|
await search.getByRole('option').filter({ hasText: '备注测试资产' }).click();
|
|
await expect(drawer.getByRole('textbox', { name: '资产备注', exact: true })).toHaveValue(value ? remark : '修改后的备注\n第二行');
|
|
await drawer.getByRole('textbox', { name: '资产备注', exact: true }).fill(value);
|
|
const saved = page.waitForResponse(r => r.url().endsWith(`/assets/${id}`) && r.request().method() === 'PUT');
|
|
await drawer.getByRole('button', { name: '保存资产', exact: true }).click();
|
|
expect((await saved).ok()).toBeTruthy();
|
|
await expect(drawer).not.toBeVisible();
|
|
const asset = await (await page.request.get(`/api/v1/assets/${id}`)).json();
|
|
expect(asset.config.remark || '').toBe(value);
|
|
expect(asset.config.filename).toBe(original.filename);
|
|
expect(asset.config.updatedAt).toBe(original.updatedAt);
|
|
expect(asset.secretStatus.content).toBe(true);
|
|
}
|
|
} finally {
|
|
if (id) await page.request.delete(`/api/v1/assets/${id}`, { headers });
|
|
}
|
|
});
|