Skip to main content
Glama

Redmine MCP Server

by yonaka15
put.test.ts4.2 kB
import { jest, /*expect,*/ describe, it, beforeEach } from '@jest/globals'; import type { Mock } from 'jest-mock'; import { IssuesClient } from '../../../client/issues.js'; // import { mockResponse, mockErrorResponse } from '../../helpers/mocks.js'; // Unused // import * as fixtures from '../../helpers/fixtures.js'; // Unused // import config from '../../../config.js'; // Unused // import { RedmineApiError } from '../../../client/base.js'; // Unused // import { RedmineIssueUpdate } from '../../../types/index.js'; // Unused // import { parseUrl } from '../../helpers/url.js'; // Unused describe("Issues API (PUT)", () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars let client: IssuesClient; // client is assigned but never used let mockFetch: Mock; // const issueId = fixtures.singleIssueResponse.issue.id; // Unused beforeEach(() => { client = new IssuesClient(); mockFetch = jest.spyOn(global, "fetch") as Mock; mockFetch.mockReset(); }); describe("PUT /issues/:id.json (updateIssue)", () => { // PUT操作のテストは安全のためスキップ it.skip("all PUT operation tests are skipped for safety", () => { // PUT操作のテストは、実際のAPIへの影響を避けるため、通常はモックサーバーを使用するか、 // または特定のテスト環境でのみ実行するように制御します。 // Redmine APIの仕様では、PUTリクエストは成功すると204 No Contentまたは200 OK (内容による) を返します。 // 検証ポイント: // - リクエストボディの正しいフォーマット(更新するフィールドのみを含む) // - project_id: プロジェクトIDの更新 // - tracker_id: トラッカーIDの更新 // - status_id: ステータスIDの更新 // - subject: 題名の更新 // - description: 説明の更新 // - priority_id: 優先度IDの更新 // - assigned_to_id: 担当者IDの更新 // - category_id: カテゴリIDの更新 // - fixed_version_id: 対象バージョンIDの更新 // - notes: 注記の追加 // - private_notes: プライベート注記の追加 // - レスポンスコードの検証 (200 OK or 204 No Content) // - エラーハンドリング(例:バリデーションエラー、存在しないID、権限不足) // // 下記にテストのスケルトンを示します。 }); }); }); // Example of how a test might look if it were enabled: /* import { RedmineIssueUpdate } from '../../../types/index.js'; import { mockResponse, mockErrorResponse } from '../../helpers/mocks.js'; import * as fixtures from '../../helpers/fixtures.js'; import config from '../../../config.js'; import { RedmineApiError } from '../../../client/base.js'; it("updates an issue successfully", async () => { // Arrange const issueIdToUpdate = fixtures.singleIssueResponse.issue.id; const updateData: RedmineIssueUpdate = { subject: "Updated Test Issue Subject", notes: "Adding a note during update." }; // Redmine typically returns 204 No Content or 200 OK on successful PUT mockFetch.mockImplementationOnce(() => Promise.resolve(new Response(null, { status: 204 })) ); // Act await client.updateIssue(issueIdToUpdate, updateData); // Assert expect(mockFetch).toHaveBeenCalledWith( `${config.redmineUrl}/issues/${issueIdToUpdate}.json`, expect.objectContaining({ method: "PUT", headers: expect.objectContaining({ "X-Redmine-API-Key": config.apiKey, "Content-Type": "application/json", }), body: JSON.stringify({ issue: updateData }), }) ); }); it("handles error when updating a non-existent issue", async () => { // Arrange const issueIdToUpdate = 99999; // Non-existent ID const updateData: RedmineIssueUpdate = { subject: "Attempting to update non-existent issue" }; mockFetch.mockImplementationOnce(() => Promise.resolve(mockErrorResponse(404, ["Issue not found"])) ); // Act & Assert await expect(client.updateIssue(issueIdToUpdate, updateData)).rejects.toThrow(RedmineApiError); }); */

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/yonaka15/mcp-server-redmine'

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