Files
caddy-proxy-manager/tests/integration/settings.test.ts
akanealw 99819b70ff
Some checks failed
Build and Push Docker Images (Trusted) / build-and-push (., docker/caddy/Dockerfile, caddy) (push) Has been cancelled
Build and Push Docker Images (Trusted) / build-and-push (., docker/l4-port-manager/Dockerfile, l4-port-manager) (push) Has been cancelled
Build and Push Docker Images (Trusted) / build-and-push (., docker/web/Dockerfile, web) (push) Has been cancelled
Tests / test (push) Has been cancelled
added caddy-proxy-manager for testing
2026-04-21 22:49:08 +00:00

91 lines
2.9 KiB
TypeScript
Executable File

import { describe, it, expect, beforeEach } from 'vitest';
import { createTestDb, type TestDb } from '../helpers/db';
import { settings } from '@/src/lib/db/schema';
import { eq } from 'drizzle-orm';
let db: TestDb;
beforeEach(() => {
db = createTestDb();
});
function nowIso() {
return new Date().toISOString();
}
async function setSetting(key: string, value: unknown) {
const payload = JSON.stringify(value);
const now = nowIso();
await db.insert(settings).values({ key, value: payload, updatedAt: now })
.onConflictDoUpdate({ target: settings.key, set: { value: payload, updatedAt: now } });
}
async function getSetting<T>(key: string): Promise<T | null> {
const row = await db.query.settings.findFirst({ where: (t, { eq }) => eq(t.key, key) });
if (!row) return null;
try {
return JSON.parse(row.value) as T;
} catch {
return null;
}
}
describe('settings integration', () => {
it('get non-existent key returns null', async () => {
const value = await getSetting('nonexistent');
expect(value).toBeNull();
});
it('set key — stored in db', async () => {
await setSetting('test-key', 'test-value');
const row = await db.query.settings.findFirst({ where: (t, { eq }) => eq(t.key, 'test-key') });
expect(row).toBeDefined();
});
it('get key returns same value that was set', async () => {
await setSetting('my-key', 'hello world');
const value = await getSetting<string>('my-key');
expect(value).toBe('hello world');
});
it('update existing key overwrites value', async () => {
await setSetting('update-key', 'initial');
await setSetting('update-key', 'updated');
const value = await getSetting<string>('update-key');
expect(value).toBe('updated');
});
it('stores object and retrieves it correctly', async () => {
const obj = { enabled: true, resolvers: ['1.1.1.1', '8.8.8.8'], timeout: '5s' };
await setSetting('dns', obj);
const retrieved = await getSetting<typeof obj>('dns');
expect(retrieved).toEqual(obj);
});
it('stores boolean true correctly', async () => {
await setSetting('bool-key', true);
const value = await getSetting<boolean>('bool-key');
expect(value).toBe(true);
});
it('stores number correctly', async () => {
await setSetting('num-key', 42);
const value = await getSetting<number>('num-key');
expect(value).toBe(42);
});
it('multiple keys are independent', async () => {
await setSetting('key-a', 'value-a');
await setSetting('key-b', 'value-b');
expect(await getSetting<string>('key-a')).toBe('value-a');
expect(await getSetting<string>('key-b')).toBe('value-b');
});
it('delete setting removes it', async () => {
await setSetting('delete-me', 'value');
await db.delete(settings).where(eq(settings.key, 'delete-me'));
const value = await getSetting('delete-me');
expect(value).toBeNull();
});
});