Fix server file list fallback

This commit is contained in:
npc0-hue
2026-09-07 18:54:56 +08:00
parent f69429bfc7
commit 1b583f3ca6
3 changed files with 84 additions and 1 deletions
+44
View File
@@ -1165,6 +1165,50 @@ func TestServerFileListFallsBackToPluginWorkspaceWithoutRunListCapability(t *tes
}
}
func TestServerFileListFallsBackToPluginWorkspaceWhenRunEndpointUnavailable(t *testing.T) {
svc := newTestCoreService()
plugin, endpoint := createPluginAndRunEndpoint(t, svc)
plugin.FileWorkspace = scumTestFileWorkspace()
if err := svc.store.GamePlugins().Update(plugin); err != nil {
t.Fatalf("update plugin workspace: %v", err)
}
ownerSession := createServiceUserAndLogin(t, svc, domain.User{ID: "user-file-list-run-missing", DisplayName: "File List Run Missing", Email: "file-list-run-missing@example.test", Roles: []string{"server-owner"}, PasswordHash: "secret-password"})
instance, err := svc.CreateServerInstanceForSession(ownerSession, domain.ServerInstance{ID: "server-file-list-run-missing", PluginID: plugin.ID, RunEndpointID: endpoint.ID, Name: "File List Missing Run", State: domain.ServerInstanceStateRunning})
if err != nil {
t.Fatalf("create server: %v", err)
}
if err := svc.store.RunEndpoints().Delete(endpoint.ID); err != nil {
t.Fatalf("delete run endpoint: %v", err)
}
refresh, err := svc.RefreshServerFileListForSession(ownerSession, domain.ServerFileListRequest{ServerInstanceID: instance.ID, DirectoryKey: "scum-config", IdempotencyKey: "idem-file-list-run-missing"})
if err != nil {
t.Fatalf("refresh file list without run endpoint: %v", err)
}
if refresh.State != "ready" || refresh.Job.ID != "" || len(refresh.Entries) != 2 || refresh.Entries[1].LogicalKey != "scum-server-settings" || !strings.Contains(refresh.Reason, "Run 注册记录不存在") {
t.Fatalf("expected declared workspace fallback without run endpoint, got %+v", refresh)
}
jobs, err := svc.store.Jobs().List(domain.JobFilter{ServerInstanceID: instance.ID})
if err != nil {
t.Fatalf("list missing-run jobs: %v", err)
}
if len(jobs) != 0 {
t.Fatalf("missing Run endpoint must not create a failed refresh job, got %+v", jobs)
}
draft, err := svc.CreateServerInstanceForSession(ownerSession, domain.ServerInstance{ID: "server-file-list-run-unbound", PluginID: plugin.ID, Name: "File List Unbound Run", State: domain.ServerInstanceStateDraft})
if err != nil {
t.Fatalf("create unbound draft server: %v", err)
}
unbound, err := svc.RefreshServerFileListForSession(ownerSession, domain.ServerFileListRequest{ServerInstanceID: draft.ID, DirectoryKey: "scum-config", IdempotencyKey: "idem-file-list-run-unbound"})
if err != nil {
t.Fatalf("refresh file list without run binding: %v", err)
}
if unbound.State != "ready" || unbound.Job.ID != "" || len(unbound.Entries) != 2 || unbound.Entries[1].LogicalKey != "scum-server-settings" || !strings.Contains(unbound.Reason, "尚未绑定 Run") {
t.Fatalf("expected declared workspace fallback without run binding, got %+v", unbound)
}
}
func TestDeclaredFileReadSnapshotProjectionStatesAndPassThroughContent(t *testing.T) {
svc := newTestCoreService()
plugin, endpoint := createPluginAndRunEndpoint(t, svc)