@@ -2,6 +2,7 @@ import { Api } from "coder/site/src/api/api";
22import { describe , it , expect , vi , beforeAll } from "vitest" ;
33import * as vscode from "vscode" ;
44import { Storage } from "./storage" ;
5+ import { createMockOutputChannelWithLogger } from "./test-helpers" ;
56import { WorkspaceProvider , WorkspaceQuery } from "./workspacesProvider" ;
67
78// Mock dependencies
@@ -980,4 +981,162 @@ describe("workspacesProvider", () => {
980981expect ( result ) . toEqual ( [ ] ) ;
981982} ) ;
982983} ) ;
984+
985+ describe ( "Logger integration" , ( ) => {
986+ it ( "should log debug messages through Logger when Storage has Logger set" , async ( ) => {
987+ const { logger} = createMockOutputChannelWithLogger ( ) ;
988+
989+ // Set debug log level to ensure message is logged
990+ const originalLogLevel = vscode . env . logLevel ;
991+ //@ts -expect-error - mocking readonly property
992+ vscode . env . logLevel = vscode . LogLevel . Debug ;
993+
994+ const mockWorkspaceQuery = WorkspaceQuery . Mine ;
995+ const mockRestClient = {
996+ getAxiosInstance :vi . fn ( ( ) => ( {
997+ defaults :{ baseURL :"https://test.coder.com" } ,
998+ } ) ) ,
999+ getWorkspaces :vi . fn ( ( ) =>
1000+ Promise . resolve ( {
1001+ workspaces :[ ] ,
1002+ } ) ,
1003+ ) ,
1004+ } as unknown as Api ;
1005+
1006+ // Create mock Storage that uses Logger
1007+ const mockStorage = {
1008+ writeToCoderOutputChannel :vi . fn ( ( msg :string ) => {
1009+ logger . debug ( msg ) ;
1010+ } ) ,
1011+ } as unknown as Storage ;
1012+
1013+ const provider = new WorkspaceProvider (
1014+ mockWorkspaceQuery ,
1015+ mockRestClient ,
1016+ mockStorage ,
1017+ ) ;
1018+
1019+ // Mock extractAllAgents
1020+ const { extractAllAgents} = await import ( "./api-helper" ) ;
1021+ vi . mocked ( extractAllAgents ) . mockReturnValue ( [ ] ) ;
1022+
1023+ // Call private fetch method
1024+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1025+ await ( provider as any ) . fetch ( ) ;
1026+
1027+ // Verify debug message was logged
1028+ expect ( mockStorage . writeToCoderOutputChannel ) . toHaveBeenCalledWith (
1029+ "Fetching workspaces: owner:me..." ,
1030+ ) ;
1031+
1032+ const logs = logger . getLogs ( ) ;
1033+ expect ( logs . length ) . toBe ( 1 ) ;
1034+ expect ( logs [ 0 ] . message ) . toBe ( "Fetching workspaces: owner:me..." ) ;
1035+ expect ( logs [ 0 ] . level ) . toBe ( "DEBUG" ) ;
1036+
1037+ // Restore log level
1038+ //@ts -expect-error - mocking readonly property
1039+ vscode . env . logLevel = originalLogLevel ;
1040+ } ) ;
1041+
1042+ it ( "should work with Storage instance that has Logger set" , async ( ) => {
1043+ const { logger} = createMockOutputChannelWithLogger ( ) ;
1044+
1045+ // Set debug log level
1046+ const originalLogLevel = vscode . env . logLevel ;
1047+ //@ts -expect-error - mocking readonly property
1048+ vscode . env . logLevel = vscode . LogLevel . Debug ;
1049+
1050+ const mockWorkspaceQuery = WorkspaceQuery . All ;
1051+ const mockRestClient = {
1052+ getAxiosInstance :vi . fn ( ( ) => ( {
1053+ defaults :{ baseURL :"https://example.com" } ,
1054+ } ) ) ,
1055+ getWorkspaces :vi . fn ( ( ) =>
1056+ Promise . resolve ( {
1057+ workspaces :[ ] ,
1058+ } ) ,
1059+ ) ,
1060+ } as unknown as Api ;
1061+
1062+ // Simulate Storage with Logger
1063+ const mockStorage = {
1064+ writeToCoderOutputChannel :vi . fn ( ( msg :string ) => {
1065+ logger . info ( msg ) ;
1066+ } ) ,
1067+ } as unknown as Storage ;
1068+
1069+ const provider = new WorkspaceProvider (
1070+ mockWorkspaceQuery ,
1071+ mockRestClient ,
1072+ mockStorage ,
1073+ ) ;
1074+
1075+ // Mock extractAllAgents
1076+ const { extractAllAgents} = await import ( "./api-helper" ) ;
1077+ vi . mocked ( extractAllAgents ) . mockReturnValue ( [ ] ) ;
1078+
1079+ // Call private fetch method
1080+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1081+ await ( provider as any ) . fetch ( ) ;
1082+
1083+ // Verify message was logged through Logger
1084+ const logs = logger . getLogs ( ) ;
1085+ expect ( logs . length ) . toBeGreaterThan ( 0 ) ;
1086+ expect ( logs [ 0 ] . message ) . toBe ( "Fetching workspaces: no filter..." ) ;
1087+
1088+ // Restore log level
1089+ //@ts -expect-error - mocking readonly property
1090+ vscode . env . logLevel = originalLogLevel ;
1091+ } ) ;
1092+
1093+ it ( "should not log when log level is above Debug" , async ( ) => {
1094+ const { logger} = createMockOutputChannelWithLogger ( ) ;
1095+
1096+ // Set info log level (above debug)
1097+ const originalLogLevel = vscode . env . logLevel ;
1098+ //@ts -expect-error - mocking readonly property
1099+ vscode . env . logLevel = vscode . LogLevel . Info ;
1100+
1101+ const mockWorkspaceQuery = WorkspaceQuery . Mine ;
1102+ const mockRestClient = {
1103+ getAxiosInstance :vi . fn ( ( ) => ( {
1104+ defaults :{ baseURL :"https://test.coder.com" } ,
1105+ } ) ) ,
1106+ getWorkspaces :vi . fn ( ( ) =>
1107+ Promise . resolve ( {
1108+ workspaces :[ ] ,
1109+ } ) ,
1110+ ) ,
1111+ } as unknown as Api ;
1112+
1113+ // Create mock Storage that uses Logger
1114+ const mockStorage = {
1115+ writeToCoderOutputChannel :vi . fn ( ( msg :string ) => {
1116+ logger . debug ( msg ) ;
1117+ } ) ,
1118+ } as unknown as Storage ;
1119+
1120+ const provider = new WorkspaceProvider (
1121+ mockWorkspaceQuery ,
1122+ mockRestClient ,
1123+ mockStorage ,
1124+ ) ;
1125+
1126+ // Mock extractAllAgents
1127+ const { extractAllAgents} = await import ( "./api-helper" ) ;
1128+ vi . mocked ( extractAllAgents ) . mockReturnValue ( [ ] ) ;
1129+
1130+ // Call private fetch method
1131+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1132+ await ( provider as any ) . fetch ( ) ;
1133+
1134+ // Verify writeToCoderOutputChannel was NOT called
1135+ expect ( mockStorage . writeToCoderOutputChannel ) . not . toHaveBeenCalled ( ) ;
1136+
1137+ // Restore log level
1138+ //@ts -expect-error - mocking readonly property
1139+ vscode . env . logLevel = originalLogLevel ;
1140+ } ) ;
1141+ } ) ;
9831142} ) ;