feat: Add tests for RichGraphPublisher and RichGraphWriter
Some checks failed
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Mirror Thin Bundle Sign & Verify / mirror-sign (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled

- Implement unit tests for RichGraphPublisher to verify graph publishing to CAS.
- Implement unit tests for RichGraphWriter to ensure correct writing of canonical graphs and metadata.

feat: Implement AOC Guard validation logic

- Add AOC Guard validation logic to enforce document structure and field constraints.
- Introduce violation codes for various validation errors.
- Implement tests for AOC Guard to validate expected behavior.

feat: Create Console Status API client and service

- Implement ConsoleStatusClient for fetching console status and streaming run events.
- Create ConsoleStatusService to manage console status polling and event subscriptions.
- Add tests for ConsoleStatusClient to verify API interactions.

feat: Develop Console Status component

- Create ConsoleStatusComponent for displaying console status and run events.
- Implement UI for showing status metrics and handling user interactions.
- Add styles for console status display.

test: Add tests for Console Status store

- Implement tests for ConsoleStatusStore to verify event handling and state management.
This commit is contained in:
StellaOps Bot
2025-12-01 07:34:50 +02:00
parent 7df0677e34
commit c11d87d252
108 changed files with 4773 additions and 351 deletions

View File

@@ -16,6 +16,9 @@ builder.Services.Configure<DevPortalOfflineStorageOptions>(builder.Configuration
builder.Services.Configure<RiskBundleWorkerOptions>(builder.Configuration.GetSection("RiskBundles"));
builder.Services.Configure<RiskBundleManifestSigningOptions>(builder.Configuration.GetSection("RiskBundles:Signing"));
builder.Services.Configure<FileSystemRiskBundleStorageOptions>(builder.Configuration.GetSection("RiskBundles:Storage"));
builder.Services.AddSingleton<IValidateOptions<RiskBundleWorkerOptions>, RiskBundleWorkerOptionsValidator>();
builder.Services.AddSingleton<IValidateOptions<RiskBundleManifestSigningOptions>, RiskBundleSigningOptionsValidator>();
builder.Services.AddSingleton<IValidateOptions<FileSystemRiskBundleStorageOptions>, RiskBundleStorageOptionsValidator>();
builder.Services.AddSingleton<DevPortalOfflineBundleBuilder>();
builder.Services.AddSingleton<IDevPortalOfflineManifestSigner, HmacDevPortalOfflineManifestSigner>();

View File

@@ -0,0 +1,82 @@
using Microsoft.Extensions.Options;
using StellaOps.ExportCenter.RiskBundles;
namespace StellaOps.ExportCenter.Worker;
internal sealed class RiskBundleWorkerOptionsValidator : IValidateOptions<RiskBundleWorkerOptions>
{
public ValidateOptionsResult Validate(string? name, RiskBundleWorkerOptions options)
{
if (options is null)
{
return ValidateOptionsResult.Fail("Options instance is null.");
}
if (!options.Enabled)
{
return ValidateOptionsResult.Success;
}
var failures = new List<string>();
if (options.Providers is null || options.Providers.Count == 0)
{
failures.Add("At least one provider must be configured when RiskBundles.Enabled = true.");
}
else
{
foreach (var (provider, index) in options.Providers.Select((p, i) => (p, i)))
{
if (string.IsNullOrWhiteSpace(provider.ProviderId))
{
failures.Add($"Providers[{index}].ProviderId is required.");
}
if (string.IsNullOrWhiteSpace(provider.SourcePath))
{
failures.Add($"Providers[{index}].SourcePath is required.");
}
if (string.IsNullOrWhiteSpace(provider.Source))
{
failures.Add($"Providers[{index}].Source is required.");
}
}
}
return failures.Count == 0
? ValidateOptionsResult.Success
: ValidateOptionsResult.Fail(failures);
}
}
internal sealed class RiskBundleSigningOptionsValidator : IValidateOptions<RiskBundleManifestSigningOptions>
{
public ValidateOptionsResult Validate(string? name, RiskBundleManifestSigningOptions options)
{
if (options is null)
{
return ValidateOptionsResult.Fail("Signing options instance is null.");
}
if (string.IsNullOrWhiteSpace(options.Key))
{
return ValidateOptionsResult.Fail("RiskBundles:Signing:Key must be configured.");
}
return ValidateOptionsResult.Success;
}
}
internal sealed class RiskBundleStorageOptionsValidator : IValidateOptions<FileSystemRiskBundleStorageOptions>
{
public ValidateOptionsResult Validate(string? name, FileSystemRiskBundleStorageOptions options)
{
if (options is null)
{
return ValidateOptionsResult.Fail("Storage options instance is null.");
}
return string.IsNullOrWhiteSpace(options.RootPath)
? ValidateOptionsResult.Fail("RiskBundles:Storage:RootPath must be configured.")
: ValidateOptionsResult.Success;
}
}