@tiberriver256/mcp-server-azure-devops
Version:
Azure DevOps reference server for the Model Context Protocol (MCP)
100 lines • 3.91 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const feature_1 = require("./feature");
const errors_1 = require("../../../shared/errors");
describe('getPipelineTimeline unit', () => {
let mockConnection;
let mockBuildApi;
let mockRestGet;
beforeEach(() => {
jest.resetAllMocks();
mockRestGet = jest.fn();
mockBuildApi = {
rest: { get: mockRestGet },
createRequestOptions: jest
.fn()
.mockReturnValue({ acceptHeader: 'application/json' }),
};
mockConnection = {
serverUrl: 'https://dev.azure.com/testorg',
getBuildApi: jest.fn().mockResolvedValue(mockBuildApi),
};
});
it('retrieves the pipeline timeline with optional timeline id', async () => {
mockRestGet.mockResolvedValue({
statusCode: 200,
result: {
records: [
{ id: '1', state: 'completed', result: 'succeeded' },
{ id: '2', state: 'inProgress', result: 'none' },
],
},
headers: {},
});
const result = await (0, feature_1.getPipelineTimeline)(mockConnection, {
projectId: 'test-project',
runId: 101,
timelineId: 'timeline-1',
});
expect(result).toEqual({
records: [
{ id: '1', state: 'completed', result: 'succeeded' },
{ id: '2', state: 'inProgress', result: 'none' },
],
});
expect(mockRestGet).toHaveBeenCalledTimes(1);
const [requestUrl] = mockRestGet.mock.calls[0];
const url = new URL(requestUrl);
expect(url.pathname).toContain('/build/builds/101/timeline');
expect(url.searchParams.get('timelineId')).toBe('timeline-1');
expect(url.searchParams.get('api-version')).toBe('7.1');
});
it('throws resource not found when API returns 404', async () => {
mockRestGet.mockResolvedValue({
statusCode: 404,
result: null,
headers: {},
});
await expect((0, feature_1.getPipelineTimeline)(mockConnection, {
projectId: 'test-project',
runId: 101,
})).rejects.toBeInstanceOf(errors_1.AzureDevOpsResourceNotFoundError);
});
it('maps authentication errors', async () => {
mockRestGet.mockRejectedValue(new Error('401 Unauthorized'));
await expect((0, feature_1.getPipelineTimeline)(mockConnection, {
projectId: 'test-project',
runId: 101,
})).rejects.toBeInstanceOf(errors_1.AzureDevOpsAuthenticationError);
});
it('wraps unexpected errors', async () => {
mockRestGet.mockRejectedValue(new Error('Boom'));
await expect((0, feature_1.getPipelineTimeline)(mockConnection, {
projectId: 'test-project',
runId: 101,
})).rejects.toBeInstanceOf(errors_1.AzureDevOpsError);
});
it('filters records by state and result when filters provided', async () => {
mockRestGet.mockResolvedValue({
statusCode: 200,
result: {
records: [
{ id: '1', state: 'completed', result: 'succeeded' },
{ id: '2', state: 'completed', result: 'failed' },
{ id: '3', state: 'inProgress', result: 'none' },
],
},
headers: {},
});
const result = await (0, feature_1.getPipelineTimeline)(mockConnection, {
projectId: 'test-project',
runId: 101,
state: ['completed'],
result: 'succeeded',
});
expect(result).toEqual({
records: [{ id: '1', state: 'completed', result: 'succeeded' }],
});
});
});
//# sourceMappingURL=feature.spec.unit.js.map