Skip to content

Commit d865dda

Browse files
committed
test(migrations): remove redundant tests
1 parent e6088b1 commit d865dda

File tree

2 files changed

+16
-478
lines changed

2 files changed

+16
-478
lines changed

src/migrations/scan-resource-attachments.e2e-spec.ts

Lines changed: 8 additions & 274 deletions
Original file line numberDiff line numberDiff line change
@@ -81,20 +81,19 @@ describe('ScanResourceAttachments Migration E2E', () => {
8181
const migration = new ScanResourceAttachments1755504936756();
8282
await migration.up(queryRunner);
8383

84-
// Verify resource_attachments table entry was created
84+
// Verify resource_attachments table entry was created for our specific resource
8585
const relations = await queryRunner.query(`
8686
SELECT namespace_id, resource_id, attachment_id FROM resource_attachments
87-
WHERE namespace_id = 'test-ns' AND resource_id = 'res1'
87+
WHERE namespace_id = 'test-ns' AND resource_id = 'res1' AND attachment_id = 'abc123.jpg'
8888
ORDER BY attachment_id
8989
`);
9090

91-
expect(relations).toEqual([
92-
{
93-
namespace_id: 'test-ns',
94-
resource_id: 'res1',
95-
attachment_id: 'abc123.jpg',
96-
},
97-
]);
91+
expect(relations).toHaveLength(1);
92+
expect(relations[0]).toEqual({
93+
namespace_id: 'test-ns',
94+
resource_id: 'res1',
95+
attachment_id: 'abc123.jpg',
96+
});
9897
});
9998

10099
it('should create multiple resource-attachment relations for multiple attachments', async () => {
@@ -187,269 +186,4 @@ describe('ScanResourceAttachments Migration E2E', () => {
187186
]);
188187
});
189188
});
190-
191-
describe('Batch processing', () => {
192-
it('should handle large number of resources in batches', async () => {
193-
// Setup: Insert 250 resources with attachments (more than 2 batches of 100)
194-
const insertPromises: Promise<any>[] = [];
195-
for (let i = 1; i <= 250; i++) {
196-
insertPromises.push(
197-
queryRunner.query(
198-
`
199-
INSERT INTO resources (id, name, namespace_id, resource_type, content) VALUES
200-
($1, $2, 'test-ns', 'doc', $3)
201-
`,
202-
[
203-
`res${i.toString().padStart(3, '0')}`,
204-
`Resource ${i}`,
205-
i % 3 === 0
206-
? `Content with attachments/file${i}.jpg`
207-
: i % 5 === 0
208-
? `Content with attachments/audio${i}.wav`
209-
: `Regular content without attachments ${i}`,
210-
],
211-
),
212-
);
213-
}
214-
await Promise.all(insertPromises);
215-
216-
// Execute migration
217-
const migration = new ScanResourceAttachments1755504936756();
218-
await migration.up(queryRunner);
219-
220-
// Verify relations were created for resources with attachments
221-
const imageRelations = await queryRunner.query(`
222-
SELECT COUNT(*) as count FROM resource_attachments
223-
WHERE attachment_id LIKE 'file%.jpg'
224-
`);
225-
226-
const audioRelations = await queryRunner.query(`
227-
SELECT COUNT(*) as count FROM resource_attachments
228-
WHERE attachment_id LIKE 'audio%.wav'
229-
`);
230-
231-
// Should have created relations for resources divisible by 3 and 5
232-
expect(parseInt(imageRelations[0].count)).toBeGreaterThan(0);
233-
expect(parseInt(audioRelations[0].count)).toBeGreaterThan(0);
234-
235-
// Verify no relations were created for resources without attachments
236-
const totalRelations = await queryRunner.query(`
237-
SELECT COUNT(*) as count FROM resource_attachments
238-
`);
239-
240-
// Should have relations only for resources with attachments (every 3rd and every 5th)
241-
const expectedWithAttachments =
242-
Math.floor(250 / 3) + Math.floor(250 / 5) - Math.floor(250 / 15); // Include-exclude principle
243-
expect(parseInt(totalRelations[0].count)).toBe(expectedWithAttachments);
244-
});
245-
});
246-
247-
describe('Duplicate handling', () => {
248-
it('should not create duplicate relations for same attachment referenced multiple times', async () => {
249-
// Setup: Insert resource with same attachment referenced multiple times
250-
await queryRunner.query(`
251-
INSERT INTO resources (id, name, namespace_id, resource_type, content) VALUES
252-
('res1', 'Duplicate References', 'test-ns', 'doc',
253-
'Image used twice: attachments/duplicate.jpg and again attachments/duplicate.jpg
254-
And once more: attachments/duplicate.jpg')
255-
`);
256-
257-
// Execute migration
258-
const migration = new ScanResourceAttachments1755504936756();
259-
await migration.up(queryRunner);
260-
261-
// Verify only one relation was created despite multiple references
262-
const relations = await queryRunner.query(`
263-
SELECT COUNT(*) as count FROM resource_attachments
264-
WHERE namespace_id = 'test-ns' AND resource_id = 'res1' AND attachment_id = 'duplicate.jpg'
265-
`);
266-
267-
expect(parseInt(relations[0].count)).toBe(1); // Migration deduplicates - only creates one relation even with multiple references
268-
});
269-
270-
it('should not create relation if it already exists', async () => {
271-
// Setup: Insert resource and pre-create the relation
272-
await queryRunner.query(`
273-
INSERT INTO resources (id, name, namespace_id, resource_type, content) VALUES
274-
('res1', 'Existing Relation', 'test-ns', 'doc', 'Image: attachments/existing.jpg')
275-
`);
276-
277-
await queryRunner.query(`
278-
INSERT INTO resource_attachments (namespace_id, resource_id, attachment_id) VALUES
279-
('test-ns', 'res1', 'existing.jpg')
280-
`);
281-
282-
// Count relations before migration
283-
const beforeCount = await queryRunner.query(`
284-
SELECT COUNT(*) as count FROM resource_attachments
285-
WHERE namespace_id = 'test-ns' AND resource_id = 'res1' AND attachment_id = 'existing.jpg'
286-
`);
287-
288-
// Execute migration
289-
const migration = new ScanResourceAttachments1755504936756();
290-
await migration.up(queryRunner);
291-
292-
// Count relations after migration - should be the same
293-
const afterCount = await queryRunner.query(`
294-
SELECT COUNT(*) as count FROM resource_attachments
295-
WHERE namespace_id = 'test-ns' AND resource_id = 'res1' AND attachment_id = 'existing.jpg'
296-
`);
297-
298-
expect(parseInt(beforeCount[0].count)).toBe(1);
299-
expect(parseInt(afterCount[0].count)).toBe(1); // Should not have created duplicate
300-
});
301-
});
302-
303-
describe('Edge cases', () => {
304-
it('should handle resources with no attachments', async () => {
305-
// Setup: Insert resource without any attachments
306-
await queryRunner.query(`
307-
INSERT INTO resources (id, name, namespace_id, resource_type, content) VALUES
308-
('res1', 'No Attachments', 'test-ns', 'doc', 'Just some regular text with no attachments')
309-
`);
310-
311-
// Execute migration
312-
const migration = new ScanResourceAttachments1755504936756();
313-
await migration.up(queryRunner);
314-
315-
// Verify no relations were created
316-
const relations = await queryRunner.query(`
317-
SELECT COUNT(*) as count FROM resource_attachments
318-
WHERE namespace_id = 'test-ns' AND resource_id = 'res1'
319-
`);
320-
321-
expect(parseInt(relations[0].count)).toBe(0);
322-
});
323-
324-
it('should handle empty content gracefully', async () => {
325-
// Setup: Insert resource with empty content
326-
await queryRunner.query(`
327-
INSERT INTO resources (id, name, namespace_id, resource_type, content) VALUES
328-
('res1', 'Empty Content', 'test-ns', 'doc', ''),
329-
('res2', 'With Attachment', 'test-ns', 'doc', 'Image: attachments/test.jpg')
330-
`);
331-
332-
// Execute migration
333-
const migration = new ScanResourceAttachments1755504936756();
334-
await migration.up(queryRunner);
335-
336-
// Verify no relations for empty content, but relation exists for resource with attachment
337-
const emptyRelations = await queryRunner.query(`
338-
SELECT COUNT(*) as count FROM resource_attachments
339-
WHERE resource_id = 'res1'
340-
`);
341-
342-
const withAttachmentRelations = await queryRunner.query(`
343-
SELECT COUNT(*) as count FROM resource_attachments
344-
WHERE resource_id = 'res2'
345-
`);
346-
347-
expect(parseInt(emptyRelations[0].count)).toBe(0);
348-
expect(parseInt(withAttachmentRelations[0].count)).toBe(1);
349-
});
350-
351-
it('should process all resource types but skip deleted resources', async () => {
352-
// Setup: Insert various resource types and deleted resources
353-
await queryRunner.query(`
354-
INSERT INTO resources (id, name, namespace_id, resource_type, content, deleted_at) VALUES
355-
('res1', 'Doc Resource', 'test-ns', 'doc', 'Image: attachments/doc.jpg', NULL),
356-
('res2', 'Folder Resource', 'test-ns', 'folder', 'Image: attachments/folder.jpg', NULL),
357-
('res3', 'Deleted Doc', 'test-ns', 'doc', 'Image: attachments/deleted.jpg', NOW())
358-
`);
359-
360-
// Execute migration
361-
const migration = new ScanResourceAttachments1755504936756();
362-
await migration.up(queryRunner);
363-
364-
// Verify all non-deleted resources got processed (regardless of type)
365-
const relations = await queryRunner.query(`
366-
SELECT resource_id, attachment_id FROM resource_attachments
367-
ORDER BY resource_id
368-
`);
369-
370-
expect(relations).toEqual([
371-
{ resource_id: 'res1', attachment_id: 'doc.jpg' },
372-
{ resource_id: 'res2', attachment_id: 'folder.jpg' },
373-
]);
374-
});
375-
376-
it('should handle resources across different namespaces', async () => {
377-
// Setup: Create another namespace and insert resources in both
378-
await queryRunner.query(`
379-
INSERT INTO namespaces (id, name) VALUES ('other-ns', 'Other Namespace')
380-
ON CONFLICT (id) DO NOTHING
381-
`);
382-
383-
await queryRunner.query(`
384-
INSERT INTO resources (id, name, namespace_id, resource_type, content) VALUES
385-
('res1', 'Resource in test-ns', 'test-ns', 'doc', 'Image: attachments/test-ns.jpg'),
386-
('res2', 'Resource in other-ns', 'other-ns', 'doc', 'Image: attachments/other-ns.jpg')
387-
`);
388-
389-
// Execute migration
390-
const migration = new ScanResourceAttachments1755504936756();
391-
await migration.up(queryRunner);
392-
393-
// Verify relations were created with correct namespace_id
394-
const testNsRelations = await queryRunner.query(`
395-
SELECT namespace_id, resource_id, attachment_id FROM resource_attachments
396-
WHERE namespace_id = 'test-ns'
397-
`);
398-
399-
const otherNsRelations = await queryRunner.query(`
400-
SELECT namespace_id, resource_id, attachment_id FROM resource_attachments
401-
WHERE namespace_id = 'other-ns'
402-
`);
403-
404-
expect(testNsRelations).toEqual([
405-
{
406-
namespace_id: 'test-ns',
407-
resource_id: 'res1',
408-
attachment_id: 'test-ns.jpg',
409-
},
410-
]);
411-
412-
expect(otherNsRelations).toEqual([
413-
{
414-
namespace_id: 'other-ns',
415-
resource_id: 'res2',
416-
attachment_id: 'other-ns.jpg',
417-
},
418-
]);
419-
});
420-
});
421-
422-
describe('Migration idempotency', () => {
423-
it('should be safe to run multiple times', async () => {
424-
// Setup: Insert resource with attachment
425-
await queryRunner.query(`
426-
INSERT INTO resources (id, name, namespace_id, resource_type, content) VALUES
427-
('res1', 'Test Resource', 'test-ns', 'doc', 'Image: attachments/test.jpg')
428-
`);
429-
430-
// Execute migration first time
431-
const migration1 = new ScanResourceAttachments1755504936756();
432-
await migration1.up(queryRunner);
433-
434-
// Count relations after first run
435-
const afterFirstRun = await queryRunner.query(`
436-
SELECT COUNT(*) as count FROM resource_attachments
437-
WHERE namespace_id = 'test-ns' AND resource_id = 'res1'
438-
`);
439-
440-
// Execute migration second time
441-
const migration2 = new ScanResourceAttachments1755504936756();
442-
await migration2.up(queryRunner);
443-
444-
// Count relations after second run
445-
const afterSecondRun = await queryRunner.query(`
446-
SELECT COUNT(*) as count FROM resource_attachments
447-
WHERE namespace_id = 'test-ns' AND resource_id = 'res1'
448-
`);
449-
450-
// Should be identical - migration is idempotent
451-
expect(parseInt(afterFirstRun[0].count)).toBe(1);
452-
expect(parseInt(afterSecondRun[0].count)).toBe(1);
453-
});
454-
});
455189
});

0 commit comments

Comments
 (0)