~ knotless Search/
↑↓ move↵ open⇧↵ all results

chadtmiller.com/pds.js

An atproto PDS in JavaScript, for Cloudflare Workers and Node

0
0
main
67 lines · 2.2 KB Raw History
import { describe, expect, it, vi } from 'vitest';
import { createTid } from '../src/repo.js';
import { createSpaceBrowser } from '../src/space-browser.js';

const SPACE = 'at://did:plc:authority/social.grain.space/3lgrainspace';

/** @param {Array<{collection: string, rkey: string}>} records */
function browserOver(records) {
  return createSpaceBrowser(
    /** @type {any} */ ({
      async listAllSpaceRecords() {
        return records.map((record) => ({ ...record, cid: 'bafyrecord' }));
      },
    }),
  );
}

/** @param {string} iso */
function tidAt(iso) {
  vi.useFakeTimers();
  vi.setSystemTime(new Date(iso));
  const tid = createTid();
  vi.useRealTimers();
  return tid;
}

describe('space browser countRecords', () => {
  it('reports the newest write per collection', async () => {
    // Minted in time order: createTid is monotonic, so a TID asked for an
    // earlier time than the last one comes back with the last one's time.
    const gallery = tidAt('2026-05-02');
    const firstPhoto = tidAt('2026-06-01');
    const middlePhoto = tidAt('2026-07-04');
    const newestPhoto = tidAt('2026-08-09');
    const browser = browserOver([
      { collection: 'social.grain.photo', rkey: firstPhoto },
      { collection: 'social.grain.photo', rkey: newestPhoto },
      { collection: 'social.grain.photo', rkey: middlePhoto },
      { collection: 'social.grain.gallery', rkey: gallery },
    ]);
    expect(await browser.countRecords(SPACE)).toEqual([
      {
        collection: 'social.grain.gallery',
        count: 1,
        lastRecordAt: Date.parse('2026-05-02'),
      },
      {
        collection: 'social.grain.photo',
        count: 3,
        lastRecordAt: Date.parse('2026-08-09'),
      },
    ]);
  });

  it('counts a record whose rkey is not a TID, and reads no time from it', async () => {
    const browser = browserOver([
      { collection: 'social.grain.profile', rkey: 'self' },
    ]);
    expect(await browser.countRecords(SPACE)).toEqual([
      { collection: 'social.grain.profile', count: 1, lastRecordAt: null },
    ]);
  });

  it('returns nothing for a space that holds no records', async () => {
    expect(await browserOver([]).countRecords(SPACE)).toEqual([]);
  });
});