This commit is contained in:
jiaojm
2025-10-31 16:18:47 +08:00
repo.diff.parent 16c817fa9b
repo.diff.commit 257941c5e5
repo.diff.stats_desc%!(EXTRA int=3, int=117, int=30)

repo.diff.view_file

@@ -7,7 +7,7 @@ export TEST_REPO_VALID="jiaojunming/test1"
export TEST_REPO_EMPTY="jiaojunming/test2"
export TEST_REPO_INVALID="jiaojunming/test3"
export TEST_USER_ADMIN="jiaojunming"
export TEST_PASS_ADMIN="hwyhwy12"
export TEST_USER_ADMIN=""
export TEST_PASS_ADMIN=""
export TEST_ADMIN_USER_ID="1"
export TEST_REPO_ADMIN="jiaojunming/test1"
export TEST_REPO_ADMIN=""

repo.diff.view_file

@@ -3,7 +3,7 @@
1.在custom/conf下的app.ini中关闭验证码ENABLE_CAPTCHA = false
2.在执行脚本前请下载相关依赖npx playwright install
3.请在.env.e2e文件中配置相关项
GITEA_URLdevstar实例的urlTEST_USER测试用户TEST_REPO_VALID一个干净的有合理json配置的仓库TEST_USER_ADMIN管理员账号可以是测试用户TEST_ADMIN_USER_ID管理员用户的id管理后台查看
4.在项目根目录执行命令source .env.e2e && npx playwright test 生成的报告在test/e2e下
GITEA_URLdevstar实例的urlTEST_USER测试用户现在这个测试用户需要是管理员,这样测试结束时会清理掉所有痕迹
4.在项目根目录执行命令source .env.e2e && npx playwright test tests/e2e/devcontainer.test.e2e.ts 生成的报告在test/e2e下

repo.diff.view_file

@@ -4,17 +4,12 @@ const {
GITEA_URL,
TEST_USER,
TEST_PASS,
TEST_REPO_VALID,
TEST_REPO_EMPTY,
TEST_REPO_INVALID,
TEST_USER_ADMIN,
TEST_PASS_ADMIN,
TEST_ADMIN_USER_ID,
TEST_REPO_ADMIN
} = process.env;
const repoName = `e2e-devcontainer-test`;
// 检查关键配置是否存在
if (!GITEA_URL || !TEST_USER || !TEST_PASS || !TEST_REPO_VALID) {
if (!GITEA_URL || !TEST_USER || !TEST_PASS ) {
  throw new Error("请确保 .env.e2e 配置文件已加载,并包含 GITEA_URL, TEST_USER, TEST_PASS, TEST_REPO_VALID");
}
test('DevContainer 功能和配置', async ({ page,context }) => {
@@ -25,13 +20,85 @@ test('DevContainer 功能和配置', async ({ page,context }) => {
await page.fill('#password', TEST_PASS);
await page.getByRole('button', { name: 'Sign In' }).click();
await expect(page).toHaveURL(GITEA_URL + '/');
console.log("登录成功! ");
console.log("进入test1仓库");
await page.goto(GITEA_URL + '/'+ TEST_REPO_VALID);
console.log(`正在创建新仓库: ${repoName}`);
await page.goto(GITEA_URL + '/repo/create');
await page.fill('input[name="repo_name"]', repoName);
await page.getByRole('button', { name: 'Create Repository' }).click();
await expect(page).toHaveURL(GITEA_URL + '/' + TEST_USER + '/' + repoName);
console.log("仓库创建成功.");
await expect(page).toHaveURL(GITEA_URL + '/' + TEST_USER + '/' + repoName);
console.log("正在点击 'Dev Container' 标签页...");
await page.getByRole('link', { name: 'Dev Container' }).click();
console.log("正在点击 'Create' (创建模板) 按钮...");
await page.getByRole('button', { name: /Create/i }).click();
console.log("模板已创建. 正在点击 'Edit' 按钮...");
await expect(page.getByText('devcontainer.json')).toBeVisible();
await expect(page.getByRole('button', { name: 'Create Dev Container' })).toBeVisible();
await page.getByRole('link', { name: 'Edit' }).click();
console.log("已跳转到编辑器. 正在修改内容");
const newJsonAsObject = {
"name": "Gitea DevContainer",
"image": "mcr.microsoft.com/devcontainers/go:1.24-bookworm",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "lts"
},
"ghcr.io/devcontainers/features/git-lfs:1.2.2": {},
"ghcr.io/devcontainers-extra/features/poetry:2": {},
"ghcr.io/devcontainers/features/python:1": {
"version": "3.12"
},
"ghcr.io/warrenbuckley/codespace-features/sqlite:1": {}
},
"customizations": {
"vscode": {
"settings": {},
"extensions": [
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
"golang.go",
"stylelint.vscode-stylelint",
"DavidAnson.vscode-markdownlint",
"Vue.volar",
"ms-azuretools.vscode-docker",
"vitest.explorer",
"cweijan.vscode-database-client2",
"GitHub.vscode-pull-request-github",
"Azurite.azurite"
]
}
},
"portsAttributes": {
"3000": {
"label": "Gitea Web",
"onAutoForward": "notify"
}
},
"postCreateCommand": "make deps"
};
// 转换为JSON 字符串
const newJsonString = JSON.stringify(newJsonAsObject);
// 设置焦点
await page.locator('.view-lines > div:nth-child(20)').click();
console.log("正在手动删除模板内容 ");
for (let i = 0; i < 500; i++) {
await page.keyboard.press('Backspace');
}
// 粘贴字符串
console.log("正在粘贴JSON 内容...");
await page.keyboard.insertText(newJsonString);
await page.getByRole('button', { name: 'Commit Changes' }).click();
console.log("devcontainer.json 修改并提交成功.");
console.log("正在导航回 Dev Container 标签页进行验证...");
await page.getByRole('link', { name: 'Dev Container' }).click();
console.log("创建开发容器");
await page.getByRole('button', { name: 'Create Dev Container' }).click();
console.log("正在创建");
@@ -53,7 +120,7 @@ test('DevContainer 功能和配置', async ({ page,context }) => {
const newPage = await pagePromise;
await newPage.waitForLoadState(); // 等待新页面加载完成
console.log("Web Terminal: 新标签页已打开!");
//await expect(newPage.getByText('Successfully connected to the container')).toBeVisible(); 这里ttyd里的信息PlayWright看不见容器的交互没办法自动化测试
//await expect(newPage.getByText('Successfully connected to the container')).toBeVisible(); //这里ttyd里的信息PlayWright看不见容器的交互没办法自动化测试
await page.getByRole('link', { name: 'Delete Dev Container' }).click();
await page.locator('#delete-repo-devcontainer-of-user-modal')
.getByRole('button', { name: 'Yes' })
@@ -63,23 +130,23 @@ test('DevContainer 功能和配置', async ({ page,context }) => {
console.log('成功删除!');
console.log("test1 检查通过!");
console.log("test2仓库");
await page.goto(GITEA_URL + '/'+ TEST_REPO_EMPTY);
await page.getByRole('link', { name: 'Dev Container' }).click();
await expect(page.getByText('Oops, it looks like there is no Dev Container Setting in this repository.')).toBeVisible();
console.log("test2 检查通过");
//console.log("test2仓库");
//await page.goto(GITEA_URL + '/'+ TEST_REPO_EMPTY);
//await page.getByRole('link', { name: 'Dev Container' }).click();
//await expect(page.getByText('Oops, it looks like there is no Dev Container Setting in this repository.')).toBeVisible();
//console.log("test2 检查通过");
console.log("test3仓库");
await page.goto(GITEA_URL+ '/' + TEST_REPO_INVALID);
await page.getByRole('link', { name: 'Dev Container' }).click();
await expect(page.getByText(' Invalid Dev Container Configuration')).toBeVisible();
console.log("test3检查通过");
//console.log("test3仓库");
//await page.goto(GITEA_URL+ '/' + TEST_REPO_INVALID);
//await page.getByRole('link', { name: 'Dev Container' }).click();
//await expect(page.getByText(' Invalid Dev Container Configuration')).toBeVisible();
//console.log("test3检查通过");
});
test('权限修改相关', async ({ page }) => {
console.log("正在登陆");
await page.goto(GITEA_URL + '/user/login');
await page.fill('#user_name', TEST_USER_ADMIN);
await page.fill('#password', TEST_PASS_ADMIN);
await page.fill('#user_name', TEST_USER);
await page.fill('#password', TEST_PASS);
await page.getByRole('button', { name: 'Sign In' }).click();
await expect(page).toHaveURL(GITEA_URL + '/');
console.log("登录成功! ");
@@ -89,10 +156,30 @@ test('权限修改相关', async ({ page }) => {
const devContainerCheckbox = page.getByLabel(/May Create Devcontainers/i);
await devContainerCheckbox.uncheck();
await page.getByRole('button', { name: 'Update User Account' }).click();
await page.goto(GITEA_URL + '/' + TEST_REPO_ADMIN);
await page.goto(GITEA_URL + '/' + "e2e-devcontainer-test");
const devContainerLink = page.getByRole('link', { name: 'Dev Container' });
await expect(devContainerLink).toBeHidden({ timeout: 10000 });
console.log('权限设置成功!');
console.log('现在恢复原环境');
await page.goto(GITEA_URL+ '/-/admin/users/' + TEST_ADMIN_USER_ID + '/edit');
await devContainerCheckbox.check();
await page.getByRole('button', { name: 'Update User Account' }).click();
console.log('现在清理测试仓库');
console.log("正在导航到仓库设置页面...");
await page.goto(GITEA_URL + '/' + TEST_USER + '/' + repoName + '/settings');
console.log("正在点击 'Delete This Repository' 按钮...");
await page.getByRole('button', { name: 'Delete This Repository' }).click();
await page.locator('#delete-repo-modal').waitFor();
console.log(`正在输入 '${repoName}' 进行确认...`);
await page.locator('#repo_name_to_delete').fill(repoName);
console.log("正在点击最终的删除确认按钮...");
await page.getByRole('button', { name: 'Delete Repository' }).click();
});