* Add monthly install tracking for per-package install charts Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Incremental aggregation with watermark, event pruning, and API fixes Switch from full-recompute to watermark-based incremental aggregation that only processes new events. Add 365-day event retention with pruning. Fix migration to not seed data (avoids double-counting on first run). Cap monthly installs API to 36 months and add error logging. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Scott Walkinshaw <scott.walkinshaw@gmail.com>
40 lines
1.2 KiB
Go
40 lines
1.2 KiB
Go
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
"testing"
|
|
|
|
wppackagesgo "github.com/roots/wp-packages"
|
|
)
|
|
|
|
func TestMigrateCreatesPackageStatsAndFTS(t *testing.T) {
|
|
dbPath := t.TempDir() + "/test.db"
|
|
database, err := Open(dbPath)
|
|
if err != nil {
|
|
t.Fatalf("opening db: %v", err)
|
|
}
|
|
t.Cleanup(func() { _ = database.Close() })
|
|
|
|
if err := Migrate(database, wppackagesgo.Migrations); err != nil {
|
|
t.Fatalf("running migrations: %v", err)
|
|
}
|
|
|
|
assertObjectExists(t, database, "table", "package_stats")
|
|
assertObjectExists(t, database, "table", "monthly_installs")
|
|
assertObjectExists(t, database, "table", "packages_fts")
|
|
assertObjectExists(t, database, "trigger", "packages_fts_insert")
|
|
assertObjectExists(t, database, "trigger", "packages_fts_update")
|
|
assertObjectExists(t, database, "trigger", "packages_fts_delete")
|
|
}
|
|
|
|
func assertObjectExists(t *testing.T, database *sql.DB, objType, name string) {
|
|
t.Helper()
|
|
var count int
|
|
err := database.QueryRow(`SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?`, objType, name).Scan(&count)
|
|
if err != nil {
|
|
t.Fatalf("querying sqlite_master for %s %s: %v", objType, name, err)
|
|
}
|
|
if count != 1 {
|
|
t.Fatalf("expected %s %s to exist", objType, name)
|
|
}
|
|
}
|