tangled
alpha
login
or
join now
cosmik.network
/
semble
43
fork
atom
A social knowledge tool for researchers built on ATProto
43
fork
atom
overview
issues
13
pulls
pipelines
can sort results reverse chronologically
Wesley Finck
4 months ago
0e47a270
339c4412
+43
-26
1 changed file
expand all
collapse all
unified
split
src
modules
cards
tests
infrastructure
DrizzleCardQueryRepository.getLibrariesForUrl.integration.test.ts
+43
-26
src/modules/cards/tests/infrastructure/DrizzleCardQueryRepository.getLibrariesForUrl.integration.test.ts
···
15
15
import { CardSortField, SortOrder } from '../../domain/ICardQueryRepository';
16
16
import { createTestSchema } from '../test-utils/createTestSchema';
17
17
import { CardTypeEnum } from '../../domain/value-objects/CardType';
18
18
+
import { PublishedRecordId } from '../../domain/value-objects/PublishedRecordId';
18
19
19
20
describe('DrizzleCardQueryRepository - getLibrariesForUrl', () => {
20
21
let container: StartedPostgreSqlContainer;
···
296
297
.withUrl(url)
297
298
.buildOrThrow();
298
299
300
300
+
await new Promise((resolve) => setTimeout(resolve, 1000));
299
301
const card2 = new CardBuilder()
300
302
.withCuratorId(curator2.value)
301
303
.withType(CardTypeEnum.URL)
302
304
.withUrl(url)
303
305
.buildOrThrow();
304
306
307
307
+
await new Promise((resolve) => setTimeout(resolve, 1000));
305
308
const card3 = new CardBuilder()
306
309
.withCuratorId(curator3.value)
307
310
.withType(CardTypeEnum.URL)
···
314
317
315
318
// Save cards with slight delays to ensure different timestamps
316
319
await cardRepository.save(card1);
317
317
-
await new Promise(resolve => setTimeout(resolve, 10));
320
320
+
await new Promise((resolve) => setTimeout(resolve, 10));
318
321
await cardRepository.save(card2);
319
319
-
await new Promise(resolve => setTimeout(resolve, 10));
322
322
+
await new Promise((resolve) => setTimeout(resolve, 10));
320
323
await cardRepository.save(card3);
321
324
322
325
const result = await queryRepository.getLibrariesForUrl(testUrl, {
···
327
330
});
328
331
329
332
expect(result.items).toHaveLength(3);
330
330
-
333
333
+
331
334
// Should be sorted by creation time, newest first
332
332
-
const cardIds = result.items.map(lib => lib.card.id);
335
335
+
const cardIds = result.items.map((lib) => lib.card.id);
333
336
expect(cardIds[0]).toBe(card3.cardId.getStringValue()); // Most recent
334
337
expect(cardIds[1]).toBe(card2.cardId.getStringValue()); // Middle
335
338
expect(cardIds[2]).toBe(card1.cardId.getStringValue()); // Oldest
···
357
360
358
361
// Save cards with slight delay to ensure different timestamps
359
362
await cardRepository.save(card1);
360
360
-
await new Promise(resolve => setTimeout(resolve, 10));
363
363
+
await new Promise((resolve) => setTimeout(resolve, 10));
361
364
await cardRepository.save(card2);
362
365
363
366
const result = await queryRepository.getLibrariesForUrl(testUrl, {
···
368
371
});
369
372
370
373
expect(result.items).toHaveLength(2);
371
371
-
374
374
+
372
375
// Should be sorted by creation time, oldest first
373
373
-
const cardIds = result.items.map(lib => lib.card.id);
376
376
+
const cardIds = result.items.map((lib) => lib.card.id);
374
377
expect(cardIds[0]).toBe(card1.cardId.getStringValue()); // Oldest
375
378
expect(cardIds[1]).toBe(card2.cardId.getStringValue()); // Newest
376
379
});
···
400
403
await cardRepository.save(card2);
401
404
402
405
// Update card1 to have a more recent updatedAt
403
403
-
await new Promise(resolve => setTimeout(resolve, 10));
406
406
+
await new Promise((resolve) => setTimeout(resolve, 1000));
407
407
+
card1.markAsPublished(
408
408
+
PublishedRecordId.create({
409
409
+
uri: 'at://did:plc:publishedrecord1',
410
410
+
cid: 'bafyreicpublishedrecord1',
411
411
+
}),
412
412
+
);
404
413
await cardRepository.save(card1); // This should update the updatedAt timestamp
405
414
406
415
const result = await queryRepository.getLibrariesForUrl(testUrl, {
···
411
420
});
412
421
413
422
expect(result.items).toHaveLength(2);
414
414
-
423
423
+
415
424
// card1 should be first since it was updated more recently
416
416
-
const cardIds = result.items.map(lib => lib.card.id);
425
425
+
const cardIds = result.items.map((lib) => lib.card.id);
417
426
expect(cardIds[0]).toBe(card1.cardId.getStringValue()); // Most recently updated
418
427
expect(cardIds[1]).toBe(card2.cardId.getStringValue()); // Less recently updated
419
428
});
···
443
452
444
453
// Add cards to libraries with different counts
445
454
card1.addToLibrary(curator1);
446
446
-
455
455
+
447
456
card2.addToLibrary(curator2);
448
457
card2.addToLibrary(curator1); // card2 has 2 library memberships
449
449
-
458
458
+
450
459
card3.addToLibrary(curator3);
451
460
card3.addToLibrary(curator1); // card3 has 3 library memberships
452
461
card3.addToLibrary(curator2);
···
464
473
465
474
// Should return all library memberships, but sorted by the card's library count
466
475
expect(result.items.length).toBeGreaterThan(0);
467
467
-
476
476
+
468
477
// Group by card ID to check sorting
469
478
const cardGroups = new Map<string, any[]>();
470
470
-
result.items.forEach(item => {
479
479
+
result.items.forEach((item) => {
471
480
const cardId = item.card.id;
472
481
if (!cardGroups.has(cardId)) {
473
482
cardGroups.set(cardId, []);
···
476
485
});
477
486
478
487
// Get the first occurrence of each card to check library count ordering
479
479
-
const uniqueCards = Array.from(cardGroups.entries()).map(([cardId, items]) => ({
480
480
-
cardId,
481
481
-
libraryCount: items[0]!.card.libraryCount
482
482
-
}));
488
488
+
const uniqueCards = Array.from(cardGroups.entries()).map(
489
489
+
([cardId, items]) => ({
490
490
+
cardId,
491
491
+
libraryCount: items[0]!.card.libraryCount,
492
492
+
}),
493
493
+
);
483
494
484
495
// Should be sorted by library count descending
485
496
for (let i = 0; i < uniqueCards.length - 1; i++) {
486
486
-
expect(uniqueCards[i]!.libraryCount).toBeGreaterThanOrEqual(uniqueCards[i + 1]!.libraryCount);
497
497
+
expect(uniqueCards[i]!.libraryCount).toBeGreaterThanOrEqual(
498
498
+
uniqueCards[i + 1]!.libraryCount,
499
499
+
);
487
500
}
488
501
});
489
502
···
520
533
});
521
534
522
535
expect(result.items.length).toBeGreaterThan(0);
523
523
-
536
536
+
524
537
// Group by card ID and check ascending order
525
538
const cardGroups = new Map<string, any[]>();
526
526
-
result.items.forEach(item => {
539
539
+
result.items.forEach((item) => {
527
540
const cardId = item.card.id;
528
541
if (!cardGroups.has(cardId)) {
529
542
cardGroups.set(cardId, []);
···
531
544
cardGroups.get(cardId)!.push(item);
532
545
});
533
546
534
534
-
const uniqueCards = Array.from(cardGroups.entries()).map(([cardId, items]) => ({
535
535
-
cardId,
536
536
-
libraryCount: items[0]!.card.libraryCount
537
537
-
}));
547
547
+
const uniqueCards = Array.from(cardGroups.entries()).map(
548
548
+
([cardId, items]) => ({
549
549
+
cardId,
550
550
+
libraryCount: items[0]!.card.libraryCount,
551
551
+
}),
552
552
+
);
538
553
539
554
// Should be sorted by library count ascending
540
555
for (let i = 0; i < uniqueCards.length - 1; i++) {
541
541
-
expect(uniqueCards[i]!.libraryCount).toBeLessThanOrEqual(uniqueCards[i + 1]!.libraryCount);
556
556
+
expect(uniqueCards[i]!.libraryCount).toBeLessThanOrEqual(
557
557
+
uniqueCards[i + 1]!.libraryCount,
558
558
+
);
542
559
}
543
560
});
544
561
});