@@ -2,6 +2,7 @@ import { Api } from "coder/site/src/api/api";
2
2
import { describe , it , expect , vi , beforeAll } from "vitest" ;
3
3
import * as vscode from "vscode" ;
4
4
import { Storage } from "./storage" ;
5
+ import { createMockOutputChannelWithLogger } from "./test-helpers" ;
5
6
import { WorkspaceProvider , WorkspaceQuery } from "./workspacesProvider" ;
6
7
7
8
// Mock dependencies
@@ -980,4 +981,162 @@ describe("workspacesProvider", () => {
980
981
expect ( result ) . toEqual ( [ ] ) ;
981
982
} ) ;
982
983
} ) ;
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
+ } ) ;
983
1142
} ) ;