- add batch-scoped reconcile_runs persistence and queries - route batch detail and reconcile writes through batch_id/host_id - refresh production boards with host-scope acceptance artifacts - include latest real-host acceptance evidence for self_service and subscription
72 lines
2.8 KiB
Go
72 lines
2.8 KiB
Go
package provision
|
|
|
|
import (
|
|
"context"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"sub2api-cn-relay-manager/internal/host/sub2api"
|
|
"sub2api-cn-relay-manager/internal/store/sqlite"
|
|
)
|
|
|
|
func TestRollbackServiceDeletesManagedResourcesInDependencyOrder(t *testing.T) {
|
|
host := &fakeHostAdapter{
|
|
managedSnapshot: sub2api.ManagedResourceSnapshot{
|
|
Groups: []sub2api.NamedResource{{ID: "group_1", Name: "DeepSeek 默认分组"}},
|
|
Channels: []sub2api.NamedResource{{ID: "channel_1", Name: "DeepSeek 默认渠道"}},
|
|
Plans: []sub2api.NamedResource{{ID: "plan_1", Name: "DeepSeek 默认套餐"}},
|
|
Accounts: []sub2api.NamedResource{{ID: "account_1", Name: "deepseek-01"}, {ID: "account_2", Name: "deepseek-02"}},
|
|
},
|
|
}
|
|
|
|
svc := NewRollbackService(host)
|
|
report, err := svc.Rollback(context.Background(), RollbackRequest{Provider: sampleProviderManifest()})
|
|
if err != nil {
|
|
t.Fatalf("Rollback() error = %v", err)
|
|
}
|
|
|
|
if report.AccountsDeleted != 2 || report.PlansDeleted != 1 || report.ChannelsDeleted != 1 || report.GroupsDeleted != 1 {
|
|
t.Fatalf("Rollback() report = %+v, want all managed resources deleted", report)
|
|
}
|
|
want := []string{"account:account_2", "account:account_1", "plan:plan_1", "channel:channel_1", "group:group_1"}
|
|
if !reflect.DeepEqual(host.deletedResources, want) {
|
|
t.Fatalf("deleted resources = %#v, want %#v", host.deletedResources, want)
|
|
}
|
|
}
|
|
|
|
func TestRollbackServiceReturnsEmptyReportWhenNoManagedResourcesExist(t *testing.T) {
|
|
host := &fakeHostAdapter{}
|
|
svc := NewRollbackService(host)
|
|
|
|
report, err := svc.Rollback(context.Background(), RollbackRequest{Provider: sampleProviderManifest()})
|
|
if err != nil {
|
|
t.Fatalf("Rollback() error = %v", err)
|
|
}
|
|
if report.AccountsDeleted != 0 || report.PlansDeleted != 0 || report.ChannelsDeleted != 0 || report.GroupsDeleted != 0 {
|
|
t.Fatalf("Rollback() report = %+v, want zero deletions", report)
|
|
}
|
|
if len(host.deletedResources) != 0 {
|
|
t.Fatalf("deleted resources = %#v, want none", host.deletedResources)
|
|
}
|
|
}
|
|
|
|
func TestRollbackServiceRollbackStoredResourcesDeletesOnlyProvidedIDs(t *testing.T) {
|
|
host := &fakeHostAdapter{}
|
|
svc := NewRollbackService(host)
|
|
|
|
report, err := svc.RollbackStoredResources(context.Background(), []sqlite.ManagedResource{
|
|
{BatchID: 2, ResourceType: "group", HostResourceID: "group_shared", ResourceName: "DeepSeek 默认分组"},
|
|
{BatchID: 2, ResourceType: "account", HostResourceID: "account_2", ResourceName: "deepseek-02"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("RollbackStoredResources() error = %v", err)
|
|
}
|
|
if report.AccountsDeleted != 1 || report.GroupsDeleted != 1 || report.ChannelsDeleted != 0 || report.PlansDeleted != 0 {
|
|
t.Fatalf("RollbackStoredResources() report = %+v", report)
|
|
}
|
|
want := []string{"account:account_2", "group:group_shared"}
|
|
if !reflect.DeepEqual(host.deletedResources, want) {
|
|
t.Fatalf("deleted resources = %#v, want %#v", host.deletedResources, want)
|
|
}
|
|
}
|