mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-19 04:00:38 +09:00
168 lines
4.3 KiB
TypeScript
168 lines
4.3 KiB
TypeScript
|
|
// @vitest-environment jsdom
|
||
|
|
|
||
|
|
import { act } from "react";
|
||
|
|
import { createRoot } from "react-dom/client";
|
||
|
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||
|
|
import { AGENT_ADAPTER_TYPES, getEnvironmentCapabilities } from "@paperclipai/shared";
|
||
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||
|
|
import { CompanySettings } from "./CompanySettings";
|
||
|
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
||
|
|
|
||
|
|
const mockCompaniesApi = vi.hoisted(() => ({
|
||
|
|
update: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
const mockAccessApi = vi.hoisted(() => ({
|
||
|
|
createOpenClawInvitePrompt: vi.fn(),
|
||
|
|
getInviteOnboarding: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
const mockAssetsApi = vi.hoisted(() => ({
|
||
|
|
uploadCompanyLogo: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
const mockEnvironmentsApi = vi.hoisted(() => ({
|
||
|
|
list: vi.fn(),
|
||
|
|
capabilities: vi.fn(),
|
||
|
|
create: vi.fn(),
|
||
|
|
update: vi.fn(),
|
||
|
|
probe: vi.fn(),
|
||
|
|
probeConfig: vi.fn(),
|
||
|
|
archive: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
const mockInstanceSettingsApi = vi.hoisted(() => ({
|
||
|
|
getExperimental: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
const mockSecretsApi = vi.hoisted(() => ({
|
||
|
|
list: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
const mockPushToast = vi.hoisted(() => vi.fn());
|
||
|
|
const mockSetBreadcrumbs = vi.hoisted(() => vi.fn());
|
||
|
|
const mockSetSelectedCompanyId = vi.hoisted(() => vi.fn());
|
||
|
|
|
||
|
|
vi.mock("../api/companies", () => ({
|
||
|
|
companiesApi: mockCompaniesApi,
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../api/access", () => ({
|
||
|
|
accessApi: mockAccessApi,
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../api/assets", () => ({
|
||
|
|
assetsApi: mockAssetsApi,
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../api/environments", () => ({
|
||
|
|
environmentsApi: mockEnvironmentsApi,
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../api/instanceSettings", () => ({
|
||
|
|
instanceSettingsApi: mockInstanceSettingsApi,
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../api/secrets", () => ({
|
||
|
|
secretsApi: mockSecretsApi,
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../context/BreadcrumbContext", () => ({
|
||
|
|
useBreadcrumbs: () => ({
|
||
|
|
setBreadcrumbs: mockSetBreadcrumbs,
|
||
|
|
}),
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../context/ToastContext", () => ({
|
||
|
|
useToast: () => ({
|
||
|
|
pushToast: mockPushToast,
|
||
|
|
}),
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../context/CompanyContext", () => ({
|
||
|
|
useCompany: () => ({
|
||
|
|
companies: [{ id: "company-1", name: "Paperclip", issuePrefix: "PAP" }],
|
||
|
|
selectedCompany: {
|
||
|
|
id: "company-1",
|
||
|
|
name: "Paperclip",
|
||
|
|
description: null,
|
||
|
|
brandColor: null,
|
||
|
|
logoUrl: null,
|
||
|
|
issuePrefix: "PAP",
|
||
|
|
},
|
||
|
|
selectedCompanyId: "company-1",
|
||
|
|
setSelectedCompanyId: mockSetSelectedCompanyId,
|
||
|
|
}),
|
||
|
|
}));
|
||
|
|
|
||
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||
|
|
(globalThis as any).IS_REACT_ACT_ENVIRONMENT = true;
|
||
|
|
|
||
|
|
async function flushReact() {
|
||
|
|
await act(async () => {
|
||
|
|
await Promise.resolve();
|
||
|
|
await new Promise((resolve) => window.setTimeout(resolve, 0));
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
describe("CompanySettings", () => {
|
||
|
|
let container: HTMLDivElement;
|
||
|
|
|
||
|
|
beforeEach(() => {
|
||
|
|
container = document.createElement("div");
|
||
|
|
document.body.appendChild(container);
|
||
|
|
|
||
|
|
mockInstanceSettingsApi.getExperimental.mockResolvedValue({
|
||
|
|
enableEnvironments: true,
|
||
|
|
});
|
||
|
|
mockEnvironmentsApi.list.mockResolvedValue([]);
|
||
|
|
mockEnvironmentsApi.capabilities.mockResolvedValue(
|
||
|
|
getEnvironmentCapabilities(AGENT_ADAPTER_TYPES),
|
||
|
|
);
|
||
|
|
mockSecretsApi.list.mockResolvedValue([]);
|
||
|
|
mockCompaniesApi.update.mockResolvedValue({
|
||
|
|
id: "company-1",
|
||
|
|
name: "Paperclip",
|
||
|
|
description: null,
|
||
|
|
brandColor: null,
|
||
|
|
logoUrl: null,
|
||
|
|
issuePrefix: "PAP",
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
afterEach(() => {
|
||
|
|
container.remove();
|
||
|
|
document.body.innerHTML = "";
|
||
|
|
vi.clearAllMocks();
|
||
|
|
});
|
||
|
|
|
||
|
|
it("hides sandbox creation when no run-capable sandbox provider plugins are installed", async () => {
|
||
|
|
const root = createRoot(container);
|
||
|
|
const queryClient = new QueryClient({
|
||
|
|
defaultOptions: { queries: { retry: false } },
|
||
|
|
});
|
||
|
|
|
||
|
|
await act(async () => {
|
||
|
|
root.render(
|
||
|
|
<QueryClientProvider client={queryClient}>
|
||
|
|
<TooltipProvider>
|
||
|
|
<CompanySettings />
|
||
|
|
</TooltipProvider>
|
||
|
|
</QueryClientProvider>,
|
||
|
|
);
|
||
|
|
});
|
||
|
|
await flushReact();
|
||
|
|
await flushReact();
|
||
|
|
|
||
|
|
const optionLabels = Array.from(container.querySelectorAll("option")).map((option) => option.textContent?.trim());
|
||
|
|
|
||
|
|
expect(optionLabels).not.toContain("Sandbox");
|
||
|
|
expect(container.textContent).not.toContain("Fake sandbox");
|
||
|
|
expect(container.textContent).not.toContain("Fake is the deterministic test provider");
|
||
|
|
|
||
|
|
await act(async () => {
|
||
|
|
root.unmount();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|