@tiberriver256/mcp-server-azure-devops
Version:
Azure DevOps reference server for the Model Context Protocol (MCP)
86 lines • 4.41 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const feature_1 = require("./feature");
const errors_1 = require("../../../shared/errors");
const WorkItemTrackingInterfaces_1 = require("azure-devops-node-api/interfaces/WorkItemTrackingInterfaces");
describe('getWorkItemComments unit', () => {
test('should propagate custom errors when thrown internally', async () => {
const mockConnection = {
getWorkItemTrackingApi: jest.fn().mockImplementation(() => {
throw new errors_1.AzureDevOpsError('Custom error');
}),
};
await expect((0, feature_1.getWorkItemComments)(mockConnection, { workItemId: 123 })).rejects.toThrow(errors_1.AzureDevOpsError);
await expect((0, feature_1.getWorkItemComments)(mockConnection, { workItemId: 123 })).rejects.toThrow('Custom error');
});
test('should wrap unexpected errors in a friendly error message', async () => {
const mockConnection = {
getWorkItemTrackingApi: jest.fn().mockImplementation(() => {
throw new Error('Unexpected error');
}),
};
await expect((0, feature_1.getWorkItemComments)(mockConnection, { workItemId: 123 })).rejects.toThrow('Failed to get work item comments: Unexpected error');
});
test('should call getComments with correct parameters when projectId is provided', async () => {
const mockGetComments = jest.fn().mockResolvedValue({ comments: [] });
const mockConnection = {
getWorkItemTrackingApi: jest.fn().mockResolvedValue({
getComments: mockGetComments,
}),
};
await (0, feature_1.getWorkItemComments)(mockConnection, {
workItemId: 123,
projectId: 'myProject',
top: 5,
continuationToken: 'token123',
includeDeleted: true,
expand: 'reactions',
order: 'desc',
});
expect(mockGetComments).toHaveBeenCalledWith('myProject', 123, 5, 'token123', true, WorkItemTrackingInterfaces_1.CommentExpandOptions.Reactions, WorkItemTrackingInterfaces_1.CommentSortOrder.Desc);
});
test('should fetch work item to resolve project when projectId is not provided', async () => {
const mockGetWorkItem = jest.fn().mockResolvedValue({
fields: {
'System.TeamProject': 'resolvedProject',
},
});
const mockGetComments = jest.fn().mockResolvedValue({ comments: [] });
const mockConnection = {
getWorkItemTrackingApi: jest.fn().mockResolvedValue({
getWorkItem: mockGetWorkItem,
getComments: mockGetComments,
}),
};
await (0, feature_1.getWorkItemComments)(mockConnection, {
workItemId: 123,
});
expect(mockGetWorkItem).toHaveBeenCalledWith(123, ['System.TeamProject']);
expect(mockGetComments).toHaveBeenCalledWith('resolvedProject', 123, undefined, undefined, undefined, WorkItemTrackingInterfaces_1.CommentExpandOptions.All, WorkItemTrackingInterfaces_1.CommentSortOrder.Asc);
});
test('should map 404 project resolution errors to resource not found', async () => {
const notFoundError = Object.assign(new Error('Not found'), {
statusCode: 404,
});
const mockConnection = {
getWorkItemTrackingApi: jest.fn().mockResolvedValue({
getWorkItem: jest.fn().mockRejectedValue(notFoundError),
getComments: jest.fn(),
}),
};
await expect((0, feature_1.getWorkItemComments)(mockConnection, { workItemId: 123 })).rejects.toThrow(errors_1.AzureDevOpsResourceNotFoundError);
});
test('should preserve non-404 project resolution errors', async () => {
const forbiddenError = Object.assign(new Error('Forbidden'), {
statusCode: 403,
});
const mockConnection = {
getWorkItemTrackingApi: jest.fn().mockResolvedValue({
getWorkItem: jest.fn().mockRejectedValue(forbiddenError),
getComments: jest.fn(),
}),
};
await expect((0, feature_1.getWorkItemComments)(mockConnection, { workItemId: 123 })).rejects.toThrow('Failed to get work item comments: Forbidden');
});
});
//# sourceMappingURL=feature.spec.unit.js.map