Move store package to improve reusability and follow Go project conventions: - cmd/tui/internal/store/store.go -> internal/store/store.go - cmd/tui/internal/store/store_test.go -> internal/store/store_test.go This makes the store package available to other components beyond the TUI, reducing coupling and enabling future reuse by API server, CLI, or other tools.
113 lines
2.5 KiB
Go
113 lines
2.5 KiB
Go
package store_test
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/jfraeys/fetch_ml/internal/store"
|
|
)
|
|
|
|
func TestOpen(t *testing.T) {
|
|
dbPath := "/tmp/test_fetchml.db"
|
|
defer os.Remove(dbPath)
|
|
defer os.Remove(dbPath + "-wal")
|
|
defer os.Remove(dbPath + "-shm")
|
|
|
|
s, err := store.Open(dbPath)
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer s.Close()
|
|
|
|
if s.DB() == nil {
|
|
t.Fatal("Database connection is nil")
|
|
}
|
|
}
|
|
|
|
func TestGetUnsyncedRuns(t *testing.T) {
|
|
dbPath := "/tmp/test_fetchml_unsynced.db"
|
|
defer os.Remove(dbPath)
|
|
defer os.Remove(dbPath + "-wal")
|
|
defer os.Remove(dbPath + "-shm")
|
|
|
|
s, err := store.Open(dbPath)
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer s.Close()
|
|
|
|
// Insert test data using exported DB()
|
|
_, err = s.DB().Exec(`
|
|
INSERT INTO ml_experiments (experiment_id, name) VALUES ('exp1', 'Test Experiment');
|
|
`)
|
|
if err != nil {
|
|
t.Fatalf("Failed to insert experiment: %v", err)
|
|
}
|
|
|
|
_, err = s.DB().Exec(`
|
|
INSERT INTO ml_runs (run_id, experiment_id, name, status, synced)
|
|
VALUES ('run1', 'exp1', 'Test Run', 'FINISHED', 0);
|
|
`)
|
|
if err != nil {
|
|
t.Fatalf("Failed to insert run: %v", err)
|
|
}
|
|
|
|
runs, err := s.GetUnsyncedRuns()
|
|
if err != nil {
|
|
t.Fatalf("Failed to get unsynced runs: %v", err)
|
|
}
|
|
|
|
if len(runs) != 1 {
|
|
t.Fatalf("Expected 1 unsynced run, got %d", len(runs))
|
|
}
|
|
|
|
if runs[0].RunID != "run1" {
|
|
t.Fatalf("Expected run_id 'run1', got '%s'", runs[0].RunID)
|
|
}
|
|
}
|
|
|
|
func TestMarkRunSynced(t *testing.T) {
|
|
dbPath := "/tmp/test_fetchml_sync.db"
|
|
defer os.Remove(dbPath)
|
|
defer os.Remove(dbPath + "-wal")
|
|
defer os.Remove(dbPath + "-shm")
|
|
|
|
s, err := store.Open(dbPath)
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer s.Close()
|
|
|
|
// Insert test data
|
|
_, err = s.DB().Exec(`
|
|
INSERT INTO ml_experiments (experiment_id, name) VALUES ('exp1', 'Test Experiment');
|
|
`)
|
|
if err != nil {
|
|
t.Fatalf("Failed to insert experiment: %v", err)
|
|
}
|
|
|
|
_, err = s.DB().Exec(`
|
|
INSERT INTO ml_runs (run_id, experiment_id, name, status, synced)
|
|
VALUES ('run1', 'exp1', 'Test Run', 'FINISHED', 0);
|
|
`)
|
|
if err != nil {
|
|
t.Fatalf("Failed to insert run: %v", err)
|
|
}
|
|
|
|
// Mark as synced
|
|
err = s.MarkRunSynced("run1")
|
|
if err != nil {
|
|
t.Fatalf("Failed to mark run as synced: %v", err)
|
|
}
|
|
|
|
// Verify using exported DB()
|
|
var synced int
|
|
err = s.DB().QueryRow("SELECT synced FROM ml_runs WHERE run_id = 'run1'").Scan(&synced)
|
|
if err != nil {
|
|
t.Fatalf("Failed to query run: %v", err)
|
|
}
|
|
|
|
if synced != 1 {
|
|
t.Fatalf("Expected synced=1, got %d", synced)
|
|
}
|
|
}
|