@joystick.js/db-canary
Version:
JoystickDB - A minimalist database server for the Joystick framework
76 lines (63 loc) • 2.44 kB
JavaScript
import test from 'ava';
import sinon from 'sinon';
import {
initialize_database,
get_database,
generate_document_id,
build_collection_key,
parse_collection_key,
cleanup_database
} from '../../../src/server/lib/query_engine.js';
test.afterEach(async () => {
// Clean up database connections after each test
await cleanup_database(true); // Remove test database directory
});
test('query_engine - should throw if get_database called before initialization', (t) => {
const original_db_instance = global.db_instance;
global.db_instance = null;
t.throws(() => get_database(), { message: 'Database not initialized. Call initialize_database first.' });
global.db_instance = original_db_instance;
});
test('query_engine - should initialize database and return instance', (t) => {
const db = initialize_database('./test_data');
t.truthy(db);
});
test('query_engine - should return same instance on multiple initialize calls', (t) => {
const db1 = initialize_database('./test_data');
const db2 = initialize_database('./test_data');
t.is(db1, db2);
});
test('query_engine - should generate unique document ids', (t) => {
const id1 = generate_document_id();
const id2 = generate_document_id();
t.not(id1, id2);
});
test('query_engine - should generate 16-character alphanumeric document ids', (t) => {
const id = generate_document_id();
// Should be exactly 16 characters
t.is(id.length, 16);
// Should only contain alphanumeric characters (A-Z, a-z, 0-9)
const alphanumeric_regex = /^[A-Za-z0-9]+$/;
t.true(alphanumeric_regex.test(id));
// Should not contain hyphens or other punctuation
t.false(id.includes('-'));
t.false(id.includes('_'));
t.false(id.includes('.'));
});
test('query_engine - should generate cryptographically secure document ids', (t) => {
// Generate multiple IDs to check for randomness
const ids = new Set();
for (let i = 0; i < 1000; i++) {
const id = generate_document_id();
t.false(ids.has(id), `Duplicate ID generated: ${id}`);
ids.add(id);
}
// All IDs should be unique
t.is(ids.size, 1000);
});
test('query_engine - should build and parse collection keys correctly', (t) => {
const key = build_collection_key('default', 'users', 'abc123');
t.is(key, 'default:users:abc123');
const parsed = parse_collection_key(key);
t.deepEqual(parsed, { database: 'default', collection: 'users', document_id: 'abc123' });
});