46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||
|
|
import type { User } from '$lib/api/types';
|
||
|
|
|
||
|
|
// `vi.mock` is hoisted above imports, so the spy it references must be created
|
||
|
|
// with `vi.hoisted` (a plain top-level const isn't initialised yet when the
|
||
|
|
// factory runs).
|
||
|
|
const { fetchMeMock } = vi.hoisted(() => ({ fetchMeMock: vi.fn() }));
|
||
|
|
|
||
|
|
vi.mock('$lib/api/endpoints/auth', () => ({
|
||
|
|
fetchMe: () => fetchMeMock(),
|
||
|
|
tryRefresh: vi.fn(async () => false)
|
||
|
|
}));
|
||
|
|
|
||
|
|
import { session } from './session.svelte';
|
||
|
|
|
||
|
|
const userWithUsage = (used: number) => ({ storage_used_bytes: used }) as unknown as User;
|
||
|
|
|
||
|
|
describe('session.refresh', () => {
|
||
|
|
beforeEach(() => {
|
||
|
|
fetchMeMock.mockReset();
|
||
|
|
session.reset();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('pulls the fresh storage usage into the reactive user (upload/delete sync)', async () => {
|
||
|
|
fetchMeMock.mockResolvedValue(userWithUsage(2048));
|
||
|
|
await session.refresh();
|
||
|
|
expect(session.user?.storage_used_bytes).toBe(2048);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('leaves the current user intact when the probe returns null', async () => {
|
||
|
|
fetchMeMock.mockResolvedValue(userWithUsage(2048));
|
||
|
|
await session.refresh();
|
||
|
|
fetchMeMock.mockResolvedValue(null);
|
||
|
|
await session.refresh();
|
||
|
|
expect(session.user?.storage_used_bytes).toBe(2048);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('leaves the current user intact when the probe throws', async () => {
|
||
|
|
fetchMeMock.mockResolvedValue(userWithUsage(2048));
|
||
|
|
await session.refresh();
|
||
|
|
fetchMeMock.mockRejectedValue(new Error('network'));
|
||
|
|
await session.refresh();
|
||
|
|
expect(session.user?.storage_used_bytes).toBe(2048);
|
||
|
|
});
|
||
|
|
});
|