@@ -336,6 +336,149 @@ describe("configureWikiTools", () => {
336336 });
337337 });
338338
339+ describe("get_page tool", () => {
340+ let mockFetch: jest.Mock;
341+
342+ beforeEach(() => {
343+ mockFetch = jest.fn();
344+ global.fetch = mockFetch;
345+ (tokenProvider as jest.Mock).mockResolvedValue("test-token");
346+ });
347+
348+ it("should fetch page metadata with correct parameters", async () => {
349+ configureWikiTools(server, tokenProvider, connectionProvider, userAgentProvider);
350+ const call = (server.tool as jest.Mock).mock.calls.find(([toolName]) => toolName === "wiki_get_page");
351+ if (!call) throw new Error("wiki_get_page tool not registered");
352+ const [, , , handler] = call;
353+
354+ const mockPageData = {
355+ id: 123,
356+ path: "/Home",
357+ gitItemPath: "/Home.md",
358+ isParentPage: false,
359+ };
360+
361+ mockFetch.mockResolvedValue({
362+ ok: true,
363+ json: async () => mockPageData,
364+ });
365+
366+ const params = {
367+ wikiIdentifier: "wiki1",
368+ project: "proj1",
369+ path: "/Home",
370+ };
371+
372+ const result = await handler(params);
373+
374+ expect(mockFetch).toHaveBeenCalledWith(
375+ "https://dev.azure.com/testorg/proj1/_apis/wiki/wikis/wiki1/pages?path=%2FHome&api-version=7.2-preview.1",
376+ expect.objectContaining({
377+ headers: expect.objectContaining({
378+ "Authorization": "Bearer test-token",
379+ "User-Agent": "Jest",
380+ }),
381+ })
382+ );
383+ expect(result.content[0].text).toBe(JSON.stringify(mockPageData, null, 2));
384+ expect(result.isError).toBeUndefined();
385+ });
386+
387+ it("should handle path without leading slash", async () => {
388+ configureWikiTools(server, tokenProvider, connectionProvider, userAgentProvider);
389+ const call = (server.tool as jest.Mock).mock.calls.find(([toolName]) => toolName === "wiki_get_page");
390+ if (!call) throw new Error("wiki_get_page tool not registered");
391+ const [, , , handler] = call;
392+
393+ const mockPageData = { id: 456, path: "/Documentation" };
394+
395+ mockFetch.mockResolvedValue({
396+ ok: true,
397+ json: async () => mockPageData,
398+ });
399+
400+ const params = {
401+ wikiIdentifier: "wiki1",
402+ project: "proj1",
403+ path: "Documentation",
404+ };
405+
406+ const result = await handler(params);
407+
408+ expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining("path=%2FDocumentation"), expect.any(Object));
409+ expect(result.content[0].text).toContain('"id": 456');
410+ });
411+
412+ it("should include optional parameters when provided", async () => {
413+ configureWikiTools(server, tokenProvider, connectionProvider, userAgentProvider);
414+ const call = (server.tool as jest.Mock).mock.calls.find(([toolName]) => toolName === "wiki_get_page");
415+ if (!call) throw new Error("wiki_get_page tool not registered");
416+ const [, , , handler] = call;
417+
418+ mockFetch.mockResolvedValue({
419+ ok: true,
420+ json: async () => ({ id: 789 }),
421+ });
422+
423+ const params = {
424+ wikiIdentifier: "wiki1",
425+ project: "proj1",
426+ path: "/Home",
427+ recursionLevel: "OneLevel" as const,
428+ };
429+
430+ const result = await handler(params);
431+
432+ const callUrl = mockFetch.mock.calls[0][0];
433+ expect(callUrl).toContain("recursionLevel=OneLevel");
434+ });
435+
436+ it("should handle API errors", async () => {
437+ configureWikiTools(server, tokenProvider, connectionProvider, userAgentProvider);
438+ const call = (server.tool as jest.Mock).mock.calls.find(([toolName]) => toolName === "wiki_get_page");
439+ if (!call) throw new Error("wiki_get_page tool not registered");
440+ const [, , , handler] = call;
441+
442+ mockFetch.mockResolvedValue({
443+ ok: false,
444+ status: 404,
445+ text: async () => "Page not found",
446+ });
447+
448+ const params = {
449+ wikiIdentifier: "wiki1",
450+ project: "proj1",
451+ path: "/NonExistent",
452+ };
453+
454+ const result = await handler(params);
455+
456+ expect(result.isError).toBe(true);
457+ expect(result.content[0].text).toContain("Error fetching wiki page metadata");
458+ expect(result.content[0].text).toContain("Failed to get wiki page (404)");
459+ });
460+
461+ it("should handle fetch errors", async () => {
462+ configureWikiTools(server, tokenProvider, connectionProvider, userAgentProvider);
463+ const call = (server.tool as jest.Mock).mock.calls.find(([toolName]) => toolName === "wiki_get_page");
464+ if (!call) throw new Error("wiki_get_page tool not registered");
465+ const [, , , handler] = call;
466+
467+ mockFetch.mockRejectedValue(new Error("Network error"));
468+
469+ const params = {
470+ wikiIdentifier: "wiki1",
471+ project: "proj1",
472+ path: "/Home",
473+ };
474+
475+ const result = await handler(params);
476+
477+ expect(result.isError).toBe(true);
478+ expect(result.content[0].text).toContain("Error fetching wiki page metadata: Network error");
479+ });
480+ });
481+
339482 describe("get_page_content tool", () => {
340483 it("should call getPageText with the correct parameters and return the expected result", async () => {
341484 configureWikiTools(server, tokenProvider, connectionProvider, userAgentProvider);
@@ -703,7 +846,7 @@ describe("configureWikiTools", () => {
703846
704847 describe("create_or_update_page tool", () => {
705848 let mockFetch: jest.Mock;
706- let mockAccessToken: AccessToken;
849+ // let mockAccessToken: AccessToken;
707850 let mockConnection: { getWikiApi: jest.Mock; serverUrl: string };
708851
709852 beforeEach(() => {
0 commit comments