Files

132 lines
4.4 KiB
TypeScript

import { beforeEach, describe, expect, it } from 'bun:test'
import { resetStateForTests } from '../cost-tracker.js'
import { getUnreportedSessionUsage } from '../utils/tokens.js'
import {
buildStatusLineCommandInput,
resolveStatusLineUpdateAction,
resolveStatusLineTokenTotals,
} from './StatusLine.js'
import type { AssistantMessage, Message } from '../types/message.js'
;(globalThis as unknown as { MACRO: { VERSION: string } }).MACRO = {
VERSION: 'test-version',
}
const assistantMessage = (
content: string,
id = 'msg_unsupported',
): AssistantMessage =>
({
type: 'assistant',
uuid: '00000000-0000-0000-0000-000000000001',
timestamp: '2026-06-28T00:00:00.000Z',
message: {
id,
type: 'message',
role: 'assistant',
model: 'mimo-v2.5-pro',
content: [{ type: 'text', text: content }],
stop_reason: 'end_turn',
stop_sequence: null,
usage: {
input_tokens: 0,
output_tokens: 0,
cache_creation_input_tokens: 0,
cache_read_input_tokens: 0,
},
},
}) as unknown as AssistantMessage
const userMessage = (content: string): Message =>
({
type: 'user',
uuid: '00000000-0000-0000-0000-000000000002',
timestamp: '2026-06-28T00:00:00.000Z',
message: {
role: 'user',
content,
},
}) as Message
describe('resolveStatusLineTokenTotals', () => {
it('keeps reported usage totals unchanged', () => {
expect(resolveStatusLineTokenTotals(1200, 300, null)).toEqual({
totalInputTokens: 1200,
totalOutputTokens: 300,
totalTokensAreEstimated: undefined,
})
})
it('adds unreported session usage to cumulative session totals', () => {
expect(
resolveStatusLineTokenTotals(1200, 300, {
input_tokens: 90,
output_tokens: 20,
}),
).toEqual({
totalInputTokens: 1290,
totalOutputTokens: 320,
totalTokensAreEstimated: true,
})
})
})
describe('resolveStatusLineUpdateAction', () => {
it('cancels pending work and records a refresh when hidden', () => {
expect(resolveStatusLineUpdateAction({ active: false, hasRun: true, needsRefresh: false, stateChanged: false, commandChanged: false, hasPendingUpdate: true })).toEqual({ action: 'cancel', needsRefresh: true })
})
it('runs once when first activated with pending changes', () => {
expect(resolveStatusLineUpdateAction({ active: true, hasRun: false, needsRefresh: true, stateChanged: true, commandChanged: false, hasPendingUpdate: false })).toEqual({ action: 'run' })
})
it('runs immediately when reactivated after hidden changes', () => {
expect(resolveStatusLineUpdateAction({ active: true, hasRun: true, needsRefresh: true, stateChanged: false, commandChanged: false, hasPendingUpdate: false })).toEqual({ action: 'run' })
})
it('debounces ordinary visible state changes', () => {
expect(resolveStatusLineUpdateAction({ active: true, hasRun: true, needsRefresh: false, stateChanged: true, commandChanged: false, hasPendingUpdate: false })).toEqual({ action: 'schedule' })
})
it('does nothing when active and nothing changed', () => {
expect(resolveStatusLineUpdateAction({ active: true, hasRun: true, needsRefresh: false, stateChanged: false, commandChanged: false, hasPendingUpdate: false })).toEqual({ action: 'none' })
})
it('runs immediately when the statusline command changes', () => {
expect(resolveStatusLineUpdateAction({ active: true, hasRun: true, needsRefresh: false, stateChanged: false, commandChanged: true, hasPendingUpdate: false })).toEqual({ action: 'run' })
})
})
describe('buildStatusLineCommandInput', () => {
beforeEach(() => {
resetStateForTests()
})
it('emits estimated cumulative totals for unreported provider usage', () => {
const messages = [
userMessage('Please summarize this repository.'),
assistantMessage('This repository contains source files and tests.'),
]
const unreportedUsage = getUnreportedSessionUsage(messages)
expect(unreportedUsage).not.toBeNull()
const input = buildStatusLineCommandInput(
'default',
false,
{},
messages,
[],
'mimo-v2.5-pro',
)
expect(input.context_window).toMatchObject({
total_input_tokens: unreportedUsage!.input_tokens,
total_output_tokens: unreportedUsage!.output_tokens,
total_tokens_are_estimated: true,
current_usage: {
is_estimated: true,
},
})
})
})