test(stores): stub mutation locks in trust and nwc-drain harnesses

This commit is contained in:
2026-09-05 09:42:51 +02:00
parent ff9e8a073e
commit 7b7d4edaf3
2 changed files with 18 additions and 5 deletions
+5 -1
View File
@@ -69,7 +69,11 @@ const mints: Mint[] = [];
beforeEach(() => { beforeEach(() => {
vi.unstubAllGlobals(); vi.unstubAllGlobals();
vi.stubGlobal('navigator', {}); // fund mutations require Web Locks; this harness doesn't care about lock
// timing, so a present-but-non-serializing fake is enough
vi.stubGlobal('navigator', {
locks: { request: (_name: string, fn: () => unknown) => Promise.resolve().then(fn) },
});
stubLocalStorage(); stubLocalStorage();
setActivePinia(createPinia()); setActivePinia(createPinia());
}); });
+13 -4
View File
@@ -4,6 +4,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
import { deriveBearerAesKey } from '@/lnurlcash/keys'; import { deriveBearerAesKey } from '@/lnurlcash/keys';
import { loadBearers } from '@/lnurlcash/storage'; import { loadBearers } from '@/lnurlcash/storage';
import { FUNDS_STORAGE_KEY } from '@/lnurlcash/storage/bearers';
import { stubLocalStorage } from '@/lnurlcash/test-utils'; import { stubLocalStorage } from '@/lnurlcash/test-utils';
import type { NewBearer } from '@/lnurlcash/types'; import type { NewBearer } from '@/lnurlcash/types';
import { TrustedMintPostCommitError, useWalletStore } from './wallet'; import { TrustedMintPostCommitError, useWalletStore } from './wallet';
@@ -23,6 +24,14 @@ type LockRequest = {
readonly resolve: (value: unknown) => void; readonly resolve: (value: unknown) => void;
}; };
// fund mutations require Web Locks; tests that don't care about lock timing
// install a present-but-non-serializing fake
const stubPassthroughLocks = (): void => {
vi.stubGlobal('navigator', {
locks: { request: (_name: string, fn: () => unknown) => Promise.resolve().then(fn) },
});
};
class DeferredLocks { class DeferredLocks {
readonly requests: LockRequest[] = []; readonly requests: LockRequest[] = [];
@@ -46,7 +55,7 @@ beforeEach(() => {
describe('bearer commit trust side effect', () => { describe('bearer commit trust side effect', () => {
it('commits a combined addition and spent marker in one bearer write', async () => { it('commits a combined addition and spent marker in one bearer write', async () => {
vi.stubGlobal('navigator', {}); stubPassthroughLocks();
const storage = stubLocalStorage(); const storage = stubLocalStorage();
const wallet = useWalletStore(); const wallet = useWalletStore();
await wallet.create(); await wallet.create();
@@ -64,13 +73,13 @@ describe('bearer commit trust side effect', () => {
ownerFence, ownerFence,
]); ]);
expect(writes.mock.calls.filter(([key]) => key === 'sattle_bearers')).toHaveLength(1); expect(writes.mock.calls.filter(([key]) => key === FUNDS_STORAGE_KEY)).toHaveLength(1);
expect(wallet.bearers).toHaveLength(2); expect(wallet.bearers).toHaveLength(2);
expect(wallet.bearers.find(({ id }) => id === existing.id)?.spent).toBe(true); expect(wallet.bearers.find(({ id }) => id === existing.id)?.spent).toBe(true);
}); });
it('keeps an atomic changeset committed when trust convergence fails afterward', async () => { it('keeps an atomic changeset committed when trust convergence fails afterward', async () => {
vi.stubGlobal('navigator', {}); stubPassthroughLocks();
const storage = stubLocalStorage(); const storage = stubLocalStorage();
const wallet = useWalletStore(); const wallet = useWalletStore();
await wallet.create(); await wallet.create();
@@ -119,7 +128,7 @@ describe('bearer commit trust side effect', () => {
}); });
it('reports trust failure as post-commit while preserving durable funds', async () => { it('reports trust failure as post-commit while preserving durable funds', async () => {
vi.stubGlobal('navigator', {}); stubPassthroughLocks();
const storage = stubLocalStorage(); const storage = stubLocalStorage();
const wallet = useWalletStore(); const wallet = useWalletStore();
await wallet.create(); await wallet.create();