165 lines
7.4 KiB
TypeScript
165 lines
7.4 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
||
import { link } from 'node:fs';
|
||
import { env } from 'node:process';
|
||
import { Login } from './utils.e2e';
|
||
import { time } from 'node:console';
|
||
|
||
|
||
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: '创建仓库' }).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: '开发容器' }).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();
|
||
|
||
|
||
//转换为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: '开发容器' }).click();
|
||
|
||
console.log("创建开发容器");
|
||
await page.getByRole('button', { name: '创建开发容器' }).click();
|
||
console.log("正在创建");
|
||
const stopButton = page.getByRole('button', { name: '停止开发容器' });
|
||
try {
|
||
console.log('正在等待容器创建');
|
||
//第一阶段刷新页面
|
||
await expect(stopButton).toBeVisible({ timeout: 60000 });
|
||
|
||
} catch (error) {
|
||
//刷新第一次
|
||
await page.reload({ waitUntil: 'domcontentloaded' });
|
||
console.log('60s,正在刷新页面...');
|
||
//加载service可能比较慢
|
||
await page.waitForTimeout(180000);
|
||
console.log('刷新页面完成,继续等待 (阶段2: 60s)...');
|
||
//第二次刷新,容器应该正常启动了
|
||
await page.reload({ waitUntil: 'domcontentloaded' });
|
||
await expect(stopButton).toBeVisible({ timeout: 30000 });
|
||
await page.screenshot({ path: 'full-page.png', fullPage: true });
|
||
}
|
||
console.log("Dev container 创建成功!");
|
||
await page.getByRole('button',{ name: '停止开发容器'}).click();
|
||
console.log("正在停止");
|
||
await expect(page.getByRole('button',{ name: '启动开发容器'})).toBeVisible({ timeout: 180000});
|
||
console.log("成功停止开发容器!");
|
||
await page.getByRole('button',{name: '启动开发容器'}).click();
|
||
console.log("正在启动开发容器");
|
||
await expect(page.getByRole('button',{name:'停止开发容器'})).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(); // 等待新页面加载完成
|
||
await page.reload({ waitUntil: 'domcontentloaded' });
|
||
await page.waitForTimeout(30000);
|
||
await page.reload({ waitUntil: 'domcontentloaded' });
|
||
await page.screenshot({ path: 'full-page.png', fullPage: true });
|
||
console.log("Web Terminal: 新标签页已打开!");
|
||
//await expect(newPage.getByText('Successfully connected to the container')).toBeVisible(); //这里ttyd里的信息PlayWright看不见,容器的交互没办法自动化测试
|
||
await page.getByRole('link', { name: '删除开发容器' }).click();
|
||
await page.locator('#delete-repo-devcontainer-of-user-modal')
|
||
.getByRole('button', { name: '确认操作' })
|
||
.click();
|
||
console.log('正在删除!,可能较慢请等待');
|
||
await page.waitForTimeout(3000);
|
||
await expect(page.getByRole('button', { name: '创建开发容器' })).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.getByRole('link', { name: '管理后台' }).click();
|
||
await page.getByText('身份及认证').click();
|
||
await page.getByRole('link', { name: '帐户管理' }).click();
|
||
await page.getByRole('row')
|
||
.filter({ hasText: TEST_USER })
|
||
.getByRole('link', { name: '编辑' })
|
||
.click();
|
||
const devContainerCheckbox = page.getByLabel(/允许创建开发容器/i);
|
||
await devContainerCheckbox.uncheck();
|
||
await page.getByRole('button', { name: '更新帐户' }).click();
|
||
await page.goto(GITEA_URL + '/' + "e2e-devcontainer-test");
|
||
const devContainerLink = page.getByRole('link', { name: '开发容器' });
|
||
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: '更新帐户' }).click();
|
||
|
||
console.log('现在清理测试仓库');
|
||
console.log("正在导航到仓库设置页面...");
|
||
await page.goto(GITEA_URL + '/' + TEST_USER + '/' + repoName + '/settings');
|
||
|
||
console.log("正在点击 'Delete This Repository' 按钮...");
|
||
await page.getByRole('button', { name: '删除本仓库' }).click();
|
||
await page.locator('#delete-repo-modal').waitFor();
|
||
console.log(`正在输入 '${repoName}' 进行确认...`);
|
||
await page.locator('#repo_name_to_delete').fill(repoName);
|
||
|
||
console.log("正在点击最终的删除确认按钮...");
|
||
await page.locator('#delete-repo-modal').getByRole('button', { name: '删除本仓库' }).click();
|
||
});
|
||
})
|
||
|
||
|