86 lines
3.3 KiB
TypeScript
86 lines
3.3 KiB
TypeScript
import * as os from 'os';
|
||
import * as path from 'path';
|
||
import * as fs from 'fs';
|
||
import { StorageInterface } from '../storage/StorageInterface';
|
||
import { resetMemoryStorage } from '../storage/memory';
|
||
import MemoryStorage from '../storage/memory';
|
||
import JsonStorage from '../storage/json';
|
||
|
||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'luncher-test-'));
|
||
const tempDbPath = path.join(tempDir, 'test-db.json');
|
||
|
||
// Parametrické spuštění stejné sady testů pro obě implementace
|
||
const implementations: [string, () => StorageInterface, () => void][] = [
|
||
['MemoryStorage', () => new MemoryStorage(), resetMemoryStorage],
|
||
['JsonStorage', () => {
|
||
// Zajistíme čistý stav souboru před každým testem
|
||
if (fs.existsSync(tempDbPath)) {
|
||
fs.unlinkSync(tempDbPath);
|
||
}
|
||
// JsonStorage načte/vytvoří soubor při inicializaci, musíme obalit
|
||
const JsonStorageDynamic = require('../storage/json').default;
|
||
// Přepíšeme dbPath přes prototyp – pro testy použijeme tmpdir
|
||
const inst = Object.create(JsonStorageDynamic.prototype);
|
||
const JSONdb = require('simple-json-db');
|
||
(inst as any).db = new JSONdb(tempDbPath);
|
||
inst.hasData = async (key: string) => Promise.resolve((inst as any).db.has(key));
|
||
inst.getData = async (key: string) => (inst as any).db.get(key);
|
||
inst.setData = async (key: string, data: any) => { (inst as any).db.set(key, data); return Promise.resolve(); };
|
||
return inst;
|
||
}, () => {
|
||
if (fs.existsSync(tempDbPath)) {
|
||
fs.unlinkSync(tempDbPath);
|
||
}
|
||
}],
|
||
];
|
||
|
||
describe.each(implementations)('%s splňuje StorageInterface kontrakt', (name, factory, reset) => {
|
||
let storage: StorageInterface;
|
||
|
||
beforeEach(() => {
|
||
reset();
|
||
storage = factory();
|
||
});
|
||
|
||
test('hasData vrátí false pro neexistující klíč', async () => {
|
||
expect(await storage.hasData('neexistujici')).toBe(false);
|
||
});
|
||
|
||
test('setData + hasData vrátí true', async () => {
|
||
await storage.setData('klic', { value: 1 });
|
||
expect(await storage.hasData('klic')).toBe(true);
|
||
});
|
||
|
||
test('setData + getData vrátí uložená data', async () => {
|
||
const data = { name: 'Jan', score: 42 };
|
||
await storage.setData('testkey', data);
|
||
const result = await storage.getData('testkey');
|
||
expect(result).toEqual(data);
|
||
});
|
||
|
||
test('getData pro neexistující klíč vrátí undefined', async () => {
|
||
const result = await storage.getData('neexistujici');
|
||
expect(result).toBeUndefined();
|
||
});
|
||
|
||
test('setData přepíše existující data', async () => {
|
||
await storage.setData('klic', { version: 1 });
|
||
await storage.setData('klic', { version: 2 });
|
||
const result = await storage.getData<{ version: number }>('klic');
|
||
expect(result?.version).toBe(2);
|
||
});
|
||
|
||
test('různé klíče jsou nezávislé', async () => {
|
||
await storage.setData('a', { val: 'A' });
|
||
await storage.setData('b', { val: 'B' });
|
||
expect((await storage.getData<{ val: string }>('a'))?.val).toBe('A');
|
||
expect((await storage.getData<{ val: string }>('b'))?.val).toBe('B');
|
||
});
|
||
});
|
||
|
||
afterAll(() => {
|
||
if (fs.existsSync(tempDir)) {
|
||
fs.rmSync(tempDir, { recursive: true });
|
||
}
|
||
});
|