oh-my-opencode/src/plugin/session-status-normalizer.test.ts
YeonGyu-Kim 1717050f73 feat(event): normalize session.status to session.idle
Add session-status-normalizer to handle session.status events and
convert idle status to synthetic session.idle events. Includes
deduplication logic to prevent duplicate idle events within 500ms.
2026-02-10 11:41:45 +09:00

120 lines
2.9 KiB
TypeScript

import { describe, it, expect } from "bun:test"
import { normalizeSessionStatusToIdle } from "./session-status-normalizer"
type EventInput = { event: { type: string; properties?: Record<string, unknown> } }
describe("normalizeSessionStatusToIdle", () => {
it("converts session.status with idle type to synthetic session.idle event", () => {
//#given - a session.status event with type=idle
const input: EventInput = {
event: {
type: "session.status",
properties: {
sessionID: "ses_abc123",
status: { type: "idle" },
},
},
}
//#when - normalizeSessionStatusToIdle is called
const result = normalizeSessionStatusToIdle(input)
//#then - returns a synthetic session.idle event
expect(result).toEqual({
event: {
type: "session.idle",
properties: {
sessionID: "ses_abc123",
},
},
})
})
it("returns null for session.status with busy type", () => {
//#given - a session.status event with type=busy
const input: EventInput = {
event: {
type: "session.status",
properties: {
sessionID: "ses_abc123",
status: { type: "busy" },
},
},
}
//#when - normalizeSessionStatusToIdle is called
const result = normalizeSessionStatusToIdle(input)
//#then - returns null (no synthetic idle event)
expect(result).toBeNull()
})
it("returns null for session.status with retry type", () => {
//#given - a session.status event with type=retry
const input: EventInput = {
event: {
type: "session.status",
properties: {
sessionID: "ses_abc123",
status: { type: "retry", attempt: 1, message: "retrying", next: 5000 },
},
},
}
//#when - normalizeSessionStatusToIdle is called
const result = normalizeSessionStatusToIdle(input)
//#then - returns null
expect(result).toBeNull()
})
it("returns null for non-session.status events", () => {
//#given - a message.updated event
const input: EventInput = {
event: {
type: "message.updated",
properties: { info: { sessionID: "ses_abc123" } },
},
}
//#when - normalizeSessionStatusToIdle is called
const result = normalizeSessionStatusToIdle(input)
//#then - returns null
expect(result).toBeNull()
})
it("returns null when session.status has no properties", () => {
//#given - a session.status event with no properties
const input: EventInput = {
event: {
type: "session.status",
},
}
//#when - normalizeSessionStatusToIdle is called
const result = normalizeSessionStatusToIdle(input)
//#then - returns null
expect(result).toBeNull()
})
it("returns null when session.status has no status object", () => {
//#given - a session.status event with sessionID but no status
const input: EventInput = {
event: {
type: "session.status",
properties: {
sessionID: "ses_abc123",
},
},
}
//#when - normalizeSessionStatusToIdle is called
const result = normalizeSessionStatusToIdle(input)
//#then - returns null
expect(result).toBeNull()
})
})