Skip to main content
Glama

Redmine MCP Server

by yonaka15
post.test.ts4.1 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 { RedmineIssueCreate } from '../../../types/index.js'; // Unused // import { parseUrl } from '../../helpers/url.js'; // Unused describe("Issues API (POST)", () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars let client: IssuesClient; // client is assigned but never used let mockFetch: Mock; beforeEach(() => { client = new IssuesClient(); mockFetch = jest.spyOn(global, "fetch") as Mock; mockFetch.mockReset(); }); describe("POST /issues.json (createIssue)", () => { // POST操作のテストは安全のためスキップ it.skip("all POST operation tests are skipped for safety", () => { // POST操作のテストはAPIに影響を与えるため、実際の実行は避けるべき。 // もしテストを書く場合は、モックサーバーを使用するか、 // Redmine APIの仕様に基づきPOSTリクエストが201 Createdを返し、 // 作成されたリソースがレスポンスボディに含まれることを確認する。 // - ステータスコード // - ヘッダー内容(例:Locationヘッダーなど) // - ボディの内容(作成されたリソースの詳細) // - 必須フィールドのバリデーションテスト // - エラーハンドリング(例:不正なデータ、権限不足など) // // 以下にテストの雛形を示すが、実行は推奨しない。 // 実際のテストではモックサーバーで挙動を定義し、APIコール結果を確認することが望ましい。 }); }); }); // Example of how a test might look if it were enabled: /* import { RedmineIssueCreate } 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("creates an issue successfully", async () => { // Arrange const issueData: RedmineIssueCreate = { project_id: 1, subject: "New Test Issue", description: "This is a test issue created via API.", tracker_id: 1, // Assuming tracker with ID 1 exists status_id: 1, // Assuming status with ID 1 exists (e.g., "New") priority_id: 2 // Assuming priority with ID 2 exists (e.g., "Normal") }; const expectedResponse = { issue: { ...fixtures.singleIssueResponse.issue, ...issueData, id: 12345 } }; // Mocked response mockFetch.mockImplementationOnce(() => Promise.resolve(mockResponse(expectedResponse, 201)) ); // Act const result = await client.createIssue(issueData); // Assert expect(mockFetch).toHaveBeenCalledWith( `${config.redmineUrl}/issues.json`, expect.objectContaining({ method: "POST", headers: expect.objectContaining({ "X-Redmine-API-Key": config.apiKey, "Content-Type": "application/json", }), body: JSON.stringify({ issue: issueData }), }) ); expect(result).toEqual(expectedResponse); }); it("handles validation error when creating an issue", async () => { // Arrange const issueData: Partial<RedmineIssueCreate> = { // Using Partial to simulate missing required fields subject: "Incomplete Issue" }; // Simulate a 422 Unprocessable Entity response with error messages mockFetch.mockImplementationOnce(() => Promise.resolve(mockErrorResponse(422, ["Project cannot be blank", "Tracker cannot be blank"])) ); // Act & Assert await expect(client.createIssue(issueData as RedmineIssueCreate)).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