File size: 1,746 Bytes
8d2f1b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { afterAll, describe, expect, it } from 'vitest';
import type { ExpenseBody } from '../../src/lib/domain/types';
import { ulid } from '../../src/lib/domain/ulid';
import { Ledger } from '../../src/lib/server/ledger/ledger';
import { HfBucketStore } from '../../src/lib/server/storage/hf-bucket-store';
import { PrefixedStore } from '../../src/lib/server/storage/prefixed-store';
import { realBucket } from './env';

const creds = realBucket();
const body = (description: string): ExpenseBody => ({
	description, amountCents: 300, currency: 'USD', date: '2026-08-01', paidBy: 'u_a',
	split: { mode: 'equal', participants: ['u_a', 'u_b', 'u_c'] }, shares: { u_a: 100, u_b: 100, u_c: 100 }
});

describe.skipIf(!creds)(
	'Ledger against the real bucket',
	() => {
		const store = creds
			? new PrefixedStore(new HfBucketStore(creds.bucket, creds.token), `test/${ulid()}`)
			: (undefined as unknown as PrefixedStore);

		afterAll(() => store.wipe(), 60_000);

		it('writes events, compacts twice (append path), and reloads identically', async () => {
			const ledger = await Ledger.load(store);
			await ledger.createExpense('u_a', body('one'));
			await ledger.createExpense('u_a', body('two'));
			expect(await ledger.compact()).toMatchObject({ appended: 2, deleted: 2 });
			await ledger.createExpense('u_a', body('three'));
			expect(await ledger.compact()).toMatchObject({ appended: 1, deleted: 1, backedUp: true });
			expect(await store.list('events/')).toEqual([]);

			const reloaded = await Ledger.load(store);
			expect(reloaded.listExpenses().map((e) => e.description).sort()).toEqual(['one', 'three', 'two']);
			expect(reloaded.stats()).toEqual({ pendingEvents: 0, ledgerEvents: 3, ledgerExists: true });
		});
	},
	120_000
);