mirror of
https://github.com/Gitlawb/openclaude.git
synced 2026-08-28 10:16:22 -05:00
132 lines
4.4 KiB
TypeScript
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,
|
|
},
|
|
})
|
|
})
|
|
})
|