57 lines
5.5 KiB
TypeScript
57 lines
5.5 KiB
TypeScript
import { test, expect, type Page } from "@playwright/test"
|
|
import { setupBackups, storage } from "./fixtures/backups"
|
|
const s3 = { ...storage, provider: "s3", s3Bucket: "bucket", s3AccessKeyId: "test-access", secretConfigured: true, lastTestAt: "2026-10-01T00:00:00Z", lastTestError: null }
|
|
async function open(page: Page) { await page.goto("/backups"); await page.getByRole("tab", { name: "Настройки", exact: true }).click(); await expect(page.getByRole("button", { name: "Сохранить хранилище", exact: true })).toBeEnabled() }
|
|
const save = (page: Page) => page.getByRole("button", { name: "Сохранить хранилище", exact: true })
|
|
for (const failure of ["API", "malformed", "unconfirmed secret"]) test("Бэкапы S3: " + failure + " сохраняет секрет и черновик", async ({ page }) => {
|
|
await setupBackups(page); let puts = 0
|
|
await page.route("**/api/backups/storage", r => {
|
|
if (r.request().method() !== "PUT") return r.fulfill({ json: s3 })
|
|
puts++; const body = r.request().postDataJSON()
|
|
return r.fulfill(failure === "API" ? { status: 503, json: { error: "S3 save failed" } } : { json: failure === "malformed" ? {} : { ...s3, ...body, secretConfigured: false } })
|
|
})
|
|
await open(page); await page.getByRole("textbox", { name: "Bucket", exact: true }).fill("draft-bucket")
|
|
await page.getByLabel("Secret key", { exact: true }).fill("new-test-secret")
|
|
await save(page).click(); await expect(save(page)).toBeEnabled(); expect(puts).toBe(1)
|
|
await expect(page.getByLabel("Secret key", { exact: true })).toHaveValue("new-test-secret")
|
|
await expect(page.getByRole("textbox", { name: "Bucket", exact: true })).toHaveValue("draft-bucket")
|
|
await expect(page.getByRole("alert", { name: "Операция резервных копий" })).toBeVisible()
|
|
await expect(page.getByText("Хранилище сохранено", { exact: true })).toHaveCount(0)
|
|
})
|
|
test("Бэкапы S3: подтверждённый secret save очищает только новый секрет", async ({ page }) => {
|
|
await setupBackups(page); let body: Record<string, unknown> = {}
|
|
await page.route("**/api/backups/storage", r => {
|
|
if (r.request().method() !== "PUT") return r.fulfill({ json: s3 })
|
|
body = r.request().postDataJSON(); return r.fulfill({ json: { ...s3, ...body, secretConfigured: true, lastTestAt: null, lastTestError: null } })
|
|
})
|
|
await open(page); await page.getByLabel("Secret key", { exact: true }).fill("new-test-secret"); await save(page).click()
|
|
await expect(page.getByText("Хранилище сохранено", { exact: true })).toBeVisible(); await expect(page.getByLabel("Secret key", { exact: true })).toHaveValue("")
|
|
expect(body.s3SecretAccessKey).toBe("new-test-secret"); await expect(page.getByText("Проверено ранее", { exact: true })).toHaveCount(0)
|
|
})
|
|
test("Бэкапы S3: незаполненный S3 и неверный Endpoint не отправляются", async ({ page }) => {
|
|
await setupBackups(page); let puts = 0
|
|
await page.route("**/api/backups/storage", r => { if (r.request().method() === "PUT") puts++; return r.fallback() })
|
|
await open(page); await page.getByRole("button", { name: "S3", exact: true }).click(); await save(page).click()
|
|
await expect(page.getByRole("alert", { name: "Операция резервных копий" })).toContainText("Bucket")
|
|
await page.getByLabel("Bucket", { exact: true }).fill("bucket"); await page.getByLabel("Access key", { exact: true }).fill("test-access"); await page.getByLabel("Secret key", { exact: true }).fill("test-secret")
|
|
await page.getByLabel("Endpoint", { exact: true }).fill("ftp://example.test"); await save(page).click()
|
|
await expect(page.getByRole("alert", { name: "Операция резервных копий" })).toContainText("http/https"); expect(puts).toBe(0)
|
|
})
|
|
test("Бэкапы S3: проверка подтверждённого хранилища делает только POST test", async ({ page }) => {
|
|
await setupBackups(page); let puts = 0, tests = 0
|
|
await page.route("**/api/backups/storage", r => { if (r.request().method() === "PUT") puts++; return r.fulfill({ json: s3 }) })
|
|
await page.route("**/api/backups/storage/test", r => { tests++; return r.fulfill({ json: { ...s3, lastTestAt: "2026-10-01T01:00:00Z" } }) })
|
|
await open(page); await expect(page.getByText("Проверено ранее", { exact: true })).toBeVisible()
|
|
await expect(page.getByText("Connected", { exact: true })).toHaveCount(0)
|
|
await page.getByRole("button", { name: "Проверить", exact: true }).click()
|
|
await expect(page.getByText("Доступ к S3 подтверждён", { exact: true })).toBeVisible(); expect(tests).toBe(1); expect(puts).toBe(0)
|
|
})
|
|
test("Бэкапы S3: отказ теста показывает backend receipt, не старый успех", async ({ page }) => {
|
|
await setupBackups(page); 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 denied", settings: { ...s3, lastTestAt: "2026-10-01T01:00:00Z", lastTestError: "S3 denied" } } }))
|
|
await open(page); await page.getByRole("button", { name: "Проверить", exact: true }).click()
|
|
await expect(page.getByRole("alert", { name: "Операция резервных копий" })).toContainText("S3 denied")
|
|
await expect(page.getByText("Проверено ранее", { exact: true })).toHaveCount(0)
|
|
await expect(page.getByText("Доступ к S3 подтверждён", { exact: true })).toHaveCount(0)
|
|
})
|