ci / api / api (push) Successful in 52s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m9s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m35s
release / release (версия и заметки) (push) Successful in 5s
release / android (APK в релиз) (push) Successful in 4m6s
ci / db / db (push) Successful in 1m15s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m19s
ci / ts / ts (packages + web) (push) Successful in 2m34s
release / desktop (Linux и Windows в релиз) (push) Successful in 14m27s
release / prune (старые файлы и прогоны) (push) Successful in 6s
67 lines
5.0 KiB
TypeScript
67 lines
5.0 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test';
|
|
|
|
async function login(page: Page, username = 'mobile-admin', target = '/') {
|
|
await page.addInitScript(() => localStorage.setItem('pipu.locale', 'ru'));
|
|
await page.goto(`/login?redirect=${encodeURIComponent(target)}`);
|
|
await page.getByLabel('Логин').fill(username);
|
|
await page.getByRole('textbox', { name: 'Пароль' }).fill(`${username}-password`);
|
|
await page.getByRole('button', { name: 'Войти' }).click();
|
|
await expect(page.getByRole('button', { name: 'Меню профиля' })).toBeVisible();
|
|
}
|
|
|
|
test('admin selects repository and version, confirms and sees persistent job log', async ({ page }) => {
|
|
await login(page, 'mobile-admin', '/admin/updates');
|
|
await expect(page.getByRole('heading', { name: 'Обновления', exact: true })).toBeVisible();
|
|
await expect(page.getByRole('button', { name: 'Последний релиз', exact: true })).toHaveAttribute('aria-pressed', 'true');
|
|
await page.getByRole('button', { name: 'Источники обновлений', exact: true }).click();
|
|
await page.getByRole('button', { name: 'Добавить источник' }).click();
|
|
await page.getByLabel('Название', { exact: true }).last().fill('Тестовая репа');
|
|
await page.getByLabel('URL Git-репозитория').last().fill('https://git.example.org/pipu/testing.git');
|
|
await page.getByRole('button', { name: 'Сохранить', exact: true }).click();
|
|
await expect(page.getByRole('dialog')).not.toBeVisible();
|
|
await page.getByLabel('Источник', { exact: true }).selectOption({ label: 'Тестовая репа' });
|
|
await page.getByRole('button', { name: 'Выбрать версию', exact: true }).click();
|
|
await page.getByLabel('Версия', { exact: true }).selectOption('v1.10.0');
|
|
await page.getByRole('button', { name: 'Установить обновление', exact: true }).click();
|
|
const dialog = page.getByRole('dialog');
|
|
await expect(dialog).toContainText('Тестовая репа');
|
|
await expect(dialog).toContainText('v1.10.0');
|
|
await dialog.getByRole('button', { name: 'Установить обновление' }).click();
|
|
await expect(page.getByRole('status').filter({ hasText: 'Выполняется' })).toBeVisible();
|
|
await expect(page.getByLabel('Журнал выполнения')).toContainText('build and restart');
|
|
await expect(page.getByRole('button', { name: 'Установить обновление', exact: true })).toBeDisabled();
|
|
await page.screenshot({ path: 'test-results/server-updates.png', fullPage: true });
|
|
});
|
|
|
|
test('config keeps secret unchanged, saves local override and applies separately', async ({ page }) => {
|
|
await login(page, 'mobile-admin', '/admin/config');
|
|
await expect(page.getByRole('heading', { name: 'Конфигурация', exact: true })).toBeVisible();
|
|
await expect(page.getByLabel('GITEA_TOKEN · config.local', { exact: true })).toHaveValue('');
|
|
await page.getByLabel('LOG_LEVEL · config.local', { exact: true }).fill('debug');
|
|
await expect(page.getByText('В .env есть значение:', { exact: false })).toBeVisible();
|
|
await page.getByLabel('TRAIN_HOUR · config.local', { exact: true }).fill('6');
|
|
await expect(page.getByRole('button', { name: 'Применить и перезапустить', exact: true })).toBeDisabled();
|
|
await page.getByRole('button', { name: 'Сохранить', exact: true }).click();
|
|
await expect(page.getByText('Изменения сохранены в config.local', { exact: true })).toBeVisible();
|
|
await expect(page.getByLabel('GITEA_TOKEN · config.local', { exact: true })).toHaveAttribute('placeholder', 'Секрет сохранён');
|
|
await expect(page.getByText('Выполняется', { exact: true })).not.toBeVisible();
|
|
await page.getByRole('main').evaluate((element) => { element.scrollTop = 0; });
|
|
await page.screenshot({ path: 'test-results/server-config.png', fullPage: true });
|
|
await page.getByRole('button', { name: 'Применить и перезапустить', exact: true }).click();
|
|
await page.getByRole('dialog').getByRole('button', { name: 'Применить и перезапустить' }).click();
|
|
await expect(page.getByLabel('Журнал выполнения')).toContainText('build and restart');
|
|
});
|
|
|
|
test('update delegate can update but cannot open configuration', async ({ page }) => {
|
|
await login(page, 'update-manager', '/admin/updates');
|
|
await expect(page.getByRole('heading', { name: 'Обновления', exact: true })).toBeVisible();
|
|
await page.evaluate(() => { history.pushState({}, '', '/admin/config'); window.dispatchEvent(new PopStateEvent('popstate')); });
|
|
await expect(page).toHaveURL('/');
|
|
await expect(page.getByRole('heading', { name: 'Конфигурация', exact: true })).not.toBeVisible();
|
|
});
|
|
|
|
test('ordinary user is redirected away from server management', async ({ page }) => {
|
|
await login(page, 'alice', '/admin/updates');
|
|
await expect(page).toHaveURL('/');
|
|
});
|