功能修改

This commit is contained in:
npc0-hue
2026-07-20 16:42:33 +08:00
parent 48b8ad8d6c
commit a0e69417db
224 changed files with 22015 additions and 884 deletions
+88
View File
@@ -0,0 +1,88 @@
package service
import (
"encoding/json"
"testing"
"browser.local/platform/domain"
"browser.local/platform/dto"
)
func TestRemoteAdapterRequestPropagatesTypedInputsToRunJob(t *testing.T) {
svc := newTestCoreService()
plugin, endpoint := createPluginAndRunEndpoint(t, svc)
capability := domain.JobCapabilityRemoteRunDBSQLiteQuery
plugin.Permissions.RemoteAccess = true
plugin.DeclaredPermissions = append(plugin.DeclaredPermissions, "server.remote.access")
plugin.RequiredRunCapabilities = append(plugin.RequiredRunCapabilities, capability)
plugin.RemoteAccess = domain.GamePluginRemoteAccess{Methods: []string{"run"}, RunCapabilities: []string{capability}, DatabaseEngines: []string{"sqlite"}}
plugin.RuntimeProfiles.TransportProfiles = append(plugin.RuntimeProfiles.TransportProfiles, domain.RuntimeTransportProfile{Key: "player-lookup", Kind: "sqlite", TargetKey: "scum-db.player-lookup", Capabilities: []string{capability}})
if err := svc.store.GamePlugins().Update(plugin); err != nil {
t.Fatal(err)
}
endpoint.Capabilities = append(endpoint.Capabilities, capability)
if err := svc.store.RunEndpoints().Update(endpoint); err != nil {
t.Fatal(err)
}
session := createServiceUserAndLogin(t, svc, domain.User{ID: "user-remote-owner", DisplayName: "Remote Owner", Email: "remote-owner@example.test", Roles: []string{"server-owner"}, PasswordHash: "secret-password"})
instance, err := svc.CreateServerInstanceForSession(session, domain.ServerInstance{ID: "server-remote-input", PluginID: plugin.ID, RunEndpointID: endpoint.ID, Name: "Remote Input"})
if err != nil {
t.Fatal(err)
}
inputs := map[string]string{"playerId": "steam-123", "limit": "25"}
result, err := svc.RequestRemoteAdapterForSession(session, domain.RemoteAdapterRequest{ServerInstanceID: instance.ID, DeclarationKey: "player-lookup", TargetKey: "scum-db.player-lookup", Capability: capability, IdempotencyKey: "lookup-1", InputRef: "input://scum-db/player-lookup/lookup-1", Inputs: inputs})
if err != nil {
t.Fatalf("request remote adapter: %v", err)
}
inputs["playerId"] = "mutated"
job, err := svc.store.Jobs().Get(result.RequestID)
if err != nil {
t.Fatal(err)
}
if job.InputRef != "input://scum-db/player-lookup/lookup-1" || job.ExecutionInput.Inputs["playerId"] != "steam-123" || job.ExecutionInput.Inputs["limit"] != "25" {
t.Fatalf("typed inputs were not propagated: %#v", job)
}
helloRequest := validRunControlHello()
helloRequest.CapabilityReport.Capabilities = append(helloRequest.CapabilityReport.Capabilities, capability)
helloRequest.CapabilityReport.Fingerprint = "cap-remote-inputs"
hello, err := svc.RegisterRunHello(helloRequest)
if err != nil {
t.Fatalf("register Run hello: %v", err)
}
claim, err := svc.ClaimRunJob(domain.RunJobClaim{RunEndpointID: endpoint.ID, SessionToken: hello.SessionToken, Capabilities: []string{capability}, Capacity: domain.RunCapacity{MaxJobs: 1}})
if err != nil {
t.Fatalf("claim remote adapter job: %v", err)
}
if !claim.HasJob || claim.Job == nil || claim.Job.JobID != job.ID || claim.Job.ExecutionInput.Inputs["playerId"] != "steam-123" || claim.Job.ExecutionInput.Inputs["limit"] != "25" {
t.Fatalf("typed inputs were not propagated to real Run claim: %#v", claim.Job)
}
response := dto.RunJobAssignmentFromDomain(*claim.Job)
payload, err := json.Marshal(response)
if err != nil {
t.Fatalf("marshal Run assignment response: %v", err)
}
var wire struct {
ExecutionInput struct {
Inputs map[string]string `json:"inputs"`
} `json:"executionInput"`
}
if err := json.Unmarshal(payload, &wire); err != nil {
t.Fatalf("unmarshal Run assignment response: %v", err)
}
if wire.ExecutionInput.Inputs["playerId"] != "steam-123" || wire.ExecutionInput.Inputs["limit"] != "25" {
t.Fatalf("typed inputs were not preserved in Run assignment JSON: %s", payload)
}
wire.ExecutionInput.Inputs["playerId"] = "wire-mutated"
if claim.Job.ExecutionInput.Inputs["playerId"] != "steam-123" {
t.Fatal("Run assignment DTO aliases domain remote inputs")
}
claim.Job.ExecutionInput.Inputs["playerId"] = "assignment-mutated"
stored, err := svc.store.Jobs().Get(result.RequestID)
if err != nil {
t.Fatalf("get claimed remote adapter job: %v", err)
}
if stored.ExecutionInput.Inputs["playerId"] != "steam-123" {
t.Fatal("real Run claim aliases persisted remote inputs")
}
}