181 lines
7.5 KiB
TypeScript
181 lines
7.5 KiB
TypeScript
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();
|
||
|
||
|
||
});
|
||
})
|
||
|
||
|