Files
devstar/tests/e2e/specs/devcontainer.e2e.test.ts

165 lines
7.4 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';
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();
});
})