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 ,
});
});
});
Messung V0.5 in Prozent C=96 H=94 G=94
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland