package companion import ( "os" "strings" "testing" ) func TestCompanionVehicleHandlerCapabilityIsExplicitAndBounded(t *testing.T) { base := append([]string(nil), requiredCapabilities...) if err := validateCapabilities(base); err != nil { t.Fatalf("base companion profile must remain valid: %v", err) } if err := validateCapabilities(append(base, "handler.vehicle.spawn")); err != nil { t.Fatalf("explicit vehicle handler declaration must be valid: %v", err) } if err := validateCapabilities(append(base, "handler.raw.rcon")); err == nil { t.Fatal("undeclared raw command handler capability must be rejected") } } func TestLoadConfigDeclaresRawTrajectoryCollection(t *testing.T) { config := loadTestConfig(t) if !config.Trajectory.Enabled || config.Trajectory.Source != TrajectorySourceSCUMSQLite || config.Trajectory.Store != TrajectoryStoreSharedPlatformMySQL { t.Fatalf("trajectory collection is not enabled with plugin-owned source/store: %+v", config.Trajectory) } if config.Trajectory.FileEnv != SCUMDatabaseFileEnvironment || config.Trajectory.IntervalSeconds != DefaultTrajectoryCollectionIntervalSecs || config.Trajectory.MaxRows != DefaultTrajectoryCollectionMaxRows { t.Fatalf("trajectory collection did not use bounded defaults: %+v", config.Trajectory) } } func TestTrajectoryConfigRejectsUnsafeEnvironmentNames(t *testing.T) { fixture := strings.ReplaceAll(string(mustReadConfigFixture(t)), "fileEnv: SCUM_DB_FILE", "fileEnv: PATH") if _, err := LoadConfig(strings.NewReader(fixture)); err == nil || !strings.Contains(err.Error(), "environment") { t.Fatalf("expected reserved env name to be rejected, got %v", err) } } func mustReadConfigFixture(t *testing.T) []byte { t.Helper() payload, err := os.ReadFile("config.yaml.example") if err != nil { t.Fatalf("read config fixture: %v", err) } return payload }