using StellaOps.Policy.Registry.Contracts; using StellaOps.Policy.Registry.Services; namespace StellaOps.Policy.Registry.Testing; /// /// Test fixtures and data generators for Policy Registry testing. /// public static class PolicyRegistryTestFixtures { /// /// Creates basic policy rules for testing. /// public static IReadOnlyList CreateBasicRules() { return [ new PolicyRule { RuleId = "test-rule-001", Name = "Deny Critical CVEs", Description = "Blocks any image with critical CVEs", Severity = Severity.Critical, Rego = @" package stellaops.policy.test default deny = false deny { input.vulnerabilities[_].severity == ""critical"" } ", Enabled = true }, new PolicyRule { RuleId = "test-rule-002", Name = "Require SBOM", Description = "Requires valid SBOM for all images", Severity = Severity.High, Rego = @" package stellaops.policy.test default require_sbom = false require_sbom { input.sbom != null count(input.sbom.packages) > 0 } ", Enabled = true }, new PolicyRule { RuleId = "test-rule-003", Name = "Warn on Medium CVEs", Description = "Warns when medium severity CVEs are present", Severity = Severity.Medium, Rego = @" package stellaops.policy.test warn[msg] { vuln := input.vulnerabilities[_] vuln.severity == ""medium"" msg := sprintf(""Medium CVE found: %s"", [vuln.id]) } ", Enabled = true } ]; } /// /// Creates rules with Rego syntax errors for testing compilation failures. /// public static IReadOnlyList CreateInvalidRegoRules() { return [ new PolicyRule { RuleId = "invalid-rule-001", Name = "Invalid Syntax", Description = "Rule with syntax errors", Severity = Severity.High, Rego = @" package stellaops.policy.test deny { input.something == ""value } // missing closing quote ", Enabled = true } ]; } /// /// Creates rules without Rego code for testing name-based matching. /// public static IReadOnlyList CreateRulesWithoutRego() { return [ new PolicyRule { RuleId = "no-rego-001", Name = "Vulnerability Check", Description = "Checks for vulnerabilities", Severity = Severity.High, Enabled = true }, new PolicyRule { RuleId = "no-rego-002", Name = "License Compliance", Description = "Verifies license compliance", Severity = Severity.Medium, Enabled = true } ]; } /// /// Creates test simulation input. /// public static IReadOnlyDictionary CreateTestSimulationInput() { return new Dictionary { ["subject"] = new Dictionary { ["type"] = "container_image", ["name"] = "myregistry.io/myapp", ["digest"] = "sha256:abc123" }, ["vulnerabilities"] = new[] { new Dictionary { ["id"] = "CVE-2024-1234", ["severity"] = "critical", ["package"] = "openssl", ["version"] = "1.1.1" }, new Dictionary { ["id"] = "CVE-2024-5678", ["severity"] = "medium", ["package"] = "curl", ["version"] = "7.88.0" } }, ["sbom"] = new Dictionary { ["format"] = "spdx", ["packages"] = new[] { new Dictionary { ["name"] = "openssl", ["version"] = "1.1.1" }, new Dictionary { ["name"] = "curl", ["version"] = "7.88.0" } } }, ["context"] = new Dictionary { ["environment"] = "production", ["namespace"] = "default" } }; } /// /// Creates batch simulation inputs. /// public static IReadOnlyList CreateBatchSimulationInputs(int count = 5) { var inputs = new List(); for (int i = 0; i < count; i++) { inputs.Add(new BatchSimulationInput { InputId = $"input-{i:D3}", Input = CreateTestSimulationInput(), Tags = new Dictionary { ["test_batch"] = "true", ["index"] = i.ToString() } }); } return inputs; } /// /// Creates a verification policy request. /// public static CreateVerificationPolicyRequest CreateVerificationPolicyRequest( string? policyId = null) { return new CreateVerificationPolicyRequest { PolicyId = policyId ?? $"test-policy-{Guid.NewGuid():N}", Version = "1.0.0", Description = "Test verification policy", TenantScope = "*", PredicateTypes = ["https://slsa.dev/provenance/v1", "https://spdx.dev/Document"], SignerRequirements = new SignerRequirements { MinimumSignatures = 1, TrustedKeyFingerprints = ["SHA256:test-fingerprint-1", "SHA256:test-fingerprint-2"], RequireRekor = false }, ValidityWindow = new ValidityWindow { MaxAttestationAge = 86400 // 24 hours } }; } /// /// Creates a snapshot request. /// public static CreateSnapshotRequest CreateSnapshotRequest(params Guid[] packIds) { return new CreateSnapshotRequest { Description = "Test snapshot", PackIds = packIds.Length > 0 ? packIds.ToList() : [Guid.NewGuid()], Metadata = new Dictionary { ["created_for_test"] = true } }; } /// /// Creates a violation request. /// public static CreateViolationRequest CreateViolationRequest( string? ruleId = null, Severity severity = Severity.High) { return new CreateViolationRequest { RuleId = ruleId ?? "test-rule-001", Severity = severity, Message = $"Test violation for rule {ruleId ?? "test-rule-001"}", Purl = "pkg:npm/lodash@4.17.20", CveId = "CVE-2024-1234", Context = new Dictionary { ["environment"] = "test", ["detected_at"] = DateTimeOffset.UtcNow.ToString("O") } }; } /// /// Creates an override request. /// public static CreateOverrideRequest CreateOverrideRequest( string? ruleId = null) { return new CreateOverrideRequest { RuleId = ruleId ?? "test-rule-001", Reason = "Test override for false positive", Scope = new OverrideScope { Purl = "pkg:npm/lodash@4.17.20", Environment = "development" }, ExpiresAt = DateTimeOffset.UtcNow.AddDays(30) }; } }