openclaw/src/gateway/session-lifecycle-state.tes...

116 lines
2.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
deriveGatewaySessionLifecycleSnapshot,
derivePersistedSessionLifecyclePatch,
} from "./session-lifecycle-state.js";
describe("session lifecycle state", () => {
it("reactivates completed sessions on lifecycle start", () => {
expect(
deriveGatewaySessionLifecycleSnapshot({
session: {
updatedAt: 500,
status: "done",
startedAt: 100,
endedAt: 400,
runtimeMs: 300,
abortedLastRun: true,
},
event: {
ts: 1_000,
data: {
phase: "start",
startedAt: 900,
},
},
}),
).toEqual({
updatedAt: 900,
status: "running",
startedAt: 900,
endedAt: undefined,
runtimeMs: undefined,
abortedLastRun: false,
});
});
it("marks completed lifecycle end events as done with terminal timing", () => {
expect(
deriveGatewaySessionLifecycleSnapshot({
session: {
updatedAt: 1_000,
status: "running",
startedAt: 1_200,
},
event: {
ts: 2_000,
data: {
phase: "end",
startedAt: 1_200,
endedAt: 1_900,
},
},
}),
).toEqual({
updatedAt: 1_900,
status: "done",
startedAt: 1_200,
endedAt: 1_900,
runtimeMs: 700,
abortedLastRun: false,
});
});
it("maps aborted stop reasons to killed", () => {
expect(
derivePersistedSessionLifecyclePatch({
entry: {
updatedAt: 1_000,
startedAt: 1_100,
},
event: {
ts: 2_000,
data: {
phase: "end",
endedAt: 1_800,
stopReason: "aborted",
},
},
}),
).toEqual({
updatedAt: 1_800,
status: "killed",
startedAt: 1_100,
endedAt: 1_800,
runtimeMs: 700,
abortedLastRun: true,
});
});
it("maps aborted lifecycle end events without stopReason to timeout", () => {
expect(
derivePersistedSessionLifecyclePatch({
entry: {
updatedAt: 1_000,
startedAt: 1_050,
},
event: {
ts: 2_000,
data: {
phase: "end",
endedAt: 1_550,
aborted: true,
},
},
}),
).toEqual({
updatedAt: 1_550,
status: "timeout",
startedAt: 1_050,
endedAt: 1_550,
runtimeMs: 500,
abortedLastRun: false,
});
});
});