- pluggable per-domain Repository interfaces; PostgreSQL and SQLite impls - SQLite on modernc.org/sqlite (WAL, busy_timeout, foreign_keys, immediate tx) - separate migrations/sqlite and db.MigrateSQLite; store.NewPostgres/NewSQLite - cmd/reconcile compares object storage with the journal (report, then --delete) - storage.Backend.List and photos.Repository.AllStorageKeys - DB_BACKEND/SQLITE_PATH and STORAGE_BACKEND/FS_ROOT selectable; local defaults (sqlite ./galo.db, fs ./data) - Makefile reconcile/reconcile-delete; docs and .env.example updated
58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package contract
|
|
|
|
import (
|
|
"context"
|
|
"io/fs"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
assets "shared-album"
|
|
"shared-album/internal/albums"
|
|
"shared-album/internal/auth"
|
|
"shared-album/internal/db"
|
|
"shared-album/internal/members"
|
|
"shared-album/internal/notifications"
|
|
"shared-album/internal/photos"
|
|
"shared-album/internal/sharelinks"
|
|
"shared-album/internal/social"
|
|
)
|
|
|
|
func TestSQLiteContract(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "meta.db")
|
|
migFS, err := fs.Sub(assets.Migrations, "migrations/sqlite")
|
|
if err != nil {
|
|
t.Fatalf("migrations fs: %v", err)
|
|
}
|
|
if err := db.MigrateSQLite(path, migFS); err != nil {
|
|
t.Fatalf("migrate: %v", err)
|
|
}
|
|
database, err := db.OpenSQLite(path)
|
|
if err != nil {
|
|
t.Fatalf("open: %v", err)
|
|
}
|
|
t.Cleanup(func() { database.Close() })
|
|
|
|
Run(t, Repos{
|
|
Auth: auth.NewSQLiteStore(database),
|
|
Albums: albums.NewSQLiteStore(database),
|
|
Members: members.NewSQLiteStore(database),
|
|
Photos: photos.NewSQLiteStore(database),
|
|
Social: social.NewSQLiteStore(database),
|
|
Notifications: notifications.NewSQLiteStore(database),
|
|
ShareLinks: sharelinks.NewSQLiteStore(database),
|
|
Reset: func(ctx context.Context) error {
|
|
tables := []string{
|
|
"variant_jobs", "photo_objects", "objects", "photo_tags", "tags",
|
|
"refresh_tokens", "share_links", "notifications", "likes", "comments",
|
|
"invites", "album_members", "photos", "albums", "users",
|
|
}
|
|
for _, tbl := range tables {
|
|
if _, err := database.ExecContext(ctx, "DELETE FROM "+tbl); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
},
|
|
})
|
|
}
|