mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 00:01:24 +00:00
test: dedupe fixtures and test harness setup
This commit is contained in:
@@ -51,6 +51,43 @@ function createForwarder(params: {
|
||||
return { deliver, forwarder };
|
||||
}
|
||||
|
||||
function makeSessionCfg(options: { discordExecApprovalsEnabled?: boolean } = {}): OpenClawConfig {
|
||||
return {
|
||||
...(options.discordExecApprovalsEnabled
|
||||
? {
|
||||
channels: {
|
||||
discord: {
|
||||
execApprovals: {
|
||||
enabled: true,
|
||||
approvers: ["123"],
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
approvals: { exec: { enabled: true, mode: "session" } },
|
||||
} as OpenClawConfig;
|
||||
}
|
||||
|
||||
async function expectDiscordSessionTargetRequest(params: {
|
||||
cfg: OpenClawConfig;
|
||||
expectedAccepted: boolean;
|
||||
expectedDeliveryCount: number;
|
||||
}) {
|
||||
vi.useFakeTimers();
|
||||
const { deliver, forwarder } = createForwarder({
|
||||
cfg: params.cfg,
|
||||
resolveSessionTarget: () => ({ channel: "discord", to: "channel:123" }),
|
||||
});
|
||||
|
||||
await expect(forwarder.handleRequested(baseRequest)).resolves.toBe(params.expectedAccepted);
|
||||
if (params.expectedDeliveryCount === 0) {
|
||||
expect(deliver).not.toHaveBeenCalled();
|
||||
return;
|
||||
}
|
||||
expect(deliver).toHaveBeenCalledTimes(params.expectedDeliveryCount);
|
||||
}
|
||||
|
||||
describe("exec approval forwarder", () => {
|
||||
it("forwards to session target and resolves", async () => {
|
||||
vi.useFakeTimers();
|
||||
@@ -124,66 +161,27 @@ describe("exec approval forwarder", () => {
|
||||
});
|
||||
|
||||
it("returns false when all targets are skipped", async () => {
|
||||
vi.useFakeTimers();
|
||||
const cfg = {
|
||||
channels: {
|
||||
discord: {
|
||||
execApprovals: {
|
||||
enabled: true,
|
||||
approvers: ["123"],
|
||||
},
|
||||
},
|
||||
},
|
||||
approvals: { exec: { enabled: true, mode: "session" } },
|
||||
} as OpenClawConfig;
|
||||
|
||||
const { deliver, forwarder } = createForwarder({
|
||||
cfg,
|
||||
resolveSessionTarget: () => ({ channel: "discord", to: "channel:123" }),
|
||||
await expectDiscordSessionTargetRequest({
|
||||
cfg: makeSessionCfg({ discordExecApprovalsEnabled: true }),
|
||||
expectedAccepted: false,
|
||||
expectedDeliveryCount: 0,
|
||||
});
|
||||
|
||||
await expect(forwarder.handleRequested(baseRequest)).resolves.toBe(false);
|
||||
expect(deliver).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("forwards to discord when discord exec approvals handler is disabled", async () => {
|
||||
vi.useFakeTimers();
|
||||
const cfg = {
|
||||
approvals: { exec: { enabled: true, mode: "session" } },
|
||||
} as OpenClawConfig;
|
||||
|
||||
const { deliver, forwarder } = createForwarder({
|
||||
cfg,
|
||||
resolveSessionTarget: () => ({ channel: "discord", to: "channel:123" }),
|
||||
await expectDiscordSessionTargetRequest({
|
||||
cfg: makeSessionCfg(),
|
||||
expectedAccepted: true,
|
||||
expectedDeliveryCount: 1,
|
||||
});
|
||||
|
||||
await expect(forwarder.handleRequested(baseRequest)).resolves.toBe(true);
|
||||
|
||||
expect(deliver).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("skips discord forwarding when discord exec approvals handler is enabled", async () => {
|
||||
vi.useFakeTimers();
|
||||
const cfg = {
|
||||
channels: {
|
||||
discord: {
|
||||
execApprovals: {
|
||||
enabled: true,
|
||||
approvers: ["123"],
|
||||
},
|
||||
},
|
||||
},
|
||||
approvals: { exec: { enabled: true, mode: "session" } },
|
||||
} as OpenClawConfig;
|
||||
|
||||
const { deliver, forwarder } = createForwarder({
|
||||
cfg,
|
||||
resolveSessionTarget: () => ({ channel: "discord", to: "channel:123" }),
|
||||
await expectDiscordSessionTargetRequest({
|
||||
cfg: makeSessionCfg({ discordExecApprovalsEnabled: true }),
|
||||
expectedAccepted: false,
|
||||
expectedDeliveryCount: 0,
|
||||
});
|
||||
|
||||
await expect(forwarder.handleRequested(baseRequest)).resolves.toBe(false);
|
||||
|
||||
expect(deliver).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("can forward resolved notices without pending cache when request payload is present", async () => {
|
||||
|
||||
@@ -115,6 +115,28 @@ function createEaccesProcStatSpy() {
|
||||
});
|
||||
}
|
||||
|
||||
function createPortProbeConnectionSpy(result: "connect" | "refused") {
|
||||
return vi.spyOn(net, "createConnection").mockImplementation(() => {
|
||||
const socket = new EventEmitter() as net.Socket;
|
||||
socket.destroy = vi.fn();
|
||||
setImmediate(() => {
|
||||
if (result === "connect") {
|
||||
socket.emit("connect");
|
||||
return;
|
||||
}
|
||||
socket.emit("error", Object.assign(new Error("ECONNREFUSED"), { code: "ECONNREFUSED" }));
|
||||
});
|
||||
return socket;
|
||||
});
|
||||
}
|
||||
|
||||
async function writeRecentLockFile(env: NodeJS.ProcessEnv, startTime = 111) {
|
||||
await writeLockFile(env, {
|
||||
startTime,
|
||||
createdAt: new Date().toISOString(),
|
||||
});
|
||||
}
|
||||
|
||||
describe("gateway lock", () => {
|
||||
beforeAll(async () => {
|
||||
fixtureRoot = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-gateway-lock-"));
|
||||
@@ -214,18 +236,8 @@ describe("gateway lock", () => {
|
||||
it("treats lock as stale when owner pid is alive but configured port is free", async () => {
|
||||
vi.useRealTimers();
|
||||
const env = await makeEnv();
|
||||
await writeLockFile(env, {
|
||||
startTime: 111,
|
||||
createdAt: new Date().toISOString(),
|
||||
});
|
||||
const connectSpy = vi.spyOn(net, "createConnection").mockImplementation(() => {
|
||||
const socket = new EventEmitter() as net.Socket;
|
||||
socket.destroy = vi.fn();
|
||||
setImmediate(() => {
|
||||
socket.emit("error", Object.assign(new Error("ECONNREFUSED"), { code: "ECONNREFUSED" }));
|
||||
});
|
||||
return socket;
|
||||
});
|
||||
await writeRecentLockFile(env);
|
||||
const connectSpy = createPortProbeConnectionSpy("refused");
|
||||
|
||||
const lock = await acquireForTest(env, {
|
||||
timeoutMs: 80,
|
||||
@@ -242,18 +254,8 @@ describe("gateway lock", () => {
|
||||
it("keeps lock when configured port is busy and owner pid is alive", async () => {
|
||||
vi.useRealTimers();
|
||||
const env = await makeEnv();
|
||||
await writeLockFile(env, {
|
||||
startTime: 111,
|
||||
createdAt: new Date().toISOString(),
|
||||
});
|
||||
const connectSpy = vi.spyOn(net, "createConnection").mockImplementation(() => {
|
||||
const socket = new EventEmitter() as net.Socket;
|
||||
socket.destroy = vi.fn();
|
||||
setImmediate(() => {
|
||||
socket.emit("connect");
|
||||
});
|
||||
return socket;
|
||||
});
|
||||
await writeRecentLockFile(env);
|
||||
const connectSpy = createPortProbeConnectionSpy("connect");
|
||||
try {
|
||||
const pending = acquireForTest(env, {
|
||||
timeoutMs: 20,
|
||||
|
||||
Reference in New Issue
Block a user