Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9e8ed6d

Browse files
jaggederestclaude
andcommitted
test: add Logger integration tests for inbox
- Add tests verifying inbox logs through Logger when Storage has Logger set- Test WebSocket open event logs "Listening to Coder Inbox"- Test dispose logs "No longer listening to Coder Inbox"- Test error handler logs error message and then dispose message- Use createMockOutputChannelWithLogger factory for consistent test setup- No code changes needed in inbox.ts - already compatible via Storage interface🤖 Generated with [Claude Code](https://claude.ai/code)Co-Authored-By: Claude <noreply@anthropic.com>
1 parent92c548a commit9e8ed6d

File tree

1 file changed

+175
-0
lines changed

1 file changed

+175
-0
lines changed

‎src/inbox.test.ts

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ProxyAgent } from "proxy-agent";
44
import{describe,it,expect,vi,beforeAll}from"vitest";
55
import{Inbox}from"./inbox";
66
import{Storage}from"./storage";
7+
import{createMockOutputChannelWithLogger}from"./test-helpers";
78

89
// Mock dependencies
910
vi.mock("ws");
@@ -161,4 +162,178 @@ describe("inbox", () => {
161162
);
162163
expect(mockWebSocket.close).toHaveBeenCalled();
163164
});
165+
166+
describe("Logger integration",()=>{
167+
it("should log messages through Logger when Storage has Logger set",async()=>{
168+
const{ logger}=createMockOutputChannelWithLogger();
169+
170+
// Mock WebSocket
171+
letopenHandler:(()=>void)|undefined;
172+
constmockWebSocket={
173+
on:vi.fn((event,handler)=>{
174+
if(event==="open"){
175+
openHandler=handler;
176+
}
177+
}),
178+
close:vi.fn(),
179+
};
180+
const{WebSocket:MockWebSocket}=awaitimport("ws");
181+
vi.mocked(MockWebSocket).mockImplementation(()=>mockWebSocketasnever);
182+
183+
constmockWorkspace={id:"workspace-123"}asWorkspace;
184+
constmockHttpAgent={}asProxyAgent;
185+
constmockRestClient={
186+
getAxiosInstance:vi.fn(()=>({
187+
defaults:{
188+
baseURL:"https://test.com",
189+
headers:{
190+
common:{},
191+
},
192+
},
193+
})),
194+
}asunknownasApi;
195+
196+
// Create mock Storage that uses Logger
197+
constmockStorage={
198+
writeToCoderOutputChannel:vi.fn((msg:string)=>{
199+
logger.info(msg);
200+
}),
201+
}asunknownasStorage;
202+
203+
newInbox(mockWorkspace,mockHttpAgent,mockRestClient,mockStorage);
204+
205+
// Trigger open event
206+
openHandler?.();
207+
208+
// Verify "Listening to Coder Inbox" was logged
209+
expect(mockStorage.writeToCoderOutputChannel).toHaveBeenCalledWith(
210+
"Listening to Coder Inbox",
211+
);
212+
213+
constlogs=logger.getLogs();
214+
expect(logs.length).toBe(1);
215+
expect(logs[0].message).toBe("Listening to Coder Inbox");
216+
expect(logs[0].level).toBe("INFO");
217+
});
218+
219+
it("should log dispose message through Logger",async()=>{
220+
const{ logger}=createMockOutputChannelWithLogger();
221+
222+
// Mock WebSocket
223+
constmockWebSocket={
224+
on:vi.fn(),
225+
close:vi.fn(),
226+
};
227+
const{WebSocket:MockWebSocket}=awaitimport("ws");
228+
vi.mocked(MockWebSocket).mockImplementation(()=>mockWebSocketasnever);
229+
230+
constmockWorkspace={id:"workspace-123"}asWorkspace;
231+
constmockHttpAgent={}asProxyAgent;
232+
constmockRestClient={
233+
getAxiosInstance:vi.fn(()=>({
234+
defaults:{
235+
baseURL:"https://test.com",
236+
headers:{
237+
common:{},
238+
},
239+
},
240+
})),
241+
}asunknownasApi;
242+
243+
// Create mock Storage that uses Logger
244+
constmockStorage={
245+
writeToCoderOutputChannel:vi.fn((msg:string)=>{
246+
logger.info(msg);
247+
}),
248+
}asunknownasStorage;
249+
250+
constinbox=newInbox(
251+
mockWorkspace,
252+
mockHttpAgent,
253+
mockRestClient,
254+
mockStorage,
255+
);
256+
257+
// Clear any logs from initialization
258+
logger.clear();
259+
vi.mocked(mockStorage.writeToCoderOutputChannel).mockClear();
260+
261+
// Dispose
262+
inbox.dispose();
263+
264+
// Verify dispose message was logged
265+
expect(mockStorage.writeToCoderOutputChannel).toHaveBeenCalledWith(
266+
"No longer listening to Coder Inbox",
267+
);
268+
269+
constlogs=logger.getLogs();
270+
expect(logs.length).toBe(1);
271+
expect(logs[0].message).toBe("No longer listening to Coder Inbox");
272+
});
273+
274+
it("should log error messages through Logger",async()=>{
275+
const{ logger}=createMockOutputChannelWithLogger();
276+
277+
// Mock WebSocket
278+
leterrorHandler:((error:Error)=>void)|undefined;
279+
constmockWebSocket={
280+
on:vi.fn((event,handler)=>{
281+
if(event==="error"){
282+
errorHandler=handler;
283+
}
284+
}),
285+
close:vi.fn(),
286+
};
287+
const{WebSocket:MockWebSocket}=awaitimport("ws");
288+
vi.mocked(MockWebSocket).mockImplementation(()=>mockWebSocketasnever);
289+
290+
// Mock errToStr
291+
const{ errToStr}=awaitimport("./api-helper");
292+
vi.mocked(errToStr).mockReturnValue("WebSocket connection error");
293+
294+
constmockWorkspace={id:"workspace-123"}asWorkspace;
295+
constmockHttpAgent={}asProxyAgent;
296+
constmockRestClient={
297+
getAxiosInstance:vi.fn(()=>({
298+
defaults:{
299+
baseURL:"https://test.com",
300+
headers:{
301+
common:{},
302+
},
303+
},
304+
})),
305+
}asunknownasApi;
306+
307+
// Create mock Storage that uses Logger
308+
constmockStorage={
309+
writeToCoderOutputChannel:vi.fn((msg:string)=>{
310+
logger.info(msg);
311+
}),
312+
}asunknownasStorage;
313+
314+
newInbox(mockWorkspace,mockHttpAgent,mockRestClient,mockStorage);
315+
316+
// Clear any logs from initialization
317+
logger.clear();
318+
vi.mocked(mockStorage.writeToCoderOutputChannel).mockClear();
319+
320+
// Trigger error event
321+
consttestError=newError("Test WebSocket error");
322+
errorHandler?.(testError);
323+
324+
// Verify error was logged
325+
expect(mockStorage.writeToCoderOutputChannel).toHaveBeenCalledWith(
326+
"WebSocket connection error",
327+
);
328+
329+
// The second call should be for "No longer listening to Coder Inbox"
330+
// because the error handler calls dispose()
331+
expect(mockStorage.writeToCoderOutputChannel).toHaveBeenCalledTimes(2);
332+
333+
constlogs=logger.getLogs();
334+
expect(logs.length).toBe(2);
335+
expect(logs[0].message).toBe("WebSocket connection error");
336+
expect(logs[1].message).toBe("No longer listening to Coder Inbox");
337+
});
338+
});
164339
});

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp