2026-05-15 19:26:25 +08:00
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 )
}
}
2026-05-19 20:21:21 +08:00
func TestPackInstallServiceInstallUpgradesExistingPackInPlace ( t * testing . T ) {
2026-05-15 19:26:25 +08:00
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 )
}
2026-05-19 20:21:21 +08:00
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 )
2026-05-15 19:26:25 +08:00
}
2026-05-19 20:21:21 +08:00
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 )
2026-05-15 19:26:25 +08:00
}
}
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 )
}
}