Files
devstar/tests/e2e/specs/devcontainer.e2e.test.ts
jiaojm 7d06daf606 last
2025-11-14 16:30:29 +08:00

181 lines
7.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { test, expect } from '@playwright/test';
import { link } from 'node:fs';
import { env } from 'node:process';
import { Login } from './utils.e2e';
const DEFAULT_E2E_USER = 'testuser';
const DEFAULT_E2E_PASS = '12345678';
const DEFAULT_ADMIN_ID = '1';
const isAlreadyInstalled = env.E2E_SKIP_INSTALL === 'true';
const url1=env.DEVSTAR_URL;
const GITEA_URL = (env.E2E_MODE === 'url') ? url1 : 'http://devstar:3000';
const TEST_USER = isAlreadyInstalled ? (env.E2E_USERNAME || DEFAULT_E2E_USER) : DEFAULT_E2E_USER;
const TEST_PASS = isAlreadyInstalled ? (env.E2E_PASSWORD || DEFAULT_E2E_PASS) : DEFAULT_E2E_PASS;
const TEST_ADMIN_USER_ID = isAlreadyInstalled ? (env.E2E_ADMIN_ID || DEFAULT_ADMIN_ID) : DEFAULT_ADMIN_ID;
const repoName='e2e-test-repo';
test.describe('devcontainer 相关测试',()=>{
test.beforeEach(async ({ page }) => {
await Login(page);
});
test('DevContainer 功能和配置', async ({ page,context }) => {
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();
await page.waitForTimeout(10000);
console.log("模板已创建. 正在点击 'Edit' 按钮...");
await expect(page.getByText('devcontainer.json')).toBeVisible();
await page.getByRole('link', { name: 'Edit' }).click();
await page.waitForTimeout(5000);
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("正在创建");
await expect(page.getByRole('button', { name: 'Stop Dev Container' }))
.toBeVisible({ timeout: 180000 });
console.log("Dev container 创建成功!");
await page.getByRole('button',{ name: 'Stop Dev Container'}).click();
console.log("正在停止");
await expect(page.getByRole('button',{ name: 'Start Dev Container'})).toBeVisible({ timeout: 180000});
console.log("成功停止开发容器!");
await page.getByRole('button',{name: 'Start Dev Container'}).click();
console.log("正在启动开发容器");
await expect(page.getByRole('button',{name:'Stop Dev Container'})).toBeVisible({ timeout: 180000});
console.log("成功启动!");
console.log("保存开发容器");
const pagePromise = context.waitForEvent('page');
console.log("打开webterminal");
await page.getByRole('link',{name: 'open with WebTerminal'}).click();
const newPage = await pagePromise;
await newPage.waitForLoadState(); // 等待新页面加载完成
console.log("Web Terminal: 新标签页已打开!");
//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' })
.click();
console.log('正在删除!');
await expect(page.getByRole('button', { name: 'Create Dev Container' })).toBeVisible();
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("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+ '/-/admin/users/' + TEST_ADMIN_USER_ID + '/edit');
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 + '/' + "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();
});
})