package validator import ( "strings" "testing" "browser.local/platform/domain" ) func TestValidateGamePluginRuntimeProfilesAllowsSafeCasePreservingDataTargetPath(t *testing.T) { profiles := validRuntimeDataTargetProfiles("SCUM/Saved/SaveFiles/SCUM.db") if err := ValidateGamePluginRuntimeProfiles(profiles); err != nil { t.Fatalf("expected safe cross-platform data target path to validate: %v", err) } } func TestValidateGamePluginRuntimeProfilesRejectsUnsafeDataTargetPath(t *testing.T) { for _, sourcePath := range []string{"../SCUM.db", "/SCUM.db", `SCUM\\Saved\\SCUM.db`, "C:/SCUM.db", "https://example.test/SCUM.db"} { t.Run(sourcePath, func(t *testing.T) { err := ValidateGamePluginRuntimeProfiles(validRuntimeDataTargetProfiles(sourcePath)) if err == nil || !strings.Contains(err.Error(), "sourcePath must be a safe relative path") { t.Fatalf("expected unsafe source path rejection, got %v", err) } }) } } func validRuntimeDataTargetProfiles(sourcePath string) domain.GamePluginRuntimeProfiles { return domain.GamePluginRuntimeProfiles{ TransportProfiles: []domain.RuntimeTransportProfile{{ Key: "scum-database", Kind: "sqlite", TargetKey: "scum-database", Capabilities: []string{domain.JobCapabilityRemoteRunDBSQLiteQuery}, }}, DataTargets: []domain.RuntimeDataTarget{{ Key: "scum-database", Kind: "sqlite.snapshot", TransportKey: "scum-database", SourceRootKey: "server-root", SourcePath: sourcePath, WorkspaceKey: "databases/scum-database", RefreshPolicy: "on-demand-snapshot", MaxBytes: 1024 * 1024, Platforms: []string{"windows"}, }}, } }