From d6d91f88262b543a26b66809ea8398d75e6f98de Mon Sep 17 00:00:00 2001 From: Vassiliy Yegorov Date: Wed, 19 Aug 2026 18:37:56 +0700 Subject: [PATCH] feat(web): show created and removed counts after zone import --- web/src/api/client.ts | 4 ++-- web/src/api/types.ts | 1 + web/src/pages/DomainsPage.test.tsx | 19 ++++++++++++++++++- web/src/pages/DomainsPage.tsx | 5 +++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/web/src/api/client.ts b/web/src/api/client.ts index d731673..3e3b703 100644 --- a/web/src/api/client.ts +++ b/web/src/api/client.ts @@ -2,7 +2,7 @@ import { API_ROOT } from "@/lib/config" import type { AuthState, Account, CreateAccountInput, Template, CreateTemplateInput, - Domain, CreateDomainInput, ChangesetResponse, ApplyRequest, + Domain, CreateDomainInput, ImportResult, ChangesetResponse, ApplyRequest, Schedule, Channel, CreateChannelInput, CheckRun, RecordDTO, } from "./types" @@ -70,7 +70,7 @@ export const api = { deleteDomain: (projectId: string, id: string) => req(projectPath(projectId, `/domains/${id}`), { method: "DELETE" }), importZones: (projectId: string, accountId: string) => - req(projectPath(projectId, `/accounts/${accountId}/import`), { method: "POST" }), + req(projectPath(projectId, `/accounts/${accountId}/import`), { method: "POST" }), setDomainTemplate: (projectId: string, id: string, templateId: string | null) => req(projectPath(projectId, `/domains/${id}`), { method: "PATCH", body: JSON.stringify({ templateId }) }), diff --git a/web/src/api/types.ts b/web/src/api/types.ts index 6cd1f1e..ef38843 100644 --- a/web/src/api/types.ts +++ b/web/src/api/types.ts @@ -29,6 +29,7 @@ export interface CreateDomainInput { zoneId: string templateId?: string | null } +export interface ImportResult { created: Domain[]; removed: Domain[] } export interface Schedule { intervalSeconds: number; enabled: boolean } diff --git a/web/src/pages/DomainsPage.test.tsx b/web/src/pages/DomainsPage.test.tsx index 68bcb74..80108ac 100644 --- a/web/src/pages/DomainsPage.test.tsx +++ b/web/src/pages/DomainsPage.test.tsx @@ -62,7 +62,7 @@ test("отрисовывает домены и ссылку на diff-стран }) test("кнопка импорта вызывает api.importZones с выбранной учёткой", async () => { - const importSpy = vi.spyOn(api, "importZones").mockResolvedValue([]) + const importSpy = vi.spyOn(api, "importZones").mockResolvedValue({ created: [], removed: [] }) const user = userEvent.setup() renderPage() @@ -76,6 +76,23 @@ test("кнопка импорта вызывает api.importZones с выбра await waitFor(() => expect(importSpy).toHaveBeenCalledWith(PROJECT_ID, "acc2")) }) +test("после импорта показывает, сколько зон создано и сколько удалено", async () => { + vi.spyOn(api, "importZones").mockResolvedValue({ + created: [ + { id: "d1", providerAccountId: "a1", zoneName: "new.example.com.", zoneId: "z1" }, + ], + removed: [ + { id: "d2", providerAccountId: "a1", zoneName: "gone.example.com.", zoneId: "z9" }, + ], + }) + const user = userEvent.setup() + renderPage() + + await user.click(await screen.findByRole("button", { name: /импортировать зоны/i })) + + expect(await screen.findByText(/создано 1, удалено 1/i)).toBeInTheDocument() +}) + test("привязка шаблона в строке домена вызывает api.setDomainTemplate", async () => { const setTemplateSpy = vi.spyOn(api, "setDomainTemplate").mockResolvedValue(domains[0]) const user = userEvent.setup() diff --git a/web/src/pages/DomainsPage.tsx b/web/src/pages/DomainsPage.tsx index 709074d..c15462b 100644 --- a/web/src/pages/DomainsPage.tsx +++ b/web/src/pages/DomainsPage.tsx @@ -102,6 +102,11 @@ export function DomainsPage() { {importZones.isError && ( {importZones.error.message} )} + {importZones.isSuccess && ( + + Создано {importZones.data.created.length}, удалено {importZones.data.removed.length} + + )} {setTemplate.isError && (