This commit is contained in:
		| @@ -117,6 +117,7 @@ You have to read `./ARCHITECTURE.md` for more information. | ||||
| - **Determinism**: Sort keys, normalize timestamps to UTC ISO‑8601, avoid non‑deterministic data in exports and tests. | ||||
| - **Status tracking**: Update your module’s `TASKS.md` as you progress (TODO → DOING → DONE/BLOCKED). | ||||
| - **Tests**: Add/extend fixtures and unit tests per change; never regress determinism or precedence. | ||||
| - **Test layout**: Use module-specific projects in `StellaOps.Feedser.<Component>.Tests`; shared fixtures/harnesses live in `StellaOps.Feedser.Testing`. | ||||
|  | ||||
| --- | ||||
|  | ||||
|   | ||||
| @@ -62,7 +62,7 @@ StellaOps.Feedser.Normalization/     # Canonical mappers, validators, version-ra | ||||
| StellaOps.Feedser.Merge/             # Identity graph, precedence, deterministic merge | ||||
| StellaOps.Feedser.Exporter.Json/ | ||||
| StellaOps.Feedser.Exporter.TrivyDb/ | ||||
| StellaOps.Feedser.Tests/             # Unit, component, integration & golden fixtures | ||||
| StellaOps.Feedser.<Component>.Tests/  # Component-scoped unit/integration suites (Core, Storage.Mongo, Source.*, Exporter.*, WebService, etc.) | ||||
| ``` | ||||
|  | ||||
| --- | ||||
|   | ||||
| @@ -11,4 +11,19 @@ | ||||
|       <ExcludeAssets>runtime</ExcludeAssets> | ||||
|     </ProjectReference> | ||||
|   </ItemGroup> | ||||
|  | ||||
|   <ItemGroup Condition="$([System.String]::Copy('$(MSBuildProjectName)').EndsWith('.Tests'))"> | ||||
|     <PackageReference Include="coverlet.collector" Version="6.0.4" /> | ||||
|     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.8" /> | ||||
|     <PackageReference Include="Mongo2Go" Version="3.1.3" /> | ||||
|     <PackageReference Include="xunit" Version="2.9.2" /> | ||||
|     <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" /> | ||||
|     <PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="8.4.0" /> | ||||
|     <Compile Include="$(MSBuildThisFileDirectory)StellaOps.Feedser.Tests.Shared\AssemblyInfo.cs" Link="Shared\AssemblyInfo.cs" /> | ||||
|     <Compile Include="$(MSBuildThisFileDirectory)StellaOps.Feedser.Tests.Shared\MongoFixtureCollection.cs" Link="Shared\MongoFixtureCollection.cs" /> | ||||
|     <ProjectReference Include="$(MSBuildThisFileDirectory)StellaOps.Feedser.Testing\StellaOps.Feedser.Testing.csproj" /> | ||||
|     <Using Include="StellaOps.Feedser.Testing" /> | ||||
|     <Using Include="Xunit" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Microsoft.Extensions.Options; | ||||
| using StellaOps.Feedser.Core.Jobs; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Core; | ||||
| namespace StellaOps.Feedser.Core.Tests; | ||||
| 
 | ||||
| public sealed class JobCoordinatorTests | ||||
| { | ||||
| @@ -0,0 +1,10 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -25,3 +25,8 @@ Out: business logic of connectors/exporters, HTTP handlers (owned by WebService) | ||||
| - Metrics: job.run.started/succeeded/failed, job.durationMs, job.concurrent.rejected, job.alreadyRunning. | ||||
| - Logs: kind, trigger, params hash, lease holder, outcome; redact params containing secrets. | ||||
| - Honor CancellationToken early and often. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Core.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,7 @@ using System.Threading.Tasks; | ||||
| using StellaOps.Feedser.Exporter.Json; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.Json; | ||||
| namespace StellaOps.Feedser.Exporter.Json.Tests; | ||||
| 
 | ||||
| public sealed class JsonExportSnapshotBuilderTests : IDisposable | ||||
| { | ||||
| @@ -11,7 +11,7 @@ using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Storage.Mongo.Exporting; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.Json; | ||||
| namespace StellaOps.Feedser.Exporter.Json.Tests; | ||||
| 
 | ||||
| public sealed class JsonExporterDependencyInjectionRoutineTests | ||||
| { | ||||
| @@ -8,7 +8,7 @@ using System.Threading.Tasks; | ||||
| using StellaOps.Feedser.Exporter.Json; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.Json; | ||||
| namespace StellaOps.Feedser.Exporter.Json.Tests; | ||||
| 
 | ||||
| public sealed class JsonExporterParitySmokeTests : IDisposable | ||||
| { | ||||
| @@ -15,7 +15,7 @@ using StellaOps.Feedser.Models; | ||||
| using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Storage.Mongo.Exporting; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.Json; | ||||
| namespace StellaOps.Feedser.Exporter.Json.Tests; | ||||
| 
 | ||||
| public sealed class JsonFeedExporterTests : IDisposable | ||||
| { | ||||
| @@ -0,0 +1,13 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -4,7 +4,7 @@ using System.IO; | ||||
| using StellaOps.Feedser.Exporter.Json; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.Json; | ||||
| namespace StellaOps.Feedser.Exporter.Json.Tests; | ||||
| 
 | ||||
| public sealed class VulnListJsonExportPathResolverTests | ||||
| { | ||||
| @@ -21,3 +21,8 @@ Out: ORAS push and Trivy DB BoltDB writing (owned by Trivy exporter). | ||||
| ## Observability & security expectations | ||||
| - Metrics: export.json.records, bytes, duration, delta.changed. | ||||
| - Logs: target path, record counts, digest; no sensitive data. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Exporter.Json.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,13 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -2,7 +2,7 @@ using System; | ||||
| using StellaOps.Feedser.Exporter.TrivyDb; | ||||
| using StellaOps.Feedser.Storage.Mongo.Exporting; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.TrivyDb; | ||||
| namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; | ||||
| 
 | ||||
| public sealed class TrivyDbExportPlannerTests | ||||
| { | ||||
| @@ -14,7 +14,7 @@ using StellaOps.Feedser.Models; | ||||
| using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Storage.Mongo.Exporting; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.TrivyDb; | ||||
| namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; | ||||
| 
 | ||||
| public sealed class TrivyDbFeedExporterTests : IDisposable | ||||
| { | ||||
| @@ -7,7 +7,7 @@ using System.Text.Json; | ||||
| using System.Security.Cryptography; | ||||
| using StellaOps.Feedser.Exporter.TrivyDb; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.TrivyDb; | ||||
| namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; | ||||
| 
 | ||||
| public sealed class TrivyDbOciWriterTests : IDisposable | ||||
| { | ||||
| @@ -6,7 +6,7 @@ using System.Text; | ||||
| using System.Text.Json; | ||||
| using StellaOps.Feedser.Exporter.TrivyDb; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Exporter.TrivyDb; | ||||
| namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; | ||||
| 
 | ||||
| public sealed class TrivyDbPackageBuilderTests | ||||
| { | ||||
| @@ -22,3 +22,8 @@ Out: signing (external pipeline), scanner behavior. | ||||
| ## Observability & security expectations | ||||
| - Metrics: export.trivy.records, size_bytes, duration, oras.push.success/fail. | ||||
| - Logs: export path, repo/tag, digest; redact credentials; backoff on push errors. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Exporter.TrivyDb.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ using Microsoft.Extensions.Time.Testing; | ||||
| using StellaOps.Feedser.Merge.Services; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| public sealed class AdvisoryPrecedenceMergerTests | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System; | ||||
| using StellaOps.Feedser.Merge.Services; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| public sealed class AffectedPackagePrecedenceResolverTests | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System.Linq; | ||||
| using StellaOps.Feedser.Merge.Services; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| public sealed class CanonicalHashCalculatorTests | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using StellaOps.Feedser.Merge.Comparers; | ||||
| using StellaOps.Feedser.Normalization.Distro; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| public sealed class DebianEvrComparerTests | ||||
| { | ||||
| @@ -4,7 +4,7 @@ using StellaOps.Feedser.Merge.Services; | ||||
| using StellaOps.Feedser.Models; | ||||
| using StellaOps.Feedser.Storage.Mongo.MergeEvents; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| public sealed class MergeEventWriterTests | ||||
| { | ||||
| @@ -9,9 +9,9 @@ using StellaOps.Feedser.Merge.Services; | ||||
| using StellaOps.Feedser.Models; | ||||
| using StellaOps.Feedser.Storage.Mongo; | ||||
| using StellaOps.Feedser.Storage.Mongo.MergeEvents; | ||||
| using StellaOps.Feedser.Tests.Storage; | ||||
| using StellaOps.Feedser.Testing; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class MergePrecedenceIntegrationTests : IAsyncLifetime | ||||
| @@ -1,7 +1,7 @@ | ||||
| using StellaOps.Feedser.Merge.Comparers; | ||||
| using StellaOps.Feedser.Normalization.Distro; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| public sealed class NevraComparerTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Merge.Comparers; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Merge; | ||||
| namespace StellaOps.Feedser.Merge.Tests; | ||||
| 
 | ||||
| public sealed class SemanticVersionRangeResolverTests | ||||
| { | ||||
| @@ -0,0 +1,13 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Merge/StellaOps.Feedser.Merge.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -23,3 +23,8 @@ Out: fetching/parsing, exporter packaging, signing. | ||||
| ## Observability & security expectations | ||||
| - Metrics: merge.delta.count, merge.identity.conflicts, merge.range.overrides, merge.duration_ms. | ||||
| - Logs: decisions (why replaced), keys involved, hashes; avoid dumping large blobs; redact secrets (none expected). | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Merge.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System.Linq; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Models; | ||||
| namespace StellaOps.Feedser.Models.Tests; | ||||
| 
 | ||||
| public sealed class AdvisoryTests | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Models; | ||||
| namespace StellaOps.Feedser.Models.Tests; | ||||
| 
 | ||||
| public sealed class AffectedPackageStatusTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Models; | ||||
| namespace StellaOps.Feedser.Models.Tests; | ||||
| 
 | ||||
| public sealed class AliasSchemeRegistryTests | ||||
| { | ||||
| @@ -2,7 +2,7 @@ using System.Collections.Generic; | ||||
| using System.Globalization; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Models; | ||||
| namespace StellaOps.Feedser.Models.Tests; | ||||
| 
 | ||||
| internal static class CanonicalExampleFactory | ||||
| { | ||||
| @@ -1,11 +1,11 @@ | ||||
| using System.Text; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Models; | ||||
| namespace StellaOps.Feedser.Models.Tests; | ||||
| 
 | ||||
| public sealed class CanonicalExamplesTests | ||||
| { | ||||
|     private static readonly string FixtureRoot = Path.Combine(GetProjectRoot(), "Models", "Fixtures"); | ||||
|     private static readonly string FixtureRoot = Path.Combine(GetProjectRoot(), "Fixtures"); | ||||
|     private const string UpdateEnvVar = "UPDATE_GOLDENS"; | ||||
| 
 | ||||
|     [Trait("Category", "GoldenSnapshots")] | ||||
| @@ -3,7 +3,7 @@ using System.Linq; | ||||
| using System.Text.Json; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Models; | ||||
| namespace StellaOps.Feedser.Models.Tests; | ||||
| 
 | ||||
| public sealed class CanonicalJsonSerializerTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Models; | ||||
| namespace StellaOps.Feedser.Models.Tests; | ||||
| 
 | ||||
| public sealed class SeverityNormalizationTests | ||||
| { | ||||
| @@ -0,0 +1,10 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -23,3 +23,8 @@ Out: fetching/parsing external schemas, storage, HTTP. | ||||
| - No secrets; purely in-memory types. | ||||
| - Provide debug renders for test snapshots (canonical JSON). | ||||
| - Emit model version identifiers in logs when canonical structures change; keep adapters for older readers until deprecated. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Models.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -33,7 +33,7 @@ This playbook captures the policies and workflow required when evolving the cano | ||||
|  | ||||
| ## Testing Checklist | ||||
|  | ||||
| - `StellaOps.Feedser.Tests.Models` – update unit tests and golden examples. | ||||
| - `StellaOps.Feedser.Models.Tests` – update unit tests and golden examples. | ||||
| - `Serialization determinism` – ensure the hash regression tests cover the new fields. | ||||
| - Exporter integration (`Json`, `TrivyDb`) – confirm manifests include provenance + tree metadata | ||||
|   for the new shape. | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Normalization.Identifiers; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Normalization; | ||||
| namespace StellaOps.Feedser.Normalization.Tests; | ||||
| 
 | ||||
| public sealed class CpeNormalizerTests | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using StellaOps.Feedser.Models; | ||||
| using StellaOps.Feedser.Normalization.Cvss; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Normalization; | ||||
| namespace StellaOps.Feedser.Normalization.Tests; | ||||
| 
 | ||||
| public sealed class CvssMetricNormalizerTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Normalization.Distro; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Normalization; | ||||
| namespace StellaOps.Feedser.Normalization.Tests; | ||||
| 
 | ||||
| public sealed class DebianEvrParserTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Normalization.Text; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Normalization; | ||||
| namespace StellaOps.Feedser.Normalization.Tests; | ||||
| 
 | ||||
| public sealed class DescriptionNormalizerTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Normalization.Distro; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Normalization; | ||||
| namespace StellaOps.Feedser.Normalization.Tests; | ||||
| 
 | ||||
| public sealed class NevraParserTests | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System.Linq; | ||||
| using StellaOps.Feedser.Normalization.Identifiers; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Normalization; | ||||
| namespace StellaOps.Feedser.Normalization.Tests; | ||||
| 
 | ||||
| public sealed class PackageUrlNormalizerTests | ||||
| { | ||||
| @@ -0,0 +1,11 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -24,10 +24,10 @@ using StellaOps.Feedser.Storage.Mongo; | ||||
| using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Storage.Mongo.Documents; | ||||
| using StellaOps.Feedser.Storage.Mongo.Dtos; | ||||
| using StellaOps.Feedser.Tests.Storage; | ||||
| using StellaOps.Feedser.Testing; | ||||
| using StellaOps.Feedser.Models; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.CertFr; | ||||
| namespace StellaOps.Feedser.Source.CertFr.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class CertFrConnectorTests : IAsyncLifetime | ||||
| @@ -0,0 +1,16 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.CertFr/StellaOps.Feedser.Source.CertFr.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="CertFr/Fixtures/**" CopyToOutputDirectory="Always" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -21,3 +21,8 @@ Out: OVAL or package-level authority. | ||||
| ## Observability & security expectations | ||||
| - Metrics: certfr.fetch.items, certfr.parse.fail, certfr.map.count. | ||||
| - Logs: feed URL(s), item ids/urls, extraction durations; no PII; allowlist hostnames. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Source.CertFr.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -26,9 +26,9 @@ using StellaOps.Feedser.Storage.Mongo; | ||||
| using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Storage.Mongo.Documents; | ||||
| using StellaOps.Feedser.Storage.Mongo.Dtos; | ||||
| using StellaOps.Feedser.Tests.Storage; | ||||
| using StellaOps.Feedser.Testing; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.CertIn; | ||||
| namespace StellaOps.Feedser.Source.CertIn.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class CertInConnectorTests : IAsyncLifetime | ||||
| @@ -0,0 +1,16 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.CertIn/StellaOps.Feedser.Source.CertIn.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="CertIn/Fixtures/**" CopyToOutputDirectory="Always" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -22,3 +22,8 @@ Out: package range authority; scraping behind auth walls. | ||||
| ## Observability & security expectations | ||||
| - Metrics: certin.fetch.items, certin.parse.fail, certin.map.enriched_count. | ||||
| - Logs: advisory codes, CVE counts per advisory, timing; allowlist host; redact personal data if present. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Source.CertIn.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ using System.Net; | ||||
| using System.Net.Http; | ||||
| using StellaOps.Feedser.Source.Common.Testing; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Common; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests; | ||||
| 
 | ||||
| public sealed class CannedHttpMessageHandlerTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Source.Common.Html; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Common; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests; | ||||
| 
 | ||||
| public sealed class HtmlContentSanitizerTests | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using NuGet.Versioning; | ||||
| using StellaOps.Feedser.Source.Common.Packages; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Common; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests; | ||||
| 
 | ||||
| public sealed class PackageCoordinateHelperTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Source.Common.Pdf; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Common; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests; | ||||
| 
 | ||||
| public sealed class PdfTextExtractorTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Source.Common.Fetch; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Common; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests; | ||||
| 
 | ||||
| public sealed class SourceFetchServiceTests | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using MongoDB.Bson; | ||||
| using StellaOps.Feedser.Source.Common.Cursors; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Common; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests; | ||||
| 
 | ||||
| public sealed class TimeWindowCursorPlannerTests | ||||
| { | ||||
| @@ -1,6 +1,6 @@ | ||||
| using StellaOps.Feedser.Source.Common.Url; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Common; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests; | ||||
| 
 | ||||
| public sealed class UrlNormalizerTests | ||||
| { | ||||
| @@ -4,7 +4,7 @@ using Json.Schema; | ||||
| using Microsoft.Extensions.Logging.Abstractions; | ||||
| using StellaOps.Feedser.Source.Common.Json; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Json; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests.Json; | ||||
| 
 | ||||
| public sealed class JsonSchemaValidatorTests | ||||
| { | ||||
| @@ -0,0 +1,10 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging.Abstractions; | ||||
| using FeedserXmlSchemaValidator = StellaOps.Feedser.Source.Common.Xml.XmlSchemaValidator; | ||||
| using FeedserXmlSchemaValidationException = StellaOps.Feedser.Source.Common.Xml.XmlSchemaValidationException; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Xml; | ||||
| namespace StellaOps.Feedser.Source.Common.Tests.Xml; | ||||
| 
 | ||||
| public sealed class XmlSchemaValidatorTests | ||||
| { | ||||
| @@ -25,3 +25,8 @@ Out: connector-specific schemas/mapping rules, merge precedence. | ||||
| - Metrics: http.req.count, http.retry.count, rate_limit.remaining, validator.fail.count. | ||||
| - Logs include uri, status, retries, etag; redact tokens and auth headers. | ||||
| - Distributed tracing hooks and per-connector counters should be wired centrally for consistent observability. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Source.Common.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| using System.Runtime.CompilerServices; | ||||
|  | ||||
| [assembly: InternalsVisibleTo("StellaOps.Feedser.Tests")] | ||||
| [assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Common.Tests")] | ||||
|   | ||||
| @@ -8,10 +8,10 @@ using StellaOps.Feedser.Source.Distro.RedHat; | ||||
| using StellaOps.Feedser.Source.Distro.RedHat.Configuration; | ||||
| using StellaOps.Feedser.Storage.Mongo; | ||||
| using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Tests.Source.TestInfrastructure; | ||||
| using StellaOps.Feedser.Tests.Storage; | ||||
| using StellaOps.Feedser.Testing; | ||||
| using StellaOps.Feedser.Testing; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Distro.RedHat; | ||||
| namespace StellaOps.Feedser.Source.Distro.RedHat.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class RedHatConnectorHarnessTests : IAsyncLifetime | ||||
| @@ -21,12 +21,12 @@ using StellaOps.Feedser.Models; | ||||
| using StellaOps.Feedser.Storage.Mongo; | ||||
| using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Storage.Mongo.Documents; | ||||
| using StellaOps.Feedser.Tests.Storage; | ||||
| using StellaOps.Feedser.Testing; | ||||
| using StellaOps.Plugin; | ||||
| using Xunit; | ||||
| using Xunit.Abstractions; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Distro.RedHat; | ||||
| namespace StellaOps.Feedser.Source.Distro.RedHat.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class RedHatConnectorTests : IAsyncLifetime | ||||
| @@ -0,0 +1,16 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Distro.RedHat/StellaOps.Feedser.Source.Distro.RedHat.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="RedHat/Fixtures/*.json" CopyToOutputDirectory="Always" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -21,3 +21,8 @@ Out: building RPM artifacts; cross-distro reconciliation beyond Red Hat. | ||||
| ## Observability & security expectations | ||||
| - Metrics: redhat.fetch.items, redhat.oval.defs, redhat.parse.fail, redhat.map.affected_rpm. | ||||
| - Logs: cursor bounds, advisory ids, NEVRA counts; allowlist Red Hat endpoints. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Source.Distro.RedHat.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -23,9 +23,9 @@ using StellaOps.Feedser.Storage.Mongo; | ||||
| using StellaOps.Feedser.Storage.Mongo.Advisories; | ||||
| using StellaOps.Feedser.Storage.Mongo.Documents; | ||||
| using StellaOps.Feedser.Storage.Mongo.Dtos; | ||||
| using StellaOps.Feedser.Tests.Storage; | ||||
| using StellaOps.Feedser.Testing; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Ics.Kaspersky; | ||||
| namespace StellaOps.Feedser.Source.Ics.Kaspersky.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class KasperskyConnectorTests : IAsyncLifetime | ||||
| @@ -0,0 +1,16 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Ics.Kaspersky/StellaOps.Feedser.Source.Ics.Kaspersky.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="Kaspersky/Fixtures/**" CopyToOutputDirectory="Always" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -22,3 +22,8 @@ Out: firmware downloads; reverse-engineering artifacts. | ||||
| ## Observability & security expectations | ||||
| - Metrics: icsk.fetch.items, icsk.parse.fail, icsk.map.affected_count. | ||||
| - Logs: slugs, vendor/product counts, timing; allowlist host. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Source.Ics.Kaspersky.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
| @@ -25,9 +25,9 @@ using StellaOps.Feedser.Storage.Mongo.Documents; | ||||
| using StellaOps.Feedser.Storage.Mongo.Dtos; | ||||
| using StellaOps.Feedser.Storage.Mongo.JpFlags; | ||||
| using Xunit.Abstractions; | ||||
| using StellaOps.Feedser.Tests.Storage; | ||||
| using StellaOps.Feedser.Testing; | ||||
| 
 | ||||
| namespace StellaOps.Feedser.Tests.Source.Jvn; | ||||
| namespace StellaOps.Feedser.Source.Jvn.Tests; | ||||
| 
 | ||||
| [Collection("mongo-fixture")] | ||||
| public sealed class JvnConnectorTests : IAsyncLifetime | ||||
| @@ -0,0 +1,16 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net10.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Source.Jvn/StellaOps.Feedser.Source.Jvn.csproj" /> | ||||
|     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="Jvn/Fixtures/**" CopyToOutputDirectory="Always" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -23,3 +23,8 @@ Out: overriding distro or PSIRT ranges without concrete evidence; scraping unoff | ||||
| ## Observability & security expectations | ||||
| - Metrics: jvn.fetch.requests, jvn.items, jvn.parse.fail, jvn.map.enriched_count, jvn.flags.jp_count. | ||||
| - Logs: window bounds, jvndb ids processed, vendor_status distribution; redact API keys. | ||||
| ## Tests | ||||
| - Author and review coverage in `../StellaOps.Feedser.Source.Jvn.Tests`. | ||||
| - Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. | ||||
| - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user