Files
sub2api-cn-relay-manager/internal/provision/pack_install_service_test.go

131 lines
4.8 KiB
Go

package provision
import (
"context"
"testing"
"sub2api-cn-relay-manager/internal/pack"
"sub2api-cn-relay-manager/internal/store/sqlite"
)
func TestPackInstallServiceInstallPersistsPackAndProviders(t *testing.T) {
store := openProvisionTestStore(t)
defer closeProvisionTestStore(t, store)
host := &fakeHostAdapter{}
loaded := sampleLoadedPack()
svc := NewPackInstallService(store, host)
result, err := svc.Install(context.Background(), PackInstallRequest{Pack: loaded})
if err != nil {
t.Fatalf("Install() error = %v", err)
}
if result.HostVersion != "0.1.126" {
t.Fatalf("HostVersion = %q, want 0.1.126", result.HostVersion)
}
if result.AlreadyInstalled {
t.Fatal("AlreadyInstalled = true, want false on first install")
}
if result.Pack.PackID != loaded.Manifest.PackID {
t.Fatalf("Pack.PackID = %q, want %q", result.Pack.PackID, loaded.Manifest.PackID)
}
if len(result.Providers) != 1 || result.Providers[0].ProviderID != loaded.Providers[0].ProviderID {
t.Fatalf("Providers = %#v, want one persisted provider", result.Providers)
}
if got := queryCount(t, store.SQLDB(), "packs"); got != 1 {
t.Fatalf("packs row count = %d, want 1", got)
}
if got := queryCount(t, store.SQLDB(), "providers"); got != 1 {
t.Fatalf("providers row count = %d, want 1", got)
}
repeat, err := svc.Install(context.Background(), PackInstallRequest{Pack: loaded})
if err != nil {
t.Fatalf("second Install() error = %v", err)
}
if !repeat.AlreadyInstalled {
t.Fatal("AlreadyInstalled = false, want true on re-install")
}
if got := queryCount(t, store.SQLDB(), "packs"); got != 1 {
t.Fatalf("packs row count after re-install = %d, want 1", got)
}
if got := queryCount(t, store.SQLDB(), "providers"); got != 1 {
t.Fatalf("providers row count after re-install = %d, want 1", got)
}
}
func TestPackInstallServiceInstallUpgradesExistingPackInPlace(t *testing.T) {
store := openProvisionTestStore(t)
defer closeProvisionTestStore(t, store)
svc := NewPackInstallService(store, &fakeHostAdapter{})
loaded := sampleLoadedPack()
if _, err := svc.Install(context.Background(), PackInstallRequest{Pack: loaded}); err != nil {
t.Fatalf("initial Install() error = %v", err)
}
upgraded := sampleLoadedPack()
upgraded.Manifest.Version = "2.0.0"
upgraded.Checksum = "checksum-2"
result, err := svc.Install(context.Background(), PackInstallRequest{Pack: upgraded})
if err != nil {
t.Fatalf("upgraded Install() error = %v", err)
}
if !result.AlreadyInstalled {
t.Fatal("AlreadyInstalled = false, want true for pre-existing pack upgrade")
}
if result.Pack.Version != upgraded.Manifest.Version {
t.Fatalf("Pack.Version = %q, want %q", result.Pack.Version, upgraded.Manifest.Version)
}
if result.Pack.Checksum != upgraded.Checksum {
t.Fatalf("Pack.Checksum = %q, want %q", result.Pack.Checksum, upgraded.Checksum)
}
if got := queryCount(t, store.SQLDB(), "packs"); got != 1 {
t.Fatalf("packs row count after upgrade = %d, want 1", got)
}
if got := queryCount(t, store.SQLDB(), "providers"); got != 1 {
t.Fatalf("providers row count after upgrade = %d, want 1", got)
}
}
func TestPackInstallServiceInstallValidatesDependencies(t *testing.T) {
loaded := sampleLoadedPack()
storeWithoutHost := openProvisionTestStore(t)
defer closeProvisionTestStore(t, storeWithoutHost)
storeWithoutPack := openProvisionTestStore(t)
defer closeProvisionTestStore(t, storeWithoutPack)
if _, err := (*PackInstallService)(nil).Install(context.Background(), PackInstallRequest{Pack: loaded}); err == nil || err.Error() != "store is required" {
t.Fatalf("nil service Install() error = %v, want store is required", err)
}
if _, err := (&PackInstallService{store: storeWithoutHost}).Install(context.Background(), PackInstallRequest{Pack: loaded}); err == nil || err.Error() != "host adapter is required" {
t.Fatalf("missing host Install() error = %v, want host adapter is required", err)
}
if _, err := NewPackInstallService(storeWithoutPack, &fakeHostAdapter{}).Install(context.Background(), PackInstallRequest{}); err == nil || err.Error() != "pack manifest is required" {
t.Fatalf("missing pack Install() error = %v, want pack manifest is required", err)
}
}
func sampleLoadedPack() pack.LoadedPack {
provider := sampleProviderManifest()
return pack.LoadedPack{
Manifest: pack.Manifest{
PackID: "openai-cn-pack",
Version: "1.0.0",
Vendor: "nous",
TargetHost: "sub2api",
MinHostVersion: "0.1.126",
MaxHostVersion: "0.2.x",
},
Providers: []pack.ProviderManifest{provider},
Checksum: "checksum-1",
}
}
func TestValidateExistingPack(t *testing.T) {
existing := sqlite.Pack{PackID: "openai-cn-pack", Version: "1.0.0", Checksum: "checksum-1"}
if err := validateExistingPack(existing, sampleLoadedPack()); err != nil {
t.Fatalf("validateExistingPack() error = %v, want nil", err)
}
}