Files
AgentHub/client/src/components/settings/__tests__/OmpSharingSettings.test.tsx
T
nntrivi2001 750d74a2af chore: v2.8.15 — Oh My Pi login sharing, omp --allow-home, Markdown Preview default, first-login password
- omp-share.js: an admin's switch (S3) runs omp's own auth broker + gateway as
  the host on loopback; a member's omp pane reaches it as a scoped client keyed
  by its pane token (clients file = live omp panes only), runs on
  --model agenthub/<model>, never holds a credential.
- omp catalog: --allow-home, so a workspace at the account's home keeps its
  sessions there (they were recorded under a temp dir and dropped).
- Settings → Appearance → Open Markdown as: Preview (default) or Raw, for
  Files/Changes, the config viewer and a chat's file panel.
- First-login password change and password rules, avatar URLs, Artifacts
  "Mine" includes installed shared skills/plugins, a member's own hook pages.
2026-10-22 10:04:30 +07:00

75 lines
2.6 KiB
TypeScript

/**
* @file Tests for OmpSharingSettings — the admin's Oh My Pi login-sharing
* switch in Settings → AI tools: hidden in local mode, for a non-admin and
* outside S3, and a toggle saves through PUT /api/ai-tools/omp-sharing and
* shows the daemons' state.
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
*/
import { describe, expect, it, vi, beforeEach } from "vitest";
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
import "../../../i18n";
import { OmpSharingSettings } from "../OmpSharingSettings";
import { api, type OmpSharingState } from "../../../lib/api";
const perms = vi.hoisted(() => ({ isAdmin: true, local: false }));
vi.mock("../../AuthGate", () => ({ usePermissions: () => perms }));
vi.mock("../../../lib/api", () => ({
api: { aiTools: { ompSharing: vi.fn(), setOmpSharing: vi.fn() } },
}));
const get = vi.mocked(api.aiTools.ompSharing);
const set = vi.mocked(api.aiTools.setOmpSharing);
const off: OmpSharingState = {
available: true,
enabled: false,
installed: true,
broker: { running: false, error: null },
gateway: { running: false, error: null },
};
describe("OmpSharingSettings", () => {
beforeEach(() => {
vi.clearAllMocks();
perms.isAdmin = true;
perms.local = false;
});
it("lets an admin turn sharing on and shows it running", async () => {
get.mockResolvedValue(off);
set.mockResolvedValue({
...off,
enabled: true,
broker: { running: true },
gateway: { running: true, port: 4827 },
});
render(<OmpSharingSettings />);
const sw = await screen.findByRole("switch", { name: "Share this server's Oh My Pi login" });
fireEvent.click(sw);
await waitFor(() => expect(set).toHaveBeenCalledWith(true));
expect(await screen.findByTestId("omp-sharing-status")).toHaveTextContent("Running");
});
it("names a daemon's failure", async () => {
get.mockResolvedValue({
...off,
enabled: true,
gateway: { running: false, error: "port 4827 is taken" },
});
render(<OmpSharingSettings />);
expect(await screen.findByTestId("omp-sharing-status")).toHaveTextContent("port 4827 is taken");
});
it("renders nothing outside S3, for a non-admin or in local mode", async () => {
get.mockResolvedValue({ ...off, available: false });
const r = render(<OmpSharingSettings />);
await waitFor(() => expect(get).toHaveBeenCalled());
expect(r.container).toBeEmptyDOMElement();
r.unmount();
perms.isAdmin = false;
const r2 = render(<OmpSharingSettings />);
expect(r2.container).toBeEmptyDOMElement();
expect(get).toHaveBeenCalledTimes(1);
});
});