import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import { DatabaseManager } from '../../src/services/database-manager';
import { createPatternSeeder } from '../../src/services/pattern-seeder';
import path from 'path';
async function createFullSchema(dbManager: DatabaseManager): Promise<void> {
// Drop existing tables to ensure clean schema
dbManager.execute('DROP TABLE IF EXISTS pattern_embeddings');
dbManager.execute('DROP TABLE IF EXISTS pattern_relationships');
dbManager.execute('DROP TABLE IF EXISTS pattern_implementations');
dbManager.execute('DROP TABLE IF EXISTS patterns');
// Create patterns table with all columns including examples
dbManager.execute(`
CREATE TABLE patterns (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
category TEXT NOT NULL,
description TEXT NOT NULL,
when_to_use TEXT,
benefits TEXT,
drawbacks TEXT,
use_cases TEXT,
complexity TEXT NOT NULL,
tags TEXT,
examples TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// Create pattern_implementations table
dbManager.execute(`
CREATE TABLE IF NOT EXISTS pattern_implementations (
id TEXT PRIMARY KEY,
pattern_id TEXT NOT NULL,
language TEXT NOT NULL,
approach TEXT NOT NULL,
code TEXT NOT NULL,
explanation TEXT NOT NULL,
dependencies TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pattern_id) REFERENCES patterns(id) ON DELETE CASCADE
)
`);
// Create pattern_relationships table
dbManager.execute(`
CREATE TABLE IF NOT EXISTS pattern_relationships (
id TEXT PRIMARY KEY,
source_pattern_id TEXT NOT NULL,
target_pattern_id TEXT NOT NULL,
type TEXT NOT NULL,
strength REAL DEFAULT 1.0,
description TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (source_pattern_id) REFERENCES patterns(id) ON DELETE CASCADE,
FOREIGN KEY (target_pattern_id) REFERENCES patterns(id) ON DELETE CASCADE
)
`);
// Create pattern_embeddings table
dbManager.execute(`
CREATE TABLE IF NOT EXISTS pattern_embeddings (
pattern_id TEXT PRIMARY KEY,
embedding TEXT NOT NULL,
model TEXT NOT NULL,
strategy TEXT NOT NULL,
dimensions INTEGER NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// Create indexes
dbManager.execute('CREATE INDEX IF NOT EXISTS idx_patterns_category ON patterns(category)');
dbManager.execute('CREATE INDEX IF NOT EXISTS idx_patterns_complexity ON patterns(complexity)');
dbManager.execute(
'CREATE INDEX IF NOT EXISTS idx_pattern_implementations_pattern_id ON pattern_implementations(pattern_id)'
);
dbManager.execute(
'CREATE INDEX IF NOT EXISTS idx_pattern_implementations_language ON pattern_implementations(language)'
);
dbManager.execute(
'CREATE INDEX IF NOT EXISTS idx_pattern_relationships_source ON pattern_relationships(source_pattern_id)'
);
dbManager.execute(
'CREATE INDEX IF NOT EXISTS idx_pattern_relationships_target ON pattern_relationships(target_pattern_id)'
);
dbManager.execute(
'CREATE INDEX IF NOT EXISTS idx_pattern_relationships_type ON pattern_relationships(type)'
);
}
describe('Cloud-Native Patterns', () => {
let dbManager: DatabaseManager;
beforeAll(async () => {
// Initialize test database
dbManager = new DatabaseManager({
filename: ':memory:',
options: { readonly: false },
});
await dbManager.initialize();
// Create full schema manually (since migrations fail on in-memory DBs with existing tables)
await createFullSchema(dbManager);
// Seed patterns for testing
const seeder = createPatternSeeder(dbManager, {
patternsPath: path.resolve(__dirname, '../../data/patterns'),
batchSize: 10,
skipExisting: false,
});
const result = await seeder.seedAll();
if (!result.success) {
throw new Error(`Failed to seed patterns: ${result.message}`);
}
});
afterAll(async () => {
if (dbManager) {
await dbManager.close();
}
});
it('should recommend Circuit Breaker for fault tolerance', () => {
const circuitBreaker = dbManager.queryOne(
'SELECT * FROM patterns WHERE name = ? AND category = ?',
['Circuit Breaker', 'Cloud-Native']
);
expect(circuitBreaker).toBeTruthy();
expect(circuitBreaker!.name).toBe('Circuit Breaker');
expect(circuitBreaker!.category).toBe('Cloud-Native');
});
it('should recommend Retry Pattern for fault tolerance', () => {
const retryPattern = dbManager.queryOne(
'SELECT * FROM patterns WHERE name = ? AND category = ?',
['Retry Pattern', 'Cloud-Native']
);
expect(retryPattern).toBeTruthy();
expect(retryPattern!.name).toBe('Retry Pattern');
expect(retryPattern!.category).toBe('Cloud-Native');
});
it('should recommend Bulkhead Pattern for resource isolation', () => {
const bulkhead = dbManager.queryOne('SELECT * FROM patterns WHERE name = ? AND category = ?', [
'Bulkhead Pattern',
'Cloud-Native',
]);
expect(bulkhead).toBeTruthy();
expect(bulkhead!.name).toBe('Bulkhead Pattern');
expect(bulkhead!.category).toBe('Cloud-Native');
});
it('should recommend Timeout Pattern for resource protection', () => {
const timeout = dbManager.queryOne('SELECT * FROM patterns WHERE name = ? AND category = ?', [
'Timeout Pattern',
'Cloud-Native',
]);
expect(timeout).toBeTruthy();
expect(timeout!.name).toBe('Timeout Pattern');
expect(timeout!.category).toBe('Cloud-Native');
});
it('should include Kubernetes patterns', () => {
const cloudPatterns = dbManager.query('SELECT * FROM patterns WHERE category = ?', [
'Cloud-Native',
]);
expect(cloudPatterns.length).toBeGreaterThan(5);
});
});