42 lines
5.1 KiB
TypeScript
42 lines
5.1 KiB
TypeScript
import { test, expect } from "@playwright/test"
|
|
import { backup, storage, setupBackups } from "./fixtures/backups"
|
|
import { openBackup, backupAck, backupJob } from "./fixtures/backup-job"
|
|
for (const [name, width] of [["desktop", 1440], ["mobile", 390], ["narrow", 320]] as const) {
|
|
test("Бэкапы: S3 ошибка и адаптивность/" + name, async ({ page }) => {
|
|
await page.setViewportSize({ width, height: 900 }); await setupBackups(page)
|
|
const s3 = { ...storage, provider: "s3", s3Endpoint: "https://very-long-endpoint-of-backup-storage.example.test", s3Bucket: "long-backup-bucket-name", s3AccessKeyId: "test-access", secretConfigured: true, lastTestAt: "2026-10-01T00:00:00Z" }
|
|
await page.route("**/api/backups/storage", r => r.fulfill({ json: s3 }))
|
|
await page.route("**/api/backups/storage/test", r => r.fulfill({ status: 400, json: { error: "Доступ к S3 отклонён. Проверьте сохранённые ключи и права на bucket.", settings: { ...s3, lastTestAt: "2026-10-01T01:00:00Z", lastTestError: "Доступ к S3 отклонён. Проверьте сохранённые ключи и права на bucket." } } }))
|
|
await page.goto("/backups?tab=settings"); await expect(page.getByText("Проверено ранее", { exact: true })).toBeVisible()
|
|
await page.getByRole("button", { name: "Проверить", exact: true }).click(); await expect(page.getByRole("alert", { name: "Операция резервных копий", exact: true })).toContainText("Доступ к S3 отклонён")
|
|
await expect(page.getByText("Проверено ранее", { exact: true })).toHaveCount(0); await expect(page.getByText("Доступ к S3 подтверждён", { exact: true })).toHaveCount(0)
|
|
await page.getByLabel("Bucket", { exact: true }).scrollIntoViewIfNeeded()
|
|
expect(await page.evaluate(() => document.documentElement.scrollWidth <= window.innerWidth + 1)).toBe(true)
|
|
expect(await page.locator("fieldset").evaluateAll(elements => elements.every(element => element.scrollWidth <= element.clientWidth + 1))).toBe(true)
|
|
await page.screenshot({ path: "docs/ux-ui/screens/backups-s3-error-" + name + ".png", fullPage: true })
|
|
})
|
|
test("Бэкапы: partial job и адаптивность/" + name, async ({ page }) => {
|
|
await page.setViewportSize({ width, height: 900 }); await setupBackups(page); let id = ""
|
|
await page.route("**/api/backups/create", r => { id = r.request().postDataJSON().requestId; return r.fulfill({ status: 202, json: backupAck(id) }) })
|
|
await page.route("**/api/backups/jobs/*", r => r.fulfill({ json: backupJob(id, { created: [{ ...backup, uploadError: "Загрузка в S3 не подтверждена; локальная копия создана и сохранена." }] }) }))
|
|
const dialog = await openBackup(page); await dialog.getByRole("button", { name: /Снять бэкап/ }).click()
|
|
await expect(page.getByRole("alert", { name: "Задача резервного копирования", exact: true })).toContainText("Создано 1 из 1")
|
|
await expect(dialog.getByRole("alert", { name: "Результат задачи", exact: true })).toContainText("Загрузка в S3 не подтверждена")
|
|
await expect(dialog).toContainText("Завершена с ограничениями")
|
|
await expect(page.getByText("API подтвердил создание всех резервных копий", { exact: true })).toHaveCount(0); await expect(dialog.getByRole("button", { name: "Новая задача", exact: true })).toBeVisible()
|
|
expect(await dialog.evaluate(element => element.scrollWidth <= element.clientWidth + 1)).toBe(true)
|
|
await page.screenshot({ path: "docs/ux-ui/screens/backups-partial-job-" + name + ".png", fullPage: true })
|
|
await page.keyboard.press("Escape"); await expect(dialog).toHaveCount(0)
|
|
await page.reload(); await page.getByRole("button", { name: "Задача резервного копирования", exact: true }).first().click()
|
|
await expect(page.getByRole("dialog").getByRole("alert", { name: "Результат задачи", exact: true })).toContainText("Загрузка в S3 не подтверждена")
|
|
})
|
|
test("Бэкапы: initial error не превращается в пустую историю/" + name, async ({ page }) => {
|
|
await page.setViewportSize({ width, height: 900 }); await setupBackups(page)
|
|
await page.route("**/api/backups", r => r.fulfill({ status: 503, json: { error: "История недоступна: повторите чтение данных." } }))
|
|
await page.goto("/backups"); await expect(page.getByRole("alert", { name: "Данные резервных копий: backups", exact: true })).toContainText("Данные пока неизвестны")
|
|
await expect(page.getByText("Нет бэкапов", { exact: true })).toHaveCount(0); await expect(page.getByLabel("Сводка бэкапов", { exact: true })).toContainText("—")
|
|
expect(await page.evaluate(() => document.documentElement.scrollWidth <= window.innerWidth + 1)).toBe(true)
|
|
await page.screenshot({ path: "docs/ux-ui/screens/backups-initial-error-" + name + ".png", fullPage: true })
|
|
})
|
|
}
|