@tiberriver256/mcp-server-azure-devops
Version:
Azure DevOps reference server for the Model Context Protocol (MCP)
137 lines • 5.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const feature_1 = require("./feature");
const errors_1 = require("../../../shared/errors");
describe('manageWorkItemLink', () => {
let mockConnection;
let mockWitApi;
const projectId = 'test-project';
const sourceWorkItemId = 123;
const targetWorkItemId = 456;
const relationType = 'System.LinkTypes.Related';
const newRelationType = 'System.LinkTypes.Hierarchy-Forward';
const comment = 'Test link comment';
beforeEach(() => {
mockWitApi = {
updateWorkItem: jest.fn(),
};
mockConnection = {
getWorkItemTrackingApi: jest.fn().mockResolvedValue(mockWitApi),
serverUrl: 'https://dev.azure.com/test-org',
};
});
test('should add a work item link', async () => {
// Setup
const updatedWorkItem = {
id: sourceWorkItemId,
fields: { 'System.Title': 'Test' },
};
mockWitApi.updateWorkItem.mockResolvedValue(updatedWorkItem);
// Execute
const result = await (0, feature_1.manageWorkItemLink)(mockConnection, projectId, {
sourceWorkItemId,
targetWorkItemId,
operation: 'add',
relationType,
comment,
});
// Verify
expect(mockConnection.getWorkItemTrackingApi).toHaveBeenCalled();
expect(mockWitApi.updateWorkItem).toHaveBeenCalledWith({}, // customHeaders
[
{
op: 'add',
path: '/relations/-',
value: {
rel: relationType,
url: `${mockConnection.serverUrl}/_apis/wit/workItems/${targetWorkItemId}`,
attributes: { comment },
},
},
], sourceWorkItemId, projectId);
expect(result).toEqual(updatedWorkItem);
});
test('should remove a work item link', async () => {
// Setup
const updatedWorkItem = {
id: sourceWorkItemId,
fields: { 'System.Title': 'Test' },
};
mockWitApi.updateWorkItem.mockResolvedValue(updatedWorkItem);
// Execute
const result = await (0, feature_1.manageWorkItemLink)(mockConnection, projectId, {
sourceWorkItemId,
targetWorkItemId,
operation: 'remove',
relationType,
});
// Verify
expect(mockConnection.getWorkItemTrackingApi).toHaveBeenCalled();
expect(mockWitApi.updateWorkItem).toHaveBeenCalledWith({}, // customHeaders
[
{
op: 'remove',
path: `/relations/+[rel=${relationType};url=${mockConnection.serverUrl}/_apis/wit/workItems/${targetWorkItemId}]`,
},
], sourceWorkItemId, projectId);
expect(result).toEqual(updatedWorkItem);
});
test('should update a work item link', async () => {
// Setup
const updatedWorkItem = {
id: sourceWorkItemId,
fields: { 'System.Title': 'Test' },
};
mockWitApi.updateWorkItem.mockResolvedValue(updatedWorkItem);
// Execute
const result = await (0, feature_1.manageWorkItemLink)(mockConnection, projectId, {
sourceWorkItemId,
targetWorkItemId,
operation: 'update',
relationType,
newRelationType,
comment,
});
// Verify
expect(mockConnection.getWorkItemTrackingApi).toHaveBeenCalled();
expect(mockWitApi.updateWorkItem).toHaveBeenCalledWith({}, // customHeaders
[
{
op: 'remove',
path: `/relations/+[rel=${relationType};url=${mockConnection.serverUrl}/_apis/wit/workItems/${targetWorkItemId}]`,
},
{
op: 'add',
path: '/relations/-',
value: {
rel: newRelationType,
url: `${mockConnection.serverUrl}/_apis/wit/workItems/${targetWorkItemId}`,
attributes: { comment },
},
},
], sourceWorkItemId, projectId);
expect(result).toEqual(updatedWorkItem);
});
test('should throw error when work item not found', async () => {
// Setup
mockWitApi.updateWorkItem.mockResolvedValue(null);
// Execute and verify
await expect((0, feature_1.manageWorkItemLink)(mockConnection, projectId, {
sourceWorkItemId,
targetWorkItemId,
operation: 'add',
relationType,
})).rejects.toThrow(errors_1.AzureDevOpsResourceNotFoundError);
});
test('should throw error when update operation missing newRelationType', async () => {
// Execute and verify
await expect((0, feature_1.manageWorkItemLink)(mockConnection, projectId, {
sourceWorkItemId,
targetWorkItemId,
operation: 'update',
relationType,
// newRelationType is missing
})).rejects.toThrow('New relation type is required for update operation');
});
});
//# sourceMappingURL=feature.spec.unit.js.map