📄 src/web3/registry/sidecar-sources.test.ts
D-OPEN SOVEREIGN
1import { describe, it, expect } from 'vitest';
2import { sidecarUrlsFromManifest, type V2DataBlock } from './sidecar-sources';
3
4describe('sidecarUrlsFromManifest', () => {
5  it('resolves shard-0 urls for each tier in the requested language', () => {
6    const data: V2DataBlock = {
7      objects: {
8        '3': {
9          eng: { slim: ['tx-slim'], extended: ['tx-ext'], prov: ['tx-prov'] },
10        },
11      },
12    };
13
14    const result = sidecarUrlsFromManifest(data, 'eng');
15
16    expect(result).toEqual([
17      {
18        objectType: 3,
19        slimUrl: 'https://arweave.net/tx-slim',
20        extendedUrl: 'https://arweave.net/tx-ext',
21        provUrl: 'https://arweave.net/tx-prov',
22      },
23    ]);
24  });
25
26  it('skips object types missing the requested language', () => {
27    const data: V2DataBlock = {
28      objects: {
29        '1': { fra: { slim: ['x'] } },
30      },
31    };
32
33    expect(sidecarUrlsFromManifest(data, 'eng')).toEqual([]);
34  });
35
36  it('leaves a tier url undefined when that tier has no shards', () => {
37    const data: V2DataBlock = {
38      objects: {
39        '2': { eng: { slim: ['only-slim'] } },
40      },
41    };
42
43    const [entry] = sidecarUrlsFromManifest(data, 'eng');
44    expect(entry.slimUrl).toBe('https://arweave.net/only-slim');
45    expect(entry.extendedUrl).toBeUndefined();
46    expect(entry.provUrl).toBeUndefined();
47  });
48
49  it('strips trailing slashes from a custom gateway', () => {
50    const data: V2DataBlock = {
51      objects: { '1': { eng: { slim: ['abc'] } } },
52    };
53
54    const [entry] = sidecarUrlsFromManifest(data, 'eng', 'https://my.gateway/');
55    expect(entry.slimUrl).toBe('https://my.gateway/abc');
56  });
57
58  it('returns an empty array when there are no objects at all', () => {
59    expect(sidecarUrlsFromManifest({}, 'eng')).toEqual([]);
60  });
61
62  it('takes only the first shard when a tier has multiple shards', () => {
63    const data: V2DataBlock = {
64      objects: { '1': { eng: { slim: ['first', 'second'] } } },
65    };
66
67    const [entry] = sidecarUrlsFromManifest(data, 'eng');
68    expect(entry.slimUrl).toBe('https://arweave.net/first');
69  });
70});
71