750d74a2af
- 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.
75 lines
2.6 KiB
TypeScript
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);
|
|
});
|
|
});
|