📄 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