Skip to main content
Glama

Azure DevOps MCP Server

feature.spec.unit.ts6.5 kB
import { createWikiPage } from './feature'; import { handleRequestError } from '../../../shared/errors/handle-request-error'; // Mock the AzureDevOpsClient jest.mock('../../../shared/api/client'); // Mock the error handler jest.mock('../../../shared/errors/handle-request-error', () => ({ handleRequestError: jest.fn(), })); describe('createWikiPage Feature', () => { let client: any; const mockPut = jest.fn(); const mockHandleRequestError = handleRequestError as jest.MockedFunction< typeof handleRequestError >; const defaultParams = { wikiId: 'test-wiki', content: 'Hello world', pagePath: '/', }; beforeEach(() => { // Reset mocks for each test mockPut.mockReset(); mockHandleRequestError.mockReset(); client = { put: mockPut, defaults: { organizationId: 'defaultOrg', projectId: 'defaultProject', }, }; }); it('should call client.put with correct URL and data for default org and project', async () => { mockPut.mockResolvedValue({ data: { some: 'response' } }); await createWikiPage(defaultParams, client as any); expect(mockPut).toHaveBeenCalledTimes(1); expect(mockPut).toHaveBeenCalledWith( 'defaultOrg/defaultProject/_apis/wiki/wikis/test-wiki/pages?path=%2F&api-version=7.1-preview.1', { content: 'Hello world' }, ); }); it('should call client.put with correct URL when projectId is explicitly provided', async () => { mockPut.mockResolvedValue({ data: { some: 'response' } }); const paramsWithProject = { ...defaultParams, projectId: 'customProject', }; await createWikiPage(paramsWithProject, client as any); expect(mockPut).toHaveBeenCalledWith( 'defaultOrg/customProject/_apis/wiki/wikis/test-wiki/pages?path=%2F&api-version=7.1-preview.1', { content: 'Hello world' }, ); }); it('should call client.put with correct URL when organizationId is explicitly provided', async () => { mockPut.mockResolvedValue({ data: { some: 'response' } }); const paramsWithOrg = { ...defaultParams, organizationId: 'customOrg', }; await createWikiPage(paramsWithOrg, client as any); expect(mockPut).toHaveBeenCalledWith( 'customOrg/defaultProject/_apis/wiki/wikis/test-wiki/pages?path=%2F&api-version=7.1-preview.1', { content: 'Hello world' }, ); }); it('should call client.put with correct URL when projectId is null (project-level wiki)', async () => { mockPut.mockResolvedValue({ data: { some: 'response' } }); const paramsWithNullProject = { ...defaultParams, projectId: null, // Explicitly null for project-level resources that don't need a project }; // Client default for projectId should also be null or undefined in this scenario const clientWithoutProject = { put: mockPut, defaults: { organizationId: 'defaultOrg', projectId: undefined, }, }; await createWikiPage(paramsWithNullProject, clientWithoutProject as any); expect(mockPut).toHaveBeenCalledWith( 'defaultOrg/_apis/wiki/wikis/test-wiki/pages?path=%2F&api-version=7.1-preview.1', { content: 'Hello world' }, ); }); it('should correctly encode pagePath in the URL', async () => { mockPut.mockResolvedValue({ data: { some: 'response' } }); const paramsWithPath = { ...defaultParams, pagePath: '/My Test Page/Sub Page', }; await createWikiPage(paramsWithPath, client as any); expect(mockPut).toHaveBeenCalledWith( 'defaultOrg/defaultProject/_apis/wiki/wikis/test-wiki/pages?path=%2FMy%20Test%20Page%2FSub%20Page&api-version=7.1-preview.1', { content: 'Hello world' }, ); }); it('should use default pagePath "/" if pagePath is null', async () => { mockPut.mockResolvedValue({ data: { some: 'response' } }); const paramsWithPath = { ...defaultParams, pagePath: null, // Explicitly null }; await createWikiPage(paramsWithPath, client as any); expect(mockPut).toHaveBeenCalledWith( 'defaultOrg/defaultProject/_apis/wiki/wikis/test-wiki/pages?path=%2F&api-version=7.1-preview.1', { content: 'Hello world' }, ); }); it('should include comment in request body when provided', async () => { mockPut.mockResolvedValue({ data: { some: 'response' } }); const paramsWithComment = { ...defaultParams, comment: 'Initial page creation', }; await createWikiPage(paramsWithComment, client as any); expect(mockPut).toHaveBeenCalledWith( 'defaultOrg/defaultProject/_apis/wiki/wikis/test-wiki/pages?path=%2F&api-version=7.1-preview.1', { content: 'Hello world', comment: 'Initial page creation' }, ); }); it('should return the data from the response on success', async () => { const expectedResponse = { id: '123', path: '/', content: 'Hello world' }; mockPut.mockResolvedValue({ data: expectedResponse }); const result = await createWikiPage(defaultParams, client as any); expect(result).toEqual(expectedResponse); }); // Skip this test for now as it requires complex mocking of environment variables it.skip('should throw if organizationId is not provided and not set in defaults', async () => { const clientWithoutOrg = { put: mockPut, defaults: { projectId: 'defaultProject', organizationId: undefined, }, }; const paramsNoOrg = { ...defaultParams, organizationId: null, // Explicitly null and no default }; // This test is skipped because it requires complex mocking of environment variables // which is difficult to do in the current test setup await expect( createWikiPage(paramsNoOrg, clientWithoutOrg as any), ).rejects.toThrow( 'Organization ID is not defined. Please provide it or set a default.', ); expect(mockPut).not.toHaveBeenCalled(); }); it('should call handleRequestError if client.put throws an error', async () => { const error = new Error('API Error'); mockPut.mockRejectedValue(error); mockHandleRequestError.mockImplementation(() => { throw new Error('Handled Error'); }); await expect(createWikiPage(defaultParams, client as any)).rejects.toThrow( 'Handled Error', ); expect(mockHandleRequestError).toHaveBeenCalledTimes(1); expect(mockHandleRequestError).toHaveBeenCalledWith( error, 'Failed to create or update wiki page', ); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Tiberriver256/mcp-server-azure-devops'

If you have feedback or need assistance with the MCP directory API, please join our Discord server