package service import ( "testing" "browser.local/platform/domain" ) func scumDeploymentTestPlugin() domain.GamePlugin { return domain.GamePlugin{ ID: "game.scum", CreateFields: []domain.PluginCreateField{ {Key: "serverName", Type: "text", DefaultValue: "SCUM Test"}, {Key: "gamePort", Type: "port", DefaultValue: "7779"}, {Key: "queryPort", Type: "port", DefaultValue: "27015"}, {Key: "maxPlayers", Type: "number", DefaultValue: "128"}, }, } } func requireManualSCUMRuntimeBindings(plugin *domain.GamePlugin, profileKey string) { plugin.RuntimeProfiles.Discovery = []domain.RuntimeDiscoveryProbe{ {Key: "steamcmd", Kind: "command.version", TargetKey: "steamcmd", Required: true}, {Key: "scum-install", Kind: "file.exists", TargetKey: "server/install-root", Required: true, Platforms: []string{"windows"}}, } plugin.RuntimeProfiles.DependencyProbes = []domain.RuntimeDependencyProbe{{Key: "steamcmd", Kind: "command.version", TargetKey: "steamcmd", Required: true, Platforms: []string{"windows"}}} plugin.RuntimeProfiles.LogSources = []domain.RuntimeLogSource{ {Key: "scum-console-stdout", Kind: "process.stdout", TargetKey: "scum/server-process", StreamKey: "scum.console.stdout", CursorKind: "sequence", RetentionDays: 30}, {Key: "scum-server-events", Kind: "file.tail", TargetKey: "logs/server", StreamKey: "scum.server", CursorKind: "fingerprint", RetentionDays: 90}, } plugin.RuntimeProfiles.TransportProfiles = []domain.RuntimeTransportProfile{{Key: "server-files", Kind: "file", TargetKey: "server-root", Capabilities: []string{domain.JobCapabilityRemoteRunFilesRead, domain.JobCapabilityRemoteRunFilesWrite}}} for i := range plugin.RuntimeProfiles.LifecycleProfiles { if plugin.RuntimeProfiles.LifecycleProfiles[i].Key == profileKey { plugin.RuntimeProfiles.LifecycleProfiles[i].TransportKeys = []string{"server-files"} } } } func TestApplyPluginCreateDefaultsUsesPluginFields(t *testing.T) { plugin := scumDeploymentTestPlugin() definition := applyPluginCreateDefaults(plugin, domain.ServerDeploymentDefinition{Mode: domain.ServerDeploymentModeGuided, CreateInputs: map[string]string{"serverName": "Moon"}}) if definition.CreateInputs["serverName"] != "Moon" || definition.CreateInputs["gamePort"] != "7779" || definition.CreateInputs["queryPort"] != "27015" || definition.CreateInputs["maxPlayers"] != "128" { t.Fatalf("expected plugin defaults to fill missing guided inputs: %+v", definition.CreateInputs) } } func TestDeploymentDefinitionsUsePluginOwnedLifecycleWithoutRuntimeBinding(t *testing.T) { plugin := scumDeploymentTestPlugin() if deploymentNeedsCompleteRuntimeBinding(plugin, domain.ServerDeploymentDefinition{Mode: domain.ServerDeploymentModeGuided}) { t.Fatal("guided plugin-owned lifecycle should not require a complete runtime binding") } if !deploymentNeedsCompleteRuntimeBinding(plugin, domain.ServerDeploymentDefinition{}) { t.Fatal("non-deployment runtime lifecycle still requires a complete runtime binding") } }