131 lines
4.8 KiB
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)
|
|
}
|
|
}
|