Files
ttrpg-initiative-tracker/src/tests/storage.factory.test.js
T

71 lines
2.2 KiB
JavaScript
Raw Normal View History

// Storage factory (index.js) test.
// Verifies getStorage() returns the right adapter per REACT_APP_STORAGE env,
// caches as singleton, and getStorageMode() reports the active mode.
// Adapters are mocked (no network/init) — factory routing is the unit.
import { getStorage, getStorageMode } from '../storage/index';
// reset module-level singleton between tests
let originalStorage;
beforeEach(() => {
originalStorage = process.env.REACT_APP_STORAGE;
// bust the module singleton by re-importing fresh
jest.resetModules();
});
afterEach(() => {
if (originalStorage === undefined) delete process.env.REACT_APP_STORAGE;
else process.env.REACT_APP_STORAGE = originalStorage;
jest.resetModules();
});
describe('getStorageMode', () => {
test('defaults to firebase when env unset', () => {
delete process.env.REACT_APP_STORAGE;
const { getStorageMode } = require('../storage/index');
expect(getStorageMode()).toBe('firebase');
});
test('returns ws when REACT_APP_STORAGE=ws', () => {
process.env.REACT_APP_STORAGE = 'ws';
const { getStorageMode } = require('../storage/index');
expect(getStorageMode()).toBe('ws');
});
test('throws on unknown mode', () => {
process.env.REACT_APP_STORAGE = 'garbage';
const { getStorage } = require('../storage/index');
expect(() => getStorage()).toThrow(/Unknown REACT_APP_STORAGE/);
});
});
describe('getStorage factory routing', () => {
test('ws mode returns ws adapter (init may fail without backend — catch)', () => {
process.env.REACT_APP_STORAGE = 'ws';
const { getStorage } = require('../storage/index');
try {
const s = getStorage();
expect(s).toBeTruthy();
expect(typeof s.getDoc).toBe('function');
} catch (e) {
// ws adapter without backend URL/config is allowed to throw at factory;
// routing reached ws branch (not firebase) which is the contract.
expect(e).toBeTruthy();
}
});
test('returns singleton on repeat call (same instance)', () => {
process.env.REACT_APP_STORAGE = 'ws';
const { getStorage } = require('../storage/index');
let a;
try { a = getStorage(); } catch (e) { return; } // no backend ok
if (a) {
const b = getStorage();
expect(a).toBe(b);
}
});
});