@simonecoelhosfo/optimizely-mcp-server
Version:
Optimizely MCP Server for AI assistants with integrated CLI tools
71 lines • 3.37 kB
JavaScript
/**
* Definitive test to prove cache invalidation works
*/
import { CacheOrchestrator } from './cache/CacheOrchestrator.js';
import Database from 'better-sqlite3';
console.log('Testing Cache Invalidation Behavior\n');
async function testInvalidation() {
// Setup in-memory database
const db = new Database(':memory:');
db.exec(`
CREATE TABLE flags (
id TEXT PRIMARY KEY,
key TEXT NOT NULL,
name TEXT,
enabled INTEGER
);
INSERT INTO flags VALUES ('1', 'flag_a', 'Flag A', 1);
INSERT INTO flags VALUES ('2', 'flag_b', 'Flag B', 0);
`);
// Create cache orchestrator
const cache = new CacheOrchestrator({ enabled: true });
let dbQueryCount = 0;
// Mock executor that queries the database
const queryExecutor = async (query) => {
dbQueryCount++;
console.log(`\nDatabase Query #${dbQueryCount}`);
// Execute actual SQL query
const rows = db.prepare('SELECT key, name FROM flags WHERE enabled = 1').all();
console.log(` Found ${rows.length} enabled flags:`, rows.map((r) => r.key).join(', '));
return {
data: rows,
metadata: {
rowCount: rows.length,
executionTime: 10,
cacheHit: false
}
};
};
const query = { find: 'flags', where: [{ field: 'enabled', operator: '=', value: 1 }] };
console.log('=== Step 1: Initial Query ===');
const result1 = await cache.executeWithCache(query, queryExecutor);
console.log(`Result: ${result1.data.data.length} flags, Cached: ${result1.cached}`);
console.log('\n=== Step 2: Same Query (Should Use Cache) ===');
const result2 = await cache.executeWithCache(query, queryExecutor);
console.log(`Result: ${result2.data.data.length} flags, Cached: ${result2.cached}`);
console.log(`Database queries so far: ${dbQueryCount} (should be 1)`);
console.log('\n=== Step 3: Update Database ===');
db.prepare('UPDATE flags SET enabled = 1 WHERE key = ?').run('flag_b');
console.log(' Updated flag_b to enabled=1');
console.log('\n=== Step 4: Query Again (Still Using Old Cache) ===');
const result3 = await cache.executeWithCache(query, queryExecutor);
console.log(` Result: ${result3.data.data.length} flags (WRONG - should be 2)`);
console.log(`Database queries so far: ${dbQueryCount} (still 1 - using cache)`);
console.log('\n=== Step 5: Invalidate Cache ===');
const invalidated = await cache.invalidate(['iqe:flags:*']);
console.log(` Invalidated ${invalidated} cache entries`);
console.log('\n=== Step 6: Query After Invalidation ===');
const result4 = await cache.executeWithCache(query, queryExecutor);
console.log(`Result: ${result4.data.data.length} flags (CORRECT - fresh from DB)`);
console.log(`Database queries total: ${dbQueryCount} (should be 2)`);
console.log('\n=== Summary ===');
console.log(`Cache prevented ${1} unnecessary database query`);
console.log(`Invalidation forced fresh data fetch when needed`);
console.log(`Data consistency maintained after updates`);
// Show cache stats
const stats = cache.getStats();
console.log(`\nFinal Cache Stats:`, stats);
cache.shutdown();
}
testInvalidation().catch(console.error);
//# sourceMappingURL=test-cache-invalidation-proof.js.map