swagger-parser-mcp-server 2.3.3 → 3.0.0

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.
Files changed (127) hide show
  1. package/README.md +81 -120
  2. package/dist/index.d.ts +0 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +266 -102
  5. package/dist/index.js.map +1 -1
  6. package/dist/schemas.d.ts +2 -283
  7. package/dist/schemas.d.ts.map +1 -1
  8. package/dist/schemas.js +0 -108
  9. package/dist/schemas.js.map +1 -1
  10. package/dist/utils/swaggerCache.d.ts +0 -4
  11. package/dist/utils/swaggerCache.d.ts.map +1 -1
  12. package/dist/utils/swaggerCache.js +0 -8
  13. package/dist/utils/swaggerCache.js.map +1 -1
  14. package/package.json +3 -11
  15. package/dist/application/snapshot/createSnapshotRuntime.d.ts +0 -2
  16. package/dist/application/snapshot/createSnapshotRuntime.d.ts.map +0 -1
  17. package/dist/application/snapshot/createSnapshotRuntime.js +0 -2
  18. package/dist/application/snapshot/createSnapshotRuntime.js.map +0 -1
  19. package/dist/application/snapshot/snapshotCaptureService.d.ts +0 -90
  20. package/dist/application/snapshot/snapshotCaptureService.d.ts.map +0 -1
  21. package/dist/application/snapshot/snapshotCaptureService.js +0 -394
  22. package/dist/application/snapshot/snapshotCaptureService.js.map +0 -1
  23. package/dist/application/snapshot/snapshotRepository.d.ts +0 -77
  24. package/dist/application/snapshot/snapshotRepository.d.ts.map +0 -1
  25. package/dist/application/snapshot/snapshotRepository.js +0 -2
  26. package/dist/application/snapshot/snapshotRepository.js.map +0 -1
  27. package/dist/domain/canonical/canonicalSnapshot.d.ts +0 -61
  28. package/dist/domain/canonical/canonicalSnapshot.d.ts.map +0 -1
  29. package/dist/domain/canonical/canonicalSnapshot.js +0 -300
  30. package/dist/domain/canonical/canonicalSnapshot.js.map +0 -1
  31. package/dist/domain/contracts/runtimeEnvironmentContract.d.ts +0 -21
  32. package/dist/domain/contracts/runtimeEnvironmentContract.d.ts.map +0 -1
  33. package/dist/domain/contracts/runtimeEnvironmentContract.js +0 -50
  34. package/dist/domain/contracts/runtimeEnvironmentContract.js.map +0 -1
  35. package/dist/domain/contracts/snapshotDiffContract.d.ts +0 -270
  36. package/dist/domain/contracts/snapshotDiffContract.d.ts.map +0 -1
  37. package/dist/domain/contracts/snapshotDiffContract.js +0 -99
  38. package/dist/domain/contracts/snapshotDiffContract.js.map +0 -1
  39. package/dist/domain/diff/endpointDiffClassifier.d.ts +0 -78
  40. package/dist/domain/diff/endpointDiffClassifier.d.ts.map +0 -1
  41. package/dist/domain/diff/endpointDiffClassifier.js +0 -317
  42. package/dist/domain/diff/endpointDiffClassifier.js.map +0 -1
  43. package/dist/http.d.ts +0 -3
  44. package/dist/http.d.ts.map +0 -1
  45. package/dist/http.js +0 -52
  46. package/dist/http.js.map +0 -1
  47. package/dist/infrastructure/postgres/migrationRunner.d.ts +0 -14
  48. package/dist/infrastructure/postgres/migrationRunner.d.ts.map +0 -1
  49. package/dist/infrastructure/postgres/migrationRunner.js +0 -161
  50. package/dist/infrastructure/postgres/migrationRunner.js.map +0 -1
  51. package/dist/infrastructure/postgres/migrations/001_snapshot_schema.sql +0 -29
  52. package/dist/infrastructure/postgres/migrations/002_snapshot_change_history.sql +0 -32
  53. package/dist/infrastructure/postgres/postgresSnapshotRepository.d.ts +0 -25
  54. package/dist/infrastructure/postgres/postgresSnapshotRepository.d.ts.map +0 -1
  55. package/dist/infrastructure/postgres/postgresSnapshotRepository.js +0 -323
  56. package/dist/infrastructure/postgres/postgresSnapshotRepository.js.map +0 -1
  57. package/dist/infrastructure/postgres/runMigrations.d.ts +0 -3
  58. package/dist/infrastructure/postgres/runMigrations.d.ts.map +0 -1
  59. package/dist/infrastructure/postgres/runMigrations.js +0 -33
  60. package/dist/infrastructure/postgres/runMigrations.js.map +0 -1
  61. package/dist/infrastructure/runtime/createSnapshotRuntime.d.ts +0 -17
  62. package/dist/infrastructure/runtime/createSnapshotRuntime.d.ts.map +0 -1
  63. package/dist/infrastructure/runtime/createSnapshotRuntime.js +0 -38
  64. package/dist/infrastructure/runtime/createSnapshotRuntime.js.map +0 -1
  65. package/dist/tests/canonicalSnapshot.test.d.ts +0 -2
  66. package/dist/tests/canonicalSnapshot.test.d.ts.map +0 -1
  67. package/dist/tests/canonicalSnapshot.test.js +0 -425
  68. package/dist/tests/canonicalSnapshot.test.js.map +0 -1
  69. package/dist/tests/endpointDiffClassifier.test.d.ts +0 -2
  70. package/dist/tests/endpointDiffClassifier.test.d.ts.map +0 -1
  71. package/dist/tests/endpointDiffClassifier.test.js +0 -633
  72. package/dist/tests/endpointDiffClassifier.test.js.map +0 -1
  73. package/dist/tests/httpSnapshotTransport.test.d.ts +0 -2
  74. package/dist/tests/httpSnapshotTransport.test.d.ts.map +0 -1
  75. package/dist/tests/httpSnapshotTransport.test.js +0 -356
  76. package/dist/tests/httpSnapshotTransport.test.js.map +0 -1
  77. package/dist/tests/indexLifecycle.test.d.ts +0 -2
  78. package/dist/tests/indexLifecycle.test.d.ts.map +0 -1
  79. package/dist/tests/indexLifecycle.test.js +0 -44
  80. package/dist/tests/indexLifecycle.test.js.map +0 -1
  81. package/dist/tests/mcpSnapshotTools.test.d.ts +0 -2
  82. package/dist/tests/mcpSnapshotTools.test.d.ts.map +0 -1
  83. package/dist/tests/mcpSnapshotTools.test.js +0 -316
  84. package/dist/tests/mcpSnapshotTools.test.js.map +0 -1
  85. package/dist/tests/postgresMigrationSmoke.test.d.ts +0 -2
  86. package/dist/tests/postgresMigrationSmoke.test.d.ts.map +0 -1
  87. package/dist/tests/postgresMigrationSmoke.test.js +0 -187
  88. package/dist/tests/postgresMigrationSmoke.test.js.map +0 -1
  89. package/dist/tests/realPostgresTestSchema.d.ts +0 -10
  90. package/dist/tests/realPostgresTestSchema.d.ts.map +0 -1
  91. package/dist/tests/realPostgresTestSchema.js +0 -73
  92. package/dist/tests/realPostgresTestSchema.js.map +0 -1
  93. package/dist/tests/snapshotCapturePipeline.test.d.ts +0 -2
  94. package/dist/tests/snapshotCapturePipeline.test.d.ts.map +0 -1
  95. package/dist/tests/snapshotCapturePipeline.test.js +0 -475
  96. package/dist/tests/snapshotCapturePipeline.test.js.map +0 -1
  97. package/dist/tests/snapshotDiffContract.test.d.ts +0 -2
  98. package/dist/tests/snapshotDiffContract.test.d.ts.map +0 -1
  99. package/dist/tests/snapshotDiffContract.test.js +0 -156
  100. package/dist/tests/snapshotDiffContract.test.js.map +0 -1
  101. package/dist/tests/snapshotPersistence.real.test.d.ts +0 -2
  102. package/dist/tests/snapshotPersistence.real.test.d.ts.map +0 -1
  103. package/dist/tests/snapshotPersistence.real.test.js +0 -310
  104. package/dist/tests/snapshotPersistence.real.test.js.map +0 -1
  105. package/dist/tests/webServerRuntime.test.d.ts +0 -2
  106. package/dist/tests/webServerRuntime.test.d.ts.map +0 -1
  107. package/dist/tests/webServerRuntime.test.js +0 -123
  108. package/dist/tests/webServerRuntime.test.js.map +0 -1
  109. package/dist/transport/createSnapshotToolRuntime.d.ts +0 -7
  110. package/dist/transport/createSnapshotToolRuntime.d.ts.map +0 -1
  111. package/dist/transport/createSnapshotToolRuntime.js +0 -40
  112. package/dist/transport/createSnapshotToolRuntime.js.map +0 -1
  113. package/dist/transport/httpSnapshotServer.d.ts +0 -11
  114. package/dist/transport/httpSnapshotServer.d.ts.map +0 -1
  115. package/dist/transport/httpSnapshotServer.js +0 -216
  116. package/dist/transport/httpSnapshotServer.js.map +0 -1
  117. package/dist/transport/mcpToolRouter.d.ts +0 -81
  118. package/dist/transport/mcpToolRouter.d.ts.map +0 -1
  119. package/dist/transport/mcpToolRouter.js +0 -416
  120. package/dist/transport/mcpToolRouter.js.map +0 -1
  121. package/dist/transport/webServerRuntime.d.ts +0 -17
  122. package/dist/transport/webServerRuntime.d.ts.map +0 -1
  123. package/dist/transport/webServerRuntime.js +0 -73
  124. package/dist/transport/webServerRuntime.js.map +0 -1
  125. package/dist/web/dashboard.css +0 -411
  126. package/dist/web/dashboard.html +0 -141
  127. package/dist/web/dashboard.js +0 -540
@@ -1,316 +0,0 @@
1
- import { createMcpToolRouter } from '../transport/mcpToolRouter.js';
2
- import { snapshotDiffResultSchema } from '../domain/contracts/snapshotDiffContract.js';
3
- import { endpointDiffDetailOutputSchema, listEndpointChangeHistoryResultSchema, listSnapshotsResultSchema, } from '../schemas.js';
4
- import { SchemaResolver } from '../utils/schemaResolver.js';
5
- const fixedNow = '2026-03-09T09:00:00.000Z';
6
- const environment = {
7
- DATABASE_URL: 'postgresql://localhost:5432/test',
8
- PROJECT_KEY: 'frontend-diff',
9
- SWAGGER_URL: 'https://api.example.com/openapi.json',
10
- };
11
- const bootstrapResult = {
12
- environment,
13
- project: { id: 'project-1', projectKey: 'frontend-diff', createdAt: fixedNow },
14
- source: {
15
- id: 'source-1',
16
- projectId: 'project-1',
17
- swaggerUrl: 'https://api.example.com/openapi.json',
18
- createdAt: fixedNow,
19
- },
20
- };
21
- const diffResult = snapshotDiffResultSchema.parse({
22
- summary: {
23
- projectKey: 'frontend-diff',
24
- sourceUrl: 'https://api.example.com/openapi.json',
25
- baselineSnapshotId: 'snapshot-1',
26
- targetSnapshotId: 'snapshot-2',
27
- comparedAt: fixedNow,
28
- hasChanges: true,
29
- isNoopCapture: false,
30
- },
31
- counts: {
32
- total: 1,
33
- breaking: 1,
34
- nonBreaking: 0,
35
- info: 0,
36
- },
37
- changes: [
38
- {
39
- url: '/users',
40
- method: 'get',
41
- classification: 'breaking',
42
- changeReason: 'response_status_removed',
43
- },
44
- ],
45
- warnings: [],
46
- });
47
- const endpointDetailResult = {
48
- baselineSnapshotId: 'snapshot-1',
49
- targetSnapshotId: 'snapshot-2',
50
- path: '/users',
51
- method: 'get',
52
- hasChange: true,
53
- classification: 'breaking',
54
- changeReason: 'response_status_removed',
55
- details: [
56
- {
57
- reason: 'response_status_removed',
58
- classification: 'breaking',
59
- message: 'Response status code removed: 200',
60
- metadata: {
61
- removedStatusCodes: ['200'],
62
- },
63
- },
64
- ],
65
- before: { parameters: [], responses: [{ statusCode: '200', content: [] }] },
66
- after: { parameters: [], responses: [] },
67
- };
68
- const snapshotItems = [
69
- {
70
- id: 'snapshot-2',
71
- sourceId: 'source-1',
72
- specHash: 'spec-hash-2',
73
- documentFingerprint: 'doc-fingerprint-2',
74
- capturedAt: fixedNow,
75
- },
76
- ];
77
- const historyEvents = [
78
- {
79
- baselineSnapshotId: 'snapshot-1',
80
- targetSnapshotId: 'snapshot-2',
81
- path: '/users',
82
- method: 'get',
83
- classification: 'breaking',
84
- changeReason: 'response_status_removed',
85
- changedAt: fixedNow,
86
- },
87
- ];
88
- function parseToolPayload(response) {
89
- return JSON.parse(response.content[0].text);
90
- }
91
- function createMockService() {
92
- return {
93
- capture: jest.fn().mockResolvedValue({
94
- ...bootstrapResult,
95
- specHash: 'spec-hash-2',
96
- snapshot: {
97
- id: 'snapshot-2',
98
- sourceId: 'source-1',
99
- specHash: 'spec-hash-2',
100
- documentFingerprint: 'doc-fingerprint-2',
101
- canonicalSnapshot: {
102
- sourceUrl: 'https://api.example.com/openapi.json',
103
- documentFingerprint: 'doc-fingerprint-2',
104
- endpoints: [],
105
- versionSignal: {
106
- infoVersion: '1.0.0',
107
- normalizedInfoVersion: '1',
108
- urlVersionHints: ['1'],
109
- hasVersionMismatch: false,
110
- },
111
- },
112
- capturedAt: fixedNow,
113
- },
114
- previousSnapshot: null,
115
- isNoopCapture: false,
116
- diffResult,
117
- }),
118
- bootstrap: jest.fn().mockResolvedValue(bootstrapResult),
119
- listSnapshotsBySource: jest.fn().mockResolvedValue(snapshotItems),
120
- listEndpointChangeHistory: jest.fn().mockResolvedValue(historyEvents),
121
- replayDiff: jest.fn().mockResolvedValue(diffResult),
122
- getEndpointDiffDetail: jest.fn().mockResolvedValue(endpointDetailResult),
123
- };
124
- }
125
- function createLegacySwagger() {
126
- return {
127
- openapi: '3.0.0',
128
- info: { title: 'Legacy API', version: '1.0.0' },
129
- paths: {
130
- '/users': {
131
- get: {
132
- tags: ['users'],
133
- operationId: 'getUsers',
134
- parameters: [
135
- {
136
- name: 'limit',
137
- in: 'query',
138
- required: false,
139
- schema: { type: 'integer' },
140
- },
141
- ],
142
- responses: {
143
- '200': {
144
- description: 'ok',
145
- content: {
146
- 'application/json': {
147
- schema: { $ref: '#/components/schemas/UserList' },
148
- },
149
- },
150
- },
151
- },
152
- },
153
- trace: {
154
- tags: ['users'],
155
- operationId: 'traceUsers',
156
- summary: 'Trace users route',
157
- responses: {
158
- '200': {
159
- description: 'trace-ok',
160
- },
161
- },
162
- },
163
- },
164
- '/trace-only': {
165
- trace: {
166
- tags: ['trace-only'],
167
- operationId: 'traceOnlyRoute',
168
- responses: {
169
- '204': {
170
- description: 'no-content',
171
- },
172
- },
173
- },
174
- },
175
- },
176
- components: {
177
- schemas: {
178
- User: {
179
- type: 'object',
180
- properties: {
181
- id: { type: 'string' },
182
- },
183
- },
184
- UserList: {
185
- type: 'array',
186
- items: { $ref: '#/components/schemas/User' },
187
- },
188
- },
189
- },
190
- };
191
- }
192
- describe('MCP transport tool router', () => {
193
- let service;
194
- let runtimeProvider;
195
- let swaggerCache;
196
- let router;
197
- beforeEach(() => {
198
- service = createMockService();
199
- runtimeProvider = jest.fn().mockResolvedValue({
200
- environment,
201
- service,
202
- });
203
- swaggerCache = {
204
- load: jest.fn(),
205
- getOrLoad: jest.fn(),
206
- };
207
- router = createMcpToolRouter({
208
- runtimeProvider,
209
- swaggerCache,
210
- schemaResolver: new SchemaResolver({ includeCircularRefs: false }),
211
- });
212
- });
213
- it('should keep legacy tools behavior for controllers/paths/details/schema resolution', async () => {
214
- const swagger = createLegacySwagger();
215
- swaggerCache.getOrLoad.mockResolvedValue(swagger);
216
- const controllers = parseToolPayload(await router.execute('get_controllers', { url: environment.SWAGGER_URL }));
217
- expect(controllers.controllers).toEqual(expect.arrayContaining(['users', 'trace-only']));
218
- expect(controllers.count).toBe(2);
219
- const paths = parseToolPayload(await router.execute('get_paths_by_controller', { url: environment.SWAGGER_URL, controller: 'users' }));
220
- expect(paths.count).toBe(2);
221
- expect(paths.paths).toEqual(expect.arrayContaining([
222
- expect.objectContaining({ path: '/users', method: 'get' }),
223
- expect.objectContaining({ path: '/users', method: 'trace' }),
224
- ]));
225
- const pathDetails = parseToolPayload(await router.execute('get_path_details', { url: environment.SWAGGER_URL, path: '/users', method: 'get' }));
226
- expect(pathDetails.path).toBe('/users');
227
- expect(pathDetails.method).toBe('GET');
228
- const tracePathDetails = parseToolPayload(await router.execute('get_path_details', { url: environment.SWAGGER_URL, path: '/users', method: 'trace' }));
229
- expect(tracePathDetails.path).toBe('/users');
230
- expect(tracePathDetails.method).toBe('TRACE');
231
- expect(tracePathDetails.operationId).toBe('traceUsers');
232
- const resolved = parseToolPayload(await router.execute('resolve_schema', { url: environment.SWAGGER_URL, ref: '#/components/schemas/UserList' }));
233
- expect(resolved.ref).toBe('#/components/schemas/UserList');
234
- expect(resolved.resolved).toBeDefined();
235
- });
236
- it('should return Slice 1 DTO contract for capture_snapshot and get_snapshot_diff', async () => {
237
- const capturePayload = parseToolPayload(await router.execute('capture_snapshot', {}));
238
- expect(() => snapshotDiffResultSchema.parse(capturePayload)).not.toThrow();
239
- const diffPayload = parseToolPayload(await router.execute('get_snapshot_diff', {
240
- baselineSnapshotId: 'snapshot-1',
241
- targetSnapshotId: 'snapshot-2',
242
- }));
243
- expect(() => snapshotDiffResultSchema.parse(diffPayload)).not.toThrow();
244
- expect(service.replayDiff).toHaveBeenCalledTimes(1);
245
- });
246
- it('should keep list_snapshots, list_endpoint_change_history, and get_endpoint_diff_detail output shape stable', async () => {
247
- const listPayload = parseToolPayload(await router.execute('list_snapshots', { limit: 20 }));
248
- expect(() => listSnapshotsResultSchema.parse(listPayload)).not.toThrow();
249
- const historyPayload = parseToolPayload(await router.execute('list_endpoint_change_history', {
250
- limit: 20,
251
- path: '/users',
252
- method: 'get',
253
- }));
254
- expect(() => listEndpointChangeHistoryResultSchema.parse(historyPayload)).not.toThrow();
255
- const detailPayload = parseToolPayload(await router.execute('get_endpoint_diff_detail', {
256
- baselineSnapshotId: 'snapshot-1',
257
- targetSnapshotId: 'snapshot-2',
258
- path: '/users',
259
- method: 'get',
260
- }));
261
- expect(() => endpointDiffDetailOutputSchema.parse(detailPayload)).not.toThrow();
262
- });
263
- it('should reject invalid history filters when path or method is missing', async () => {
264
- const pathOnlyResponse = await router.execute('list_endpoint_change_history', {
265
- path: '/users',
266
- });
267
- expect(pathOnlyResponse.content[0].text).toContain('Error: method: path and method must be provided together.');
268
- const methodOnlyResponse = await router.execute('list_endpoint_change_history', {
269
- method: 'get',
270
- });
271
- expect(methodOnlyResponse.content[0].text).toContain('Error: path: path and method must be provided together.');
272
- });
273
- it('should reject snapshot tools when replayed snapshots are outside configured source', async () => {
274
- service.replayDiff.mockResolvedValueOnce(snapshotDiffResultSchema.parse({
275
- ...diffResult,
276
- summary: {
277
- ...diffResult.summary,
278
- projectKey: 'other-project',
279
- sourceUrl: 'https://api.example.com/other.json',
280
- },
281
- }));
282
- const diffResponse = await router.execute('get_snapshot_diff', {
283
- baselineSnapshotId: 'snapshot-1',
284
- targetSnapshotId: 'snapshot-2',
285
- });
286
- expect(diffResponse.content[0].text).toContain('Error: Snapshots do not belong to the configured source.');
287
- });
288
- it('should return proper errors for missing snapshots and runtime initialization failure', async () => {
289
- service.replayDiff.mockRejectedValueOnce(new Error('Baseline snapshot not found: missing'));
290
- const missingSnapshotResponse = await router.execute('get_snapshot_diff', {
291
- baselineSnapshotId: 'missing',
292
- targetSnapshotId: 'snapshot-2',
293
- });
294
- expect(missingSnapshotResponse.content[0].text).toContain('Error: Baseline snapshot not found: missing');
295
- runtimeProvider.mockRejectedValueOnce(new Error('Invalid environment configuration: DATABASE_URL invalid'));
296
- const runtimeInitResponse = await router.execute('capture_snapshot', {});
297
- expect(runtimeInitResponse.content[0].text).toContain('Error: Invalid environment configuration: DATABASE_URL invalid');
298
- });
299
- it('should fail endpoint detail when diff replay does not belong to configured source', async () => {
300
- service.replayDiff.mockResolvedValueOnce(snapshotDiffResultSchema.parse({
301
- ...diffResult,
302
- summary: {
303
- ...diffResult.summary,
304
- sourceUrl: 'https://api.example.com/foreign.json',
305
- },
306
- }));
307
- const detailResponse = await router.execute('get_endpoint_diff_detail', {
308
- baselineSnapshotId: 'snapshot-1',
309
- targetSnapshotId: 'snapshot-2',
310
- path: '/users',
311
- method: 'get',
312
- });
313
- expect(detailResponse.content[0].text).toContain('Error: Snapshots do not belong to the configured source.');
314
- });
315
- });
316
- //# sourceMappingURL=mcpSnapshotTools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcpSnapshotTools.test.js","sourceRoot":"","sources":["../../src/tests/mcpSnapshotTools.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=postgresMigrationSmoke.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgresMigrationSmoke.test.d.ts","sourceRoot":"","sources":["../../src/tests/postgresMigrationSmoke.test.ts"],"names":[],"mappings":""}
@@ -1,187 +0,0 @@
1
- import { newDb } from 'pg-mem';
2
- import { runPostgresMigrations } from '../infrastructure/postgres/migrationRunner.js';
3
- import { mkdtemp, rm, writeFile } from 'node:fs/promises';
4
- import os from 'node:os';
5
- import path from 'node:path';
6
- describe('Slice 7: postgres migration smoke', () => {
7
- it('should apply SQL migrations idempotently and enforce snapshot uniqueness', async () => {
8
- const db = newDb({
9
- autoCreateForeignKeyIndices: true,
10
- noAstCoverageCheck: true,
11
- });
12
- const pgAdapter = db.adapters.createPg();
13
- const client = new pgAdapter.Client();
14
- await client.connect();
15
- try {
16
- const firstRun = await runPostgresMigrations(client);
17
- expect(firstRun.applied).toEqual(['001_snapshot_schema.sql', '002_snapshot_change_history.sql']);
18
- const secondRun = await runPostgresMigrations(client);
19
- expect(secondRun.applied).toEqual([]);
20
- expect(secondRun.skipped).toContain('001_snapshot_schema.sql');
21
- expect(secondRun.skipped).toContain('002_snapshot_change_history.sql');
22
- const history = await client.query(`
23
- SELECT version
24
- FROM schema_migrations
25
- ORDER BY version ASC;
26
- `);
27
- expect(history.rows.map(row => row.version)).toEqual([
28
- '001_snapshot_schema.sql',
29
- '002_snapshot_change_history.sql',
30
- ]);
31
- const projectResult = await client.query(`
32
- INSERT INTO projects (project_key)
33
- VALUES ($1)
34
- RETURNING id;
35
- `, ['ops-migration-smoke']);
36
- const projectId = projectResult.rows[0].id;
37
- const sourceResult = await client.query(`
38
- INSERT INTO sources (project_id, swagger_url)
39
- VALUES ($1, $2)
40
- RETURNING id;
41
- `, [projectId, 'https://api.example.com/openapi.json']);
42
- const sourceId = sourceResult.rows[0].id;
43
- const firstSnapshotResult = await client.query(`
44
- INSERT INTO snapshots (source_id, spec_hash, document_fingerprint, canonical_snapshot)
45
- VALUES ($1, $2, $3, $4)
46
- RETURNING id;
47
- `, [sourceId, 'hash-v1', 'fingerprint-v1', JSON.stringify({ sourceUrl: 'https://api.example.com/openapi.json' })]);
48
- const firstSnapshotId = firstSnapshotResult.rows[0].id;
49
- await expect(client.query(`
50
- INSERT INTO snapshots (source_id, spec_hash, document_fingerprint, canonical_snapshot)
51
- VALUES ($1, $2, $3, $4);
52
- `, [sourceId, 'hash-v1', 'fingerprint-v1', JSON.stringify({ sourceUrl: 'https://api.example.com/openapi.json' })])).rejects.toThrow(/duplicate key|unique/i);
53
- const secondSnapshotResult = await client.query(`
54
- INSERT INTO snapshots (source_id, spec_hash, document_fingerprint, canonical_snapshot)
55
- VALUES ($1, $2, $3, $4)
56
- RETURNING id, captured_at;
57
- `, [sourceId, 'hash-v2', 'fingerprint-v2', JSON.stringify({ sourceUrl: 'https://api.example.com/openapi.json' })]);
58
- const secondSnapshot = secondSnapshotResult.rows[0];
59
- const transitionResult = await client.query(`
60
- INSERT INTO snapshot_transitions (source_id, baseline_snapshot_id, target_snapshot_id, captured_at, counts, warnings)
61
- VALUES ($1, $2, $3, $4, $5, $6)
62
- RETURNING id;
63
- `, [
64
- sourceId,
65
- firstSnapshotId,
66
- secondSnapshot.id,
67
- secondSnapshot.captured_at,
68
- JSON.stringify({ total: 1, breaking: 0, nonBreaking: 1, info: 0 }),
69
- JSON.stringify([]),
70
- ]);
71
- const transitionId = transitionResult.rows[0].id;
72
- await client.query(`
73
- INSERT INTO endpoint_change_history (
74
- transition_id,
75
- source_id,
76
- path,
77
- method,
78
- classification,
79
- change_reason,
80
- baseline_snapshot_id,
81
- target_snapshot_id,
82
- changed_at
83
- )
84
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9);
85
- `, [
86
- transitionId,
87
- sourceId,
88
- '/pets',
89
- 'post',
90
- 'non-breaking',
91
- 'method_added',
92
- firstSnapshotId,
93
- secondSnapshot.id,
94
- secondSnapshot.captured_at,
95
- ]);
96
- await expect(client.query(`
97
- INSERT INTO snapshot_transitions (source_id, baseline_snapshot_id, target_snapshot_id, captured_at, counts, warnings)
98
- VALUES ($1, $2, $3, $4, $5, $6);
99
- `, [
100
- sourceId,
101
- firstSnapshotId,
102
- secondSnapshot.id,
103
- secondSnapshot.captured_at,
104
- JSON.stringify({ total: 1, breaking: 0, nonBreaking: 1, info: 0 }),
105
- JSON.stringify([]),
106
- ])).rejects.toThrow(/duplicate key|unique/i);
107
- }
108
- finally {
109
- await client.end();
110
- }
111
- });
112
- it('should fail explicitly when migration directory is missing', async () => {
113
- const db = newDb({
114
- autoCreateForeignKeyIndices: true,
115
- noAstCoverageCheck: true,
116
- });
117
- const pgAdapter = db.adapters.createPg();
118
- const client = new pgAdapter.Client();
119
- await client.connect();
120
- try {
121
- await expect(runPostgresMigrations(client, {
122
- migrationsDirectory: path.join(os.tmpdir(), `missing-migrations-${Date.now()}`),
123
- })).rejects.toThrow('Migration directory not found');
124
- }
125
- finally {
126
- await client.end();
127
- }
128
- });
129
- it('should rollback failed migration transaction and surface migration filename in error', async () => {
130
- const tempDirectory = await mkdtemp(path.join(os.tmpdir(), 'snapshot-migrations-'));
131
- const validPath = path.join(tempDirectory, '001_valid.sql');
132
- const failingPath = path.join(tempDirectory, '002_failing.sql');
133
- await writeFile(validPath, 'CREATE TABLE IF NOT EXISTS valid_probe (id INT PRIMARY KEY);\n', 'utf8');
134
- await writeFile(failingPath, ['INSERT INTO valid_probe (id) VALUES (1);', 'INSERT INTO rollback_probe_missing VALUES (1);'].join('\n'), 'utf8');
135
- const db = newDb({
136
- autoCreateForeignKeyIndices: true,
137
- noAstCoverageCheck: true,
138
- });
139
- const pgAdapter = db.adapters.createPg();
140
- const client = new pgAdapter.Client();
141
- await client.connect();
142
- try {
143
- await expect(runPostgresMigrations(client, {
144
- migrationsDirectory: tempDirectory,
145
- })).rejects.toThrow('Failed to apply migration 002_failing.sql');
146
- const migrationHistory = await client.query('SELECT version FROM schema_migrations ORDER BY version ASC;');
147
- const versions = migrationHistory.rows.map(row => row.version);
148
- expect(versions).toEqual(['001_valid.sql']);
149
- const validProbe = await client.query(`
150
- SELECT COUNT(*)::int AS count
151
- FROM valid_probe;
152
- `);
153
- expect(validProbe.rows[0].count).toBe(0);
154
- }
155
- finally {
156
- await client.end();
157
- await rm(tempDirectory, { recursive: true, force: true });
158
- }
159
- });
160
- it('should tolerate concurrent migration execution without duplicate schema_migrations rows', async () => {
161
- const db = newDb({
162
- autoCreateForeignKeyIndices: true,
163
- noAstCoverageCheck: true,
164
- });
165
- const pgAdapter = db.adapters.createPg();
166
- const clientA = new pgAdapter.Client();
167
- const clientB = new pgAdapter.Client();
168
- await clientA.connect();
169
- await clientB.connect();
170
- try {
171
- const [left, right] = await Promise.allSettled([runPostgresMigrations(clientA), runPostgresMigrations(clientB)]);
172
- expect(left.status).toBe('fulfilled');
173
- expect(right.status).toBe('fulfilled');
174
- const history = await clientA.query(`
175
- SELECT version
176
- FROM schema_migrations
177
- WHERE version IN ('001_snapshot_schema.sql', '002_snapshot_change_history.sql');
178
- `);
179
- expect(history.rows).toHaveLength(2);
180
- }
181
- finally {
182
- await clientA.end();
183
- await clientB.end();
184
- }
185
- });
186
- });
187
- //# sourceMappingURL=postgresMigrationSmoke.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgresMigrationSmoke.test.js","sourceRoot":"","sources":["../../src/tests/postgresMigrationSmoke.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- export interface RealPostgresTestSchema {
2
- schemaName: string;
3
- databaseUrl: string;
4
- dispose(): Promise<void>;
5
- }
6
- export declare function readTestDatabaseUrl(env?: NodeJS.ProcessEnv): string | null;
7
- export declare function createRealPostgresTestSchema(env?: NodeJS.ProcessEnv, options?: {
8
- schemaPrefix?: string;
9
- }): Promise<RealPostgresTestSchema>;
10
- //# sourceMappingURL=realPostgresTestSchema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"realPostgresTestSchema.d.ts","sourceRoot":"","sources":["../../src/tests/realPostgresTestSchema.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAwCD,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,IAAI,CAMvF;AAED,wBAAsB,4BAA4B,CAChD,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACtC,OAAO,CAAC,sBAAsB,CAAC,CAgCjC"}
@@ -1,73 +0,0 @@
1
- import { randomBytes } from 'node:crypto';
2
- import { Pool } from 'pg';
3
- function normalizePrefix(prefix) {
4
- const normalized = prefix
5
- .trim()
6
- .toLowerCase()
7
- .replace(/[^a-z0-9_]/g, '_')
8
- .replace(/_+/g, '_')
9
- .replace(/^_+|_+$/g, '');
10
- if (!normalized) {
11
- return 'snapshot_real_test';
12
- }
13
- if (!/^[a-z]/.test(normalized)) {
14
- return `s_${normalized}`;
15
- }
16
- return normalized;
17
- }
18
- function createSchemaName(prefix) {
19
- const safePrefix = normalizePrefix(prefix);
20
- const timestamp = Date.now().toString(36);
21
- const randomSuffix = randomBytes(4).toString('hex');
22
- return `${safePrefix}_${timestamp}_${randomSuffix}`;
23
- }
24
- function quoteIdentifier(value) {
25
- return `"${value.replace(/"/g, '""')}"`;
26
- }
27
- function buildSchemaScopedDatabaseUrl(databaseUrl, schemaName) {
28
- const parsed = new URL(databaseUrl);
29
- const scopedOption = `-c search_path=${schemaName},public`;
30
- const existingOptions = parsed.searchParams.get('options');
31
- parsed.searchParams.set('options', existingOptions ? `${existingOptions} ${scopedOption}` : scopedOption);
32
- return parsed.toString();
33
- }
34
- export function readTestDatabaseUrl(env = process.env) {
35
- const databaseUrl = env.TEST_DATABASE_URL?.trim();
36
- if (!databaseUrl) {
37
- return null;
38
- }
39
- return databaseUrl;
40
- }
41
- export async function createRealPostgresTestSchema(env = process.env, options = {}) {
42
- const baseDatabaseUrl = readTestDatabaseUrl(env);
43
- if (!baseDatabaseUrl) {
44
- throw new Error('TEST_DATABASE_URL is required for real Postgres persistence tests.');
45
- }
46
- const schemaName = createSchemaName(options.schemaPrefix ?? 'snapshot_real_test');
47
- const adminPool = new Pool({ connectionString: baseDatabaseUrl });
48
- let disposed = false;
49
- try {
50
- await adminPool.query(`CREATE SCHEMA ${quoteIdentifier(schemaName)};`);
51
- }
52
- catch (error) {
53
- await adminPool.end().catch(() => undefined);
54
- throw error;
55
- }
56
- return {
57
- schemaName,
58
- databaseUrl: buildSchemaScopedDatabaseUrl(baseDatabaseUrl, schemaName),
59
- async dispose() {
60
- if (disposed) {
61
- return;
62
- }
63
- disposed = true;
64
- try {
65
- await adminPool.query(`DROP SCHEMA IF EXISTS ${quoteIdentifier(schemaName)} CASCADE;`);
66
- }
67
- finally {
68
- await adminPool.end().catch(() => undefined);
69
- }
70
- },
71
- };
72
- }
73
- //# sourceMappingURL=realPostgresTestSchema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"realPostgresTestSchema.js","sourceRoot":"","sources":["../../src/tests/realPostgresTestSchema.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=snapshotCapturePipeline.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotCapturePipeline.test.d.ts","sourceRoot":"","sources":["../../src/tests/snapshotCapturePipeline.test.ts"],"names":[],"mappings":""}