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 = {} 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) })