packages.wenpai.net/internal/testutil/testdb.go
Ben Word 7cb8fef01b
WP Packages rename (#42)
* Update all import paths

* Rename directory cmd/wpcomposer/ → cmd/wppackages/

* Rename import alias wpcomposergo → wppackagesgo in main.go and migrate_test.go

* Makefile — binary name wpcomposer → wppackages

* Update Air path

* Global replace repo.wp-composer.com → repo.wp-packages.org

* Global replace cdn.wp-composer.com → cdn.wp-packages.org

* Global replace wp-composer.com → wp-packages.org (remaining)

* Composer repo key in templates/docs: repositories.wp-composer → repositories.wp-packages

* Rename columns on the existing schema

* Update all Go code referencing these column names

* Routes & SEO

* Templates & front-end

* Admin UI

* Documentation

* CI/CD

* Config defaults

* Rename role directory

* Rename all systemd template files inside the role

* Update contents of all .j2 templates — service names, binary paths, descriptions

* Update tasks/main.yml and handlers/main.yml in the role

* Update deploy/ansible/roles/app/tasks/main.yml and deploy.yml

* Update deploy/ansible/group_vars/production/main.yml

* Additional renames/fixes

* Additional renames/fixes

* Additional renames/fixes

* not needed
2026-03-19 11:50:12 -05:00

113 lines
3 KiB
Go

package testutil
import (
"context"
"database/sql"
"log/slog"
"testing"
"time"
wppackagesgo "github.com/roots/wp-packages"
"github.com/roots/wp-packages/internal/config"
"github.com/roots/wp-packages/internal/db"
"github.com/roots/wp-packages/internal/packages"
"github.com/roots/wp-packages/internal/wporg"
)
// OpenTestDB opens an in-memory SQLite database and runs all migrations.
func OpenTestDB(t *testing.T) *sql.DB {
t.Helper()
database, err := db.Open(":memory:")
if err != nil {
t.Fatalf("opening test db: %v", err)
}
t.Cleanup(func() { _ = database.Close() })
if err := db.Migrate(database, wppackagesgo.Migrations); err != nil {
t.Fatalf("running migrations: %v", err)
}
return database
}
// SeedFromFixtures runs the discover + update pipeline against a mock wp.org
// server, populating the database with package data derived from fixtures.
func SeedFromFixtures(t *testing.T, database *sql.DB, mockURL string) {
t.Helper()
ctx := context.Background()
cfg := config.DiscoveryConfig{
APITimeoutS: 5,
MaxRetries: 1,
RetryDelayMs: 10,
Concurrency: 2,
}
client := wporg.NewClient(cfg, slog.Default())
client.SetBaseURL(mockURL)
// Discover: fetch last_updated for each fixture slug and create shell records
type seed struct {
slug string
pkgType string
}
seeds := []seed{
{"akismet", "plugin"},
{"classic-editor", "plugin"},
{"contact-form-7", "plugin"},
{"astra", "theme"},
{"twentytwentyfive", "theme"},
}
for _, s := range seeds {
lastUpdated, err := client.FetchLastUpdated(ctx, s.pkgType, s.slug)
if err != nil {
t.Fatalf("fetching last_updated for %s: %v", s.slug, err)
}
if err := packages.UpsertShellPackage(ctx, database, s.pkgType, s.slug, lastUpdated); err != nil {
t.Fatalf("upserting shell package %s: %v", s.slug, err)
}
}
// Update: fetch full metadata and upsert
syncRun, err := packages.AllocateSyncRunID(ctx, database)
if err != nil {
t.Fatalf("allocating sync run: %v", err)
}
pkgs, err := packages.GetPackagesNeedingUpdate(ctx, database, packages.UpdateQueryOpts{
Force: true,
Type: "all",
})
if err != nil {
t.Fatalf("getting packages needing update: %v", err)
}
for _, p := range pkgs {
var data map[string]any
var fetchErr error
if p.Type == "plugin" {
data, fetchErr = client.FetchPlugin(ctx, p.Name)
} else {
data, fetchErr = client.FetchTheme(ctx, p.Name)
}
if fetchErr != nil {
t.Fatalf("fetching %s/%s: %v", p.Type, p.Name, fetchErr)
}
pkg := packages.PackageFromAPIData(data, p.Type)
pkg.ID = p.ID
if _, err := pkg.NormalizeAndStoreVersions(); err != nil {
t.Fatalf("normalizing versions for %s: %v", p.Name, err)
}
now := time.Now().UTC()
pkg.LastSyncedAt = &now
pkg.LastSyncRunID = &syncRun.RunID
if err := packages.UpsertPackage(ctx, database, pkg); err != nil {
t.Fatalf("upserting package %s: %v", p.Name, err)
}
}
if err := packages.FinishSyncRun(ctx, database, syncRun.RowID, "completed", map[string]any{"updated": len(pkgs)}); err != nil {
t.Fatalf("finishing sync run: %v", err)
}
}