Files
orca/src/main/ipc/rate-limits.test.ts
T
kazu-42andBrennan Benson 4a71a0ecb2 feat(mobile): add safe Codex rate-limit resets (#9394)
* feat(mobile): add safe Codex rate-limit resets

* fix(mobile): address reset credit review feedback

* review: purge removed-account reset attempts, shared capability constant, rebase test mocks

* review: preserve host compatibility and reset durability

* fix(mobile): recover reset capability after cutover

* fix(mobile): validate runtime capability payloads

* fix(mobile): enforce capability payload contract

* fix(mobile): route mock terminals to selected worktree

* test(mobile): pin malformed probe retry behavior

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-07-24 14:42:04 -07:00

104 lines
3.9 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
const ipcState = vi.hoisted(() => ({
handleHandlers: new Map<string, (event: unknown, ...args: unknown[]) => unknown>()
}))
vi.mock('electron', () => ({
ipcMain: {
handle: (channel: string, handler: (event: unknown, ...args: unknown[]) => unknown) => {
ipcState.handleHandlers.set(channel, handler)
}
}
}))
import { registerRateLimitHandlers } from './rate-limits'
import type { RateLimitService } from '../rate-limits/service'
import type { RateLimitState } from '../../shared/rate-limit-types'
import type { CodexAccountService } from '../codex-accounts/service'
function makeCodexAccounts() {
const consumeCurrentRateLimitResetCredit = vi.fn(() =>
Promise.resolve({ outcome: 'noCredit', state: {} as RateLimitState })
)
return {
service: { consumeCurrentRateLimitResetCredit } as unknown as CodexAccountService,
consumeCurrentRateLimitResetCredit
}
}
function makeService(): {
service: RateLimitService
refresh: ReturnType<typeof vi.fn>
refreshGrok: ReturnType<typeof vi.fn>
consumeCodexRateLimitResetCredit: ReturnType<typeof vi.fn>
} {
const refresh = vi.fn(() => Promise.resolve({} as RateLimitState))
const refreshGrok = vi.fn(() => Promise.resolve({} as RateLimitState))
const consumeCodexRateLimitResetCredit = vi.fn(() =>
Promise.resolve({ outcome: 'noCredit', state: {} as RateLimitState })
)
const service = {
getState: vi.fn(() => ({}) as RateLimitState),
refresh,
refreshGrok,
refreshCodexForTarget: vi.fn(() => Promise.resolve({} as RateLimitState)),
refreshClaudeForTarget: vi.fn(() => Promise.resolve({} as RateLimitState)),
consumeCodexRateLimitResetCredit,
setPollingInterval: vi.fn(() => Promise.resolve()),
fetchInactiveClaudeAccountsOnOpen: vi.fn(() => Promise.resolve()),
fetchInactiveCodexAccountsOnOpen: vi.fn(() => Promise.resolve())
}
return {
service: service as unknown as RateLimitService,
refresh,
refreshGrok,
consumeCodexRateLimitResetCredit
}
}
describe('registerRateLimitHandlers', () => {
beforeEach(() => {
ipcState.handleHandlers.clear()
})
it('registers a refreshMiniMax channel that delegates to refresh()', async () => {
const { service, refresh } = makeService()
registerRateLimitHandlers(service, makeCodexAccounts().service)
const handler = ipcState.handleHandlers.get('rateLimits:refreshMiniMax')
expect(handler).toBeDefined()
await handler!({})
expect(refresh).toHaveBeenCalledTimes(1)
})
it('keeps the existing rate-limit channels registered', () => {
const { service } = makeService()
registerRateLimitHandlers(service, makeCodexAccounts().service)
expect(ipcState.handleHandlers.has('rateLimits:get')).toBe(true)
expect(ipcState.handleHandlers.has('rateLimits:refresh')).toBe(true)
expect(ipcState.handleHandlers.has('rateLimits:refreshMiniMax')).toBe(true)
expect(ipcState.handleHandlers.has('rateLimits:refreshGrok')).toBe(true)
})
it('registers a refreshGrok channel that delegates to refreshGrok()', async () => {
const { service, refreshGrok } = makeService()
registerRateLimitHandlers(service, makeCodexAccounts().service)
const handler = ipcState.handleHandlers.get('rateLimits:refreshGrok')
expect(handler).toBeDefined()
await handler!({})
expect(refreshGrok).toHaveBeenCalledTimes(1)
})
it('serializes desktop reset consumption through CodexAccountService', async () => {
const { service, consumeCodexRateLimitResetCredit } = makeService()
const codexAccounts = makeCodexAccounts()
registerRateLimitHandlers(service, codexAccounts.service)
const handler = ipcState.handleHandlers.get('rateLimits:consumeCodexResetCredit')
await handler!({})
expect(codexAccounts.consumeCurrentRateLimitResetCredit).toHaveBeenCalledOnce()
expect(consumeCodexRateLimitResetCredit).not.toHaveBeenCalled()
})
})