feat(kpi): K3 — KpiHistory project + options/validator + AddKpiHistory
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
using ZB.MOM.WW.ScadaBridge.KpiHistory;
|
||||
|
||||
namespace ZB.MOM.WW.ScadaBridge.KpiHistory.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// K3 unit tests for <see cref="KpiHistoryOptionsValidator"/>: the default
|
||||
/// options must validate, and each rule (SampleInterval / RetentionDays /
|
||||
/// PurgeInterval / DefaultMaxSeriesPoints) must reject its out-of-range values.
|
||||
/// </summary>
|
||||
public class KpiHistoryOptionsValidatorTests
|
||||
{
|
||||
private static KpiHistoryOptionsValidator NewValidator() => new();
|
||||
|
||||
[Fact]
|
||||
public void Validate_Defaults_Pass()
|
||||
{
|
||||
var result = NewValidator().Validate(null, new KpiHistoryOptions());
|
||||
Assert.True(result.Succeeded);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// SampleInterval > TimeSpan.Zero
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
[Fact]
|
||||
public void Validate_SampleInterval_Zero_Fails()
|
||||
{
|
||||
var opts = new KpiHistoryOptions { SampleInterval = TimeSpan.Zero };
|
||||
var result = NewValidator().Validate(null, opts);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Contains(
|
||||
result.Failures!,
|
||||
f => f.Contains(nameof(KpiHistoryOptions.SampleInterval), StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Validate_SampleInterval_Negative_Fails()
|
||||
{
|
||||
var opts = new KpiHistoryOptions { SampleInterval = TimeSpan.FromSeconds(-1) };
|
||||
var result = NewValidator().Validate(null, opts);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Contains(
|
||||
result.Failures!,
|
||||
f => f.Contains(nameof(KpiHistoryOptions.SampleInterval), StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// RetentionDays in [1, 3650]
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
[Theory]
|
||||
[InlineData(1)] // min
|
||||
[InlineData(90)] // default
|
||||
[InlineData(3650)] // max
|
||||
public void Validate_RetentionDays_InRange_Passes(int value)
|
||||
{
|
||||
var opts = new KpiHistoryOptions { RetentionDays = value };
|
||||
Assert.True(NewValidator().Validate(null, opts).Succeeded);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0)]
|
||||
[InlineData(3651)]
|
||||
[InlineData(-1)]
|
||||
public void Validate_RetentionDays_OutOfRange_Fails(int value)
|
||||
{
|
||||
var opts = new KpiHistoryOptions { RetentionDays = value };
|
||||
var result = NewValidator().Validate(null, opts);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Contains(
|
||||
result.Failures!,
|
||||
f => f.Contains(nameof(KpiHistoryOptions.RetentionDays), StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// PurgeInterval > TimeSpan.Zero
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
[Fact]
|
||||
public void Validate_PurgeInterval_Zero_Fails()
|
||||
{
|
||||
var opts = new KpiHistoryOptions { PurgeInterval = TimeSpan.Zero };
|
||||
var result = NewValidator().Validate(null, opts);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Contains(
|
||||
result.Failures!,
|
||||
f => f.Contains(nameof(KpiHistoryOptions.PurgeInterval), StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Validate_PurgeInterval_Negative_Fails()
|
||||
{
|
||||
var opts = new KpiHistoryOptions { PurgeInterval = TimeSpan.FromHours(-1) };
|
||||
var result = NewValidator().Validate(null, opts);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Contains(
|
||||
result.Failures!,
|
||||
f => f.Contains(nameof(KpiHistoryOptions.PurgeInterval), StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// DefaultMaxSeriesPoints in [2, 5000]
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
[Theory]
|
||||
[InlineData(2)] // min
|
||||
[InlineData(200)] // default
|
||||
[InlineData(5000)] // max
|
||||
public void Validate_DefaultMaxSeriesPoints_InRange_Passes(int value)
|
||||
{
|
||||
var opts = new KpiHistoryOptions { DefaultMaxSeriesPoints = value };
|
||||
Assert.True(NewValidator().Validate(null, opts).Succeeded);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(1)]
|
||||
[InlineData(5001)]
|
||||
[InlineData(0)]
|
||||
public void Validate_DefaultMaxSeriesPoints_OutOfRange_Fails(int value)
|
||||
{
|
||||
var opts = new KpiHistoryOptions { DefaultMaxSeriesPoints = value };
|
||||
var result = NewValidator().Validate(null, opts);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Contains(
|
||||
result.Failures!,
|
||||
f => f.Contains(nameof(KpiHistoryOptions.DefaultMaxSeriesPoints), StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Validate_AllRulesViolated_AccumulatesEveryFailure()
|
||||
{
|
||||
// The base class aggregates ALL failures, not just the first — one
|
||||
// message per violated rule.
|
||||
var opts = new KpiHistoryOptions
|
||||
{
|
||||
SampleInterval = TimeSpan.Zero,
|
||||
RetentionDays = 0,
|
||||
PurgeInterval = TimeSpan.Zero,
|
||||
DefaultMaxSeriesPoints = 1,
|
||||
};
|
||||
var result = NewValidator().Validate(null, opts);
|
||||
|
||||
Assert.False(result.Succeeded);
|
||||
Assert.Equal(4, result.Failures!.Count());
|
||||
}
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" />
|
||||
<PackageReference Include="xunit" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="Xunit" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../../src/ZB.MOM.WW.ScadaBridge.KpiHistory/ZB.MOM.WW.ScadaBridge.KpiHistory.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user