#!/usr/bin/env tsx
/**
* Test script for ChurnFlow Database functionality
* Run with: npx tsx src/storage/test-db.ts
*/
import { DatabaseManager } from './DatabaseManager.js';
import { NewCapture, NewContext } from './schema.js';
async function testDatabase() {
console.log('π§ͺ Testing ChurnFlow Database System\n');
const db = new DatabaseManager({ dbPath: './test-churnflow.db' });
try {
// Initialize database
await db.initialize();
// Get existing context or create new one
console.log('π Getting test context...');
let workContext = await db.getContextByName('work');
if (!workContext) {
workContext = await db.createContext({
name: 'work-test',
displayName: 'Work Test',
description: 'Test work context',
keywords: JSON.stringify(['work', 'business', 'project']),
patterns: JSON.stringify([]),
priority: 10,
});
console.log('β
Created context:', workContext.displayName);
} else {
console.log('β
Using existing context:', workContext.displayName);
}
// Test capture creation
console.log('\nπ Creating test captures...');
const captures: NewCapture[] = [
{
content: 'Call client about project deadline',
captureType: 'action',
priority: 'high',
status: 'inbox',
contextId: workContext.id,
},
{
content: 'Research new productivity tools',
rawInput: 'maybe look into new productivity tools',
captureType: 'someday',
priority: 'low',
status: 'someday',
contextId: workContext.id,
confidence: 0.3,
aiReasoning: 'Low priority research task, good for someday/maybe',
tags: JSON.stringify(['research', 'tools']),
keywords: JSON.stringify(['research', 'productivity', 'tools']),
},
{
content: 'Read article about ADHD productivity techniques',
captureType: 'reference',
priority: 'medium',
status: 'inbox',
tags: JSON.stringify(['adhd', 'productivity', 'reference']),
keywords: JSON.stringify(['adhd', 'productivity', 'techniques']),
}
];
for (const capture of captures) {
const created = await db.createCapture(capture);
console.log(`β
Created ${capture.captureType}: ${created.content.substring(0, 50)}...`);
}
// Test dashboard stats
console.log('\nπ Dashboard Stats:');
const stats = await db.getDashboardStats();
console.log(' π₯ Inbox:', stats.inbox);
console.log(' π― Active:', stats.active);
console.log(' β
Completed:', stats.completed);
console.log(' π Needing Review:', stats.needingReview);
console.log(' β οΈ Overdue:', stats.overdue);
// Test review system
console.log('\nπ Items needing review:');
const needsReview = await db.getCapturesNeedingReview(5);
for (const item of needsReview) {
console.log(` β’ [${item.priority.toUpperCase()}] ${item.content.substring(0, 60)}...`);
console.log(` Status: ${item.status} | Type: ${item.captureType}`);
}
// Test search
console.log('\nπ Testing search for "productivity":');
const searchResults = await db.searchCaptures('productivity', 3);
for (const result of searchResults) {
console.log(` β’ ${result.content.substring(0, 60)}...`);
}
// Test marking items as reviewed
if (needsReview.length > 0) {
console.log('\nβ
Marking first item as reviewed...');
const success = await db.markCaptureReviewed(
needsReview[0].id,
'Reviewed during testing'
);
console.log(' Review marked:', success ? 'β
Success' : 'β Failed');
}
// Test updating capture status
if (captures.length > 0) {
console.log('\nπ― Moving first capture to active...');
const firstCapture = await db.getCaptureById(needsReview[0]?.id || '');
if (firstCapture) {
const updated = await db.updateCapture(firstCapture.id, {
status: 'active',
lastReviewedAt: new Date().toISOString()
});
console.log(' Status updated:', updated ? 'β
Success' : 'β Failed');
}
}
// Test next actions
console.log('\nπ Next Actions:');
const nextActions = await db.getNextActions(3);
for (const action of nextActions) {
console.log(` β’ [${action.priority.toUpperCase()}] ${action.content.substring(0, 60)}...`);
}
console.log('\nπ All tests completed successfully!');
} catch (error) {
console.error('β Test failed:', error);
} finally {
await db.close();
console.log('\nπ Database connection closed');
}
}
// Run the test
testDatabase().catch(console.error);