@@ -5,6 +5,17 @@ import type { Mock } from "vitest"
55// Mock dependencies - must come before imports
66vi . mock ( "../../../api/providers/fetchers/modelCache" )
77
8+ vi . mock ( "../../../integrations/openai-codex/oauth" , ( ) => ( {
9+ openAiCodexOAuthManager : {
10+ getAccessToken : vi . fn ( ) ,
11+ getAccountId : vi . fn ( ) ,
12+ } ,
13+ } ) )
14+
15+ vi . mock ( "../../../integrations/openai-codex/rate-limits" , ( ) => ( {
16+ fetchOpenAiCodexRateLimitInfo : vi . fn ( ) ,
17+ } ) )
18+
819// Mock the diagnosticsHandler module
920vi . mock ( "../diagnosticsHandler" , ( ) => ( {
1021 generateErrorDiagnostics : vi . fn ( ) . mockResolvedValue ( { success : true , filePath : "/tmp/diagnostics.json" } ) ,
@@ -15,8 +26,13 @@ import type { ModelRecord } from "@roo-code/types"
1526import { webviewMessageHandler } from "../webviewMessageHandler"
1627import type { ClineProvider } from "../ClineProvider"
1728import { getModels } from "../../../api/providers/fetchers/modelCache"
29+ const { openAiCodexOAuthManager } = await import ( "../../../integrations/openai-codex/oauth" )
30+ const { fetchOpenAiCodexRateLimitInfo } = await import ( "../../../integrations/openai-codex/rate-limits" )
1831
1932const mockGetModels = getModels as Mock < typeof getModels >
33+ const mockGetAccessToken = vi . mocked ( openAiCodexOAuthManager . getAccessToken )
34+ const mockGetAccountId = vi . mocked ( openAiCodexOAuthManager . getAccountId )
35+ const mockFetchOpenAiCodexRateLimitInfo = vi . mocked ( fetchOpenAiCodexRateLimitInfo )
2036
2137// Mock ClineProvider
2238const mockClineProvider = {
@@ -580,6 +596,43 @@ describe("webviewMessageHandler - requestRouterModels", () => {
580596 } )
581597} )
582598
599+ describe ( "webviewMessageHandler - requestOpenAiCodexRateLimits" , ( ) => {
600+ beforeEach ( ( ) => {
601+ vi . clearAllMocks ( )
602+ mockGetAccessToken . mockResolvedValue ( null )
603+ mockGetAccountId . mockResolvedValue ( null )
604+ } )
605+
606+ it ( "posts error when not authenticated" , async ( ) => {
607+ await webviewMessageHandler ( mockClineProvider , { type : "requestOpenAiCodexRateLimits" } as any )
608+
609+ expect ( mockClineProvider . postMessageToWebview ) . toHaveBeenCalledWith ( {
610+ type : "openAiCodexRateLimits" ,
611+ error : "Not authenticated with OpenAI Codex" ,
612+ } )
613+ } )
614+
615+ it ( "posts values when authenticated" , async ( ) => {
616+ mockGetAccessToken . mockResolvedValue ( "token" )
617+ mockGetAccountId . mockResolvedValue ( "acct_123" )
618+ mockFetchOpenAiCodexRateLimitInfo . mockResolvedValue ( {
619+ primary : { usedPercent : 10 , resetsAt : 1700000000000 } ,
620+ fetchedAt : 1700000000000 ,
621+ } )
622+
623+ await webviewMessageHandler ( mockClineProvider , { type : "requestOpenAiCodexRateLimits" } as any )
624+
625+ expect ( mockFetchOpenAiCodexRateLimitInfo ) . toHaveBeenCalledWith ( "token" , { accountId : "acct_123" } )
626+ expect ( mockClineProvider . postMessageToWebview ) . toHaveBeenCalledWith ( {
627+ type : "openAiCodexRateLimits" ,
628+ values : {
629+ primary : { usedPercent : 10 , resetsAt : 1700000000000 } ,
630+ fetchedAt : 1700000000000 ,
631+ } ,
632+ } )
633+ } )
634+ } )
635+
583636describe ( "webviewMessageHandler - deleteCustomMode" , ( ) => {
584637 beforeEach ( ( ) => {
585638 vi . clearAllMocks ( )
0 commit comments