56 lines
2.2 KiB
TypeScript
56 lines
2.2 KiB
TypeScript
import { render, screen, waitFor } from "@testing-library/react"
|
|
import userEvent from "@testing-library/user-event"
|
|
import { MemoryRouter, Routes, Route } from "react-router-dom"
|
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"
|
|
import { DomainDiffPage } from "./DomainDiffPage"
|
|
import { AuthProvider } from "@/auth/AuthContext"
|
|
import { api } from "@/api/client"
|
|
import { vi, beforeEach } from "vitest"
|
|
|
|
const PROJECT_ID = "p1"
|
|
|
|
function renderPage() {
|
|
const qc = new QueryClient()
|
|
return render(
|
|
<QueryClientProvider client={qc}>
|
|
<AuthProvider>
|
|
<MemoryRouter initialEntries={["/domains/d1"]}>
|
|
<Routes><Route path="/domains/:id" element={<DomainDiffPage />} /></Routes>
|
|
</MemoryRouter>
|
|
</AuthProvider>
|
|
</QueryClientProvider>,
|
|
)
|
|
}
|
|
|
|
beforeEach(() => {
|
|
vi.restoreAllMocks()
|
|
vi.spyOn(api.auth, "me").mockResolvedValue({
|
|
user: { id: "u1", email: "a@b.com" },
|
|
project: { id: PROJECT_ID, name: "Default" },
|
|
})
|
|
vi.spyOn(api, "domainHistory").mockResolvedValue([])
|
|
})
|
|
|
|
test("apply sends applyPrunes=false by default, true only after opting in", async () => {
|
|
vi.spyOn(api, "checkDomain").mockResolvedValue({
|
|
updates: [{ kind: "update", type: "A", name: "a.", desired: ["1"], actual: ["2"], readOnly: false }],
|
|
prunes: [{ kind: "delete", type: "A", name: "b.", actual: ["3"], readOnly: false }],
|
|
readOnly: [], inSyncCount: 0,
|
|
})
|
|
const applySpy = vi.spyOn(api, "applyDomain").mockResolvedValue({ updates: [], prunes: [], readOnly: [], inSyncCount: 0 })
|
|
const user = userEvent.setup()
|
|
renderPage()
|
|
|
|
const applyBtn = await screen.findByRole("button", { name: /apply/i })
|
|
await user.click(applyBtn)
|
|
await waitFor(() => expect(applySpy).toHaveBeenCalled())
|
|
expect(applySpy.mock.calls[0]).toEqual([PROJECT_ID, "d1", { applyUpdates: true, applyPrunes: false }])
|
|
|
|
// включить prune и применить снова
|
|
const pruneToggle = screen.getByRole("checkbox", { name: /prune|удал/i })
|
|
await user.click(pruneToggle)
|
|
await user.click(screen.getByRole("button", { name: /apply/i }))
|
|
await waitFor(() => expect(applySpy).toHaveBeenCalledTimes(2))
|
|
expect(applySpy.mock.calls[1]).toEqual([PROJECT_ID, "d1", { applyUpdates: true, applyPrunes: true }])
|
|
})
|