@dpesch/mantisbt-mcp-server 1.10.2 → 1.10.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/README.de.md +2 -1
- package/README.md +2 -1
- package/dist/client.js +0 -15
- package/dist/tools/files.js +14 -15
- package/docs/cookbook.de.md +1 -1
- package/docs/cookbook.md +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/.gitea/PULL_REQUEST_TEMPLATE.md +0 -17
- package/.gitea/workflows/ci.yml +0 -95
- package/.github/workflows/ci.yml +0 -32
- package/scripts/hooks/pre-push.mjs +0 -220
- package/scripts/init.mjs +0 -95
- package/scripts/record-fixtures.ts +0 -160
- package/tests/cache.test.ts +0 -265
- package/tests/client.test.ts +0 -372
- package/tests/config.test.ts +0 -263
- package/tests/fixtures/get_current_user.json +0 -40
- package/tests/fixtures/get_issue.json +0 -133
- package/tests/fixtures/get_issue_enums.json +0 -67
- package/tests/fixtures/get_issue_fields_sample.json +0 -76
- package/tests/fixtures/get_project_categories.json +0 -157
- package/tests/fixtures/get_project_versions.json +0 -3
- package/tests/fixtures/get_project_versions_with_data.json +0 -52
- package/tests/fixtures/list_issues.json +0 -95
- package/tests/fixtures/list_projects.json +0 -65
- package/tests/helpers/mock-server.ts +0 -166
- package/tests/helpers/search-mocks.ts +0 -84
- package/tests/prompts/prompts.test.ts +0 -242
- package/tests/resources/resources.test.ts +0 -309
- package/tests/search/embedder.test.ts +0 -81
- package/tests/search/highlight.test.ts +0 -129
- package/tests/search/store.test.ts +0 -193
- package/tests/search/sync.test.ts +0 -249
- package/tests/search/tools.test.ts +0 -661
- package/tests/tools/config.test.ts +0 -212
- package/tests/tools/files.test.ts +0 -344
- package/tests/tools/issues.test.ts +0 -1180
- package/tests/tools/metadata.test.ts +0 -509
- package/tests/tools/monitors.test.ts +0 -101
- package/tests/tools/projects.test.ts +0 -338
- package/tests/tools/relationships.test.ts +0 -177
- package/tests/tools/string-coercion.test.ts +0 -317
- package/tests/tools/users.test.ts +0 -62
- package/tests/utils/date-filter.test.ts +0 -169
- package/tests/version-hint.test.ts +0 -230
- package/tsconfig.build.json +0 -8
- package/vitest.config.ts +0 -8
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { parseVersion, compareVersions, VersionHintService } from '../src/version-hint.js';
|
|
3
|
-
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
// parseVersion
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
|
|
8
|
-
describe('parseVersion()', () => {
|
|
9
|
-
it('parses a standard version string', () => {
|
|
10
|
-
expect(parseVersion('2.25.7')).toEqual([2, 25, 7]);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('strips leading v prefix', () => {
|
|
14
|
-
expect(parseVersion('v1.2.3')).toEqual([1, 2, 3]);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('returns null for invalid strings', () => {
|
|
18
|
-
expect(parseVersion('not-a-version')).toBeNull();
|
|
19
|
-
expect(parseVersion('')).toBeNull();
|
|
20
|
-
expect(parseVersion('1.2')).toBeNull();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('ignores extra suffix after patch number', () => {
|
|
24
|
-
expect(parseVersion('2.25.7-beta')).toEqual([2, 25, 7]);
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
// compareVersions
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
|
-
|
|
32
|
-
describe('compareVersions()', () => {
|
|
33
|
-
it('returns 0 for equal versions', () => {
|
|
34
|
-
expect(compareVersions([2, 25, 7], [2, 25, 7])).toBe(0);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('returns -1 when first version is older (major)', () => {
|
|
38
|
-
expect(compareVersions([1, 0, 0], [2, 0, 0])).toBe(-1);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('returns 1 when first version is newer (major)', () => {
|
|
42
|
-
expect(compareVersions([3, 0, 0], [2, 99, 99])).toBe(1);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('compares minor version correctly', () => {
|
|
46
|
-
expect(compareVersions([2, 24, 0], [2, 25, 0])).toBe(-1);
|
|
47
|
-
expect(compareVersions([2, 26, 0], [2, 25, 0])).toBe(1);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('compares patch version correctly', () => {
|
|
51
|
-
expect(compareVersions([2, 25, 6], [2, 25, 7])).toBe(-1);
|
|
52
|
-
expect(compareVersions([2, 25, 8], [2, 25, 7])).toBe(1);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
// VersionHintService – getUpdateHint()
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
|
|
60
|
-
describe('VersionHintService – getUpdateHint()', () => {
|
|
61
|
-
it('returns null when installedVersion is not set', () => {
|
|
62
|
-
const svc = new VersionHintService();
|
|
63
|
-
expect(svc.getUpdateHint()).toBeNull();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('returns null when latestVersion is not set', () => {
|
|
67
|
-
const svc = new VersionHintService();
|
|
68
|
-
// Simulate installed version via onSuccessfulResponse
|
|
69
|
-
const mockResponse = {
|
|
70
|
-
headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.6' : null },
|
|
71
|
-
} as unknown as Response;
|
|
72
|
-
svc.onSuccessfulResponse(mockResponse);
|
|
73
|
-
expect(svc.getUpdateHint()).toBeNull();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('returns hint string when latestVersion > installedVersion', async () => {
|
|
77
|
-
const fetchMock = vi.fn().mockResolvedValue({
|
|
78
|
-
ok: true,
|
|
79
|
-
json: () => Promise.resolve([{ name: 'release-2.25.7' }]),
|
|
80
|
-
});
|
|
81
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
82
|
-
|
|
83
|
-
const svc = new VersionHintService();
|
|
84
|
-
|
|
85
|
-
const mockResponse = {
|
|
86
|
-
headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.6' : null },
|
|
87
|
-
} as unknown as Response;
|
|
88
|
-
svc.onSuccessfulResponse(mockResponse);
|
|
89
|
-
|
|
90
|
-
// Trigger fetch and wait for it to complete
|
|
91
|
-
svc.triggerLatestVersionFetch();
|
|
92
|
-
await svc.waitForLatestVersion(1000);
|
|
93
|
-
|
|
94
|
-
const hint = svc.getUpdateHint();
|
|
95
|
-
expect(hint).not.toBeNull();
|
|
96
|
-
expect(hint).toContain('2.25.7');
|
|
97
|
-
expect(hint).toContain('2.25.6');
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('returns null when installed version equals latest version', async () => {
|
|
101
|
-
const fetchMock = vi.fn().mockResolvedValue({
|
|
102
|
-
ok: true,
|
|
103
|
-
json: () => Promise.resolve([{ name: 'release-2.25.7' }]),
|
|
104
|
-
});
|
|
105
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
106
|
-
|
|
107
|
-
const svc = new VersionHintService();
|
|
108
|
-
|
|
109
|
-
const mockResponse = {
|
|
110
|
-
headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
|
|
111
|
-
} as unknown as Response;
|
|
112
|
-
svc.onSuccessfulResponse(mockResponse);
|
|
113
|
-
|
|
114
|
-
svc.triggerLatestVersionFetch();
|
|
115
|
-
await svc.waitForLatestVersion(1000);
|
|
116
|
-
|
|
117
|
-
expect(svc.getUpdateHint()).toBeNull();
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('returns null when installedVersion is newer than latestVersion', async () => {
|
|
121
|
-
const fetchMock = vi.fn().mockResolvedValue({
|
|
122
|
-
ok: true,
|
|
123
|
-
json: () => Promise.resolve([{ name: 'release-2.25.6' }]),
|
|
124
|
-
});
|
|
125
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
126
|
-
|
|
127
|
-
const svc = new VersionHintService();
|
|
128
|
-
|
|
129
|
-
const mockResponse = {
|
|
130
|
-
headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
|
|
131
|
-
} as unknown as Response;
|
|
132
|
-
svc.onSuccessfulResponse(mockResponse);
|
|
133
|
-
|
|
134
|
-
svc.triggerLatestVersionFetch();
|
|
135
|
-
await svc.waitForLatestVersion(1000);
|
|
136
|
-
|
|
137
|
-
expect(svc.getUpdateHint()).toBeNull();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// ---------------------------------------------------------------------------
|
|
142
|
-
// VersionHintService – onSuccessfulResponse()
|
|
143
|
-
// ---------------------------------------------------------------------------
|
|
144
|
-
|
|
145
|
-
describe('VersionHintService – onSuccessfulResponse()', () => {
|
|
146
|
-
it('extracts X-Mantis-Version header from response', () => {
|
|
147
|
-
const svc = new VersionHintService();
|
|
148
|
-
const mockResponse = {
|
|
149
|
-
headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
|
|
150
|
-
} as unknown as Response;
|
|
151
|
-
|
|
152
|
-
svc.onSuccessfulResponse(mockResponse);
|
|
153
|
-
expect(svc.getInstalledVersion()).toBe('2.25.7');
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it('does not overwrite already set installedVersion', () => {
|
|
157
|
-
const svc = new VersionHintService();
|
|
158
|
-
|
|
159
|
-
const first = {
|
|
160
|
-
headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.6' : null },
|
|
161
|
-
} as unknown as Response;
|
|
162
|
-
const second = {
|
|
163
|
-
headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
|
|
164
|
-
} as unknown as Response;
|
|
165
|
-
|
|
166
|
-
svc.onSuccessfulResponse(first);
|
|
167
|
-
svc.onSuccessfulResponse(second);
|
|
168
|
-
|
|
169
|
-
expect(svc.getInstalledVersion()).toBe('2.25.6');
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it('ignores response without X-Mantis-Version header', () => {
|
|
173
|
-
const svc = new VersionHintService();
|
|
174
|
-
const mockResponse = {
|
|
175
|
-
headers: { get: (_key: string) => null },
|
|
176
|
-
} as unknown as Response;
|
|
177
|
-
|
|
178
|
-
svc.onSuccessfulResponse(mockResponse);
|
|
179
|
-
expect(svc.getInstalledVersion()).toBeNull();
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
// ---------------------------------------------------------------------------
|
|
184
|
-
// VersionHintService – triggerLatestVersionFetch()
|
|
185
|
-
// ---------------------------------------------------------------------------
|
|
186
|
-
|
|
187
|
-
describe('VersionHintService – triggerLatestVersionFetch()', () => {
|
|
188
|
-
beforeEach(() => {
|
|
189
|
-
vi.unstubAllGlobals();
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it('only triggers fetch once even when called multiple times', async () => {
|
|
193
|
-
const fetchMock = vi.fn().mockResolvedValue({
|
|
194
|
-
ok: true,
|
|
195
|
-
json: () => Promise.resolve([{ name: 'release-2.25.7' }]),
|
|
196
|
-
});
|
|
197
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
198
|
-
|
|
199
|
-
const svc = new VersionHintService();
|
|
200
|
-
svc.triggerLatestVersionFetch();
|
|
201
|
-
svc.triggerLatestVersionFetch();
|
|
202
|
-
svc.triggerLatestVersionFetch();
|
|
203
|
-
await svc.waitForLatestVersion(1000);
|
|
204
|
-
|
|
205
|
-
expect(fetchMock).toHaveBeenCalledOnce();
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it('handles GitHub API errors gracefully (no crash, latestVersion stays null)', async () => {
|
|
209
|
-
const fetchMock = vi.fn().mockResolvedValue({ ok: false });
|
|
210
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
211
|
-
|
|
212
|
-
const svc = new VersionHintService();
|
|
213
|
-
svc.triggerLatestVersionFetch();
|
|
214
|
-
await svc.waitForLatestVersion(500);
|
|
215
|
-
|
|
216
|
-
expect(svc.getLatestVersion()).toBeNull();
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it('handles fetch network errors gracefully', async () => {
|
|
220
|
-
const fetchMock = vi.fn().mockRejectedValue(new Error('Network error'));
|
|
221
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
222
|
-
|
|
223
|
-
const svc = new VersionHintService();
|
|
224
|
-
svc.triggerLatestVersionFetch();
|
|
225
|
-
// Give async fire-and-forget time to complete
|
|
226
|
-
await new Promise(r => setTimeout(r, 100));
|
|
227
|
-
|
|
228
|
-
expect(svc.getLatestVersion()).toBeNull();
|
|
229
|
-
});
|
|
230
|
-
});
|
package/tsconfig.build.json
DELETED