230 lines
8.2 KiB
C#
230 lines
8.2 KiB
C#
using Core.Entities;
|
|
using Core.Validation;
|
|
using System.Text.Json;
|
|
|
|
namespace Tests.Validation;
|
|
|
|
[TestFixture]
|
|
public class ValidationConfigurationTests
|
|
{
|
|
[Test]
|
|
public void Default_ReturnsExpectedValues()
|
|
{
|
|
// Arrange & Act
|
|
var config = ValidationConfiguration.Default;
|
|
|
|
// Assert
|
|
Assert.That(config.MinRecommendedEvents, Is.EqualTo(2));
|
|
Assert.That(config.MaxRecommendedEvents, Is.EqualTo(4));
|
|
Assert.That(config.MinCriticalEvents, Is.EqualTo(1));
|
|
Assert.That(config.MaxCriticalEvents, Is.EqualTo(6));
|
|
Assert.That(config.MaxRegionalEvents, Is.EqualTo(3));
|
|
Assert.That(config.RequireRegionalEvent, Is.True);
|
|
Assert.That(config.RequireOnSiteActivity, Is.True);
|
|
Assert.That(config.RequireIndividualEvent, Is.False);
|
|
Assert.That(config.RequireTeamCaptain, Is.True);
|
|
Assert.That(config.NoRegionalEventSeverity, Is.EqualTo(ValidationSeverity.Warning));
|
|
Assert.That(config.EventCountSeverity, Is.EqualTo(ValidationSeverity.Warning));
|
|
Assert.That(config.MissingCaptainSeverity, Is.EqualTo(ValidationSeverity.Warning));
|
|
Assert.That(config.TooManyRegionalEventsSeverity, Is.EqualTo(ValidationSeverity.Warning));
|
|
}
|
|
|
|
[Test]
|
|
public void FromAssignmentParameters_CreatesCorrectConfiguration()
|
|
{
|
|
// Arrange
|
|
var parameters = new AssignmentParameters(
|
|
effortLowerBound: 5,
|
|
effortUpperBound: 8,
|
|
eventsLowerBound: 2,
|
|
eventsUpperBound: 4,
|
|
requireRegional: true,
|
|
requireOnSite: false
|
|
);
|
|
|
|
// Act
|
|
var config = ValidationConfiguration.FromAssignmentParameters(parameters);
|
|
|
|
// Assert
|
|
Assert.That(config.MinRecommendedEvents, Is.EqualTo(2));
|
|
Assert.That(config.MaxRecommendedEvents, Is.EqualTo(4));
|
|
Assert.That(config.RequireRegionalEvent, Is.True);
|
|
Assert.That(config.RequireOnSiteActivity, Is.False);
|
|
Assert.That(config.MinCriticalEvents, Is.EqualTo(1));
|
|
Assert.That(config.MaxCriticalEvents, Is.EqualTo(6));
|
|
Assert.That(config.RequireTeamCaptain, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void FromJson_ValidJson_ReturnsConfiguration()
|
|
{
|
|
// Arrange
|
|
var json = @"{
|
|
""MinRecommendedEvents"": 3,
|
|
""MaxRecommendedEvents"": 5,
|
|
""RequireRegionalEvent"": false,
|
|
""NoRegionalEventSeverity"": ""Error""
|
|
}";
|
|
|
|
// Act
|
|
var config = ValidationConfiguration.FromJson(json);
|
|
|
|
// Assert
|
|
Assert.That(config.MinRecommendedEvents, Is.EqualTo(3));
|
|
Assert.That(config.MaxRecommendedEvents, Is.EqualTo(5));
|
|
Assert.That(config.RequireRegionalEvent, Is.False);
|
|
Assert.That(config.NoRegionalEventSeverity, Is.EqualTo(ValidationSeverity.Error));
|
|
}
|
|
|
|
[Test]
|
|
public void FromJson_InvalidJson_ReturnsDefault()
|
|
{
|
|
// Arrange
|
|
var invalidJson = "{ invalid json }";
|
|
|
|
// Act
|
|
var config = ValidationConfiguration.FromJson(invalidJson);
|
|
|
|
// Assert - should return Default config on error
|
|
Assert.That(config, Is.Not.Null);
|
|
Assert.That(config.MinRecommendedEvents, Is.EqualTo(ValidationConfiguration.Default.MinRecommendedEvents));
|
|
}
|
|
|
|
[Test]
|
|
public async Task LoadFromFileAsync_NonExistentFile_ReturnsDefault()
|
|
{
|
|
// Arrange
|
|
var nonExistentPath = Path.Combine(Path.GetTempPath(), $"non_existent_{Guid.NewGuid()}.json");
|
|
|
|
// Act
|
|
var config = await ValidationConfiguration.LoadFromFileAsync(nonExistentPath);
|
|
|
|
// Assert
|
|
Assert.That(config, Is.Not.Null);
|
|
Assert.That(config.MinRecommendedEvents, Is.EqualTo(ValidationConfiguration.Default.MinRecommendedEvents));
|
|
}
|
|
|
|
[Test]
|
|
public async Task SaveToFileAsync_And_LoadFromFileAsync_RoundTrip()
|
|
{
|
|
// Arrange
|
|
var tempPath = Path.Combine(Path.GetTempPath(), $"test_config_{Guid.NewGuid()}.json");
|
|
var originalConfig = new ValidationConfiguration
|
|
{
|
|
MinRecommendedEvents = 3,
|
|
MaxRecommendedEvents = 5,
|
|
RequireRegionalEvent = false,
|
|
NoRegionalEventSeverity = ValidationSeverity.Error,
|
|
MaxRegionalEvents = 2
|
|
};
|
|
|
|
try
|
|
{
|
|
// Act
|
|
await originalConfig.SaveToFileAsync(tempPath);
|
|
var loadedConfig = await ValidationConfiguration.LoadFromFileAsync(tempPath);
|
|
|
|
// Assert
|
|
Assert.That(loadedConfig.MinRecommendedEvents, Is.EqualTo(3));
|
|
Assert.That(loadedConfig.MaxRecommendedEvents, Is.EqualTo(5));
|
|
Assert.That(loadedConfig.RequireRegionalEvent, Is.False);
|
|
Assert.That(loadedConfig.NoRegionalEventSeverity, Is.EqualTo(ValidationSeverity.Error));
|
|
Assert.That(loadedConfig.MaxRegionalEvents, Is.EqualTo(2));
|
|
}
|
|
finally
|
|
{
|
|
// Cleanup
|
|
if (File.Exists(tempPath))
|
|
File.Delete(tempPath);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public async Task SaveToFileAsync_CreatesReadableJson()
|
|
{
|
|
// Arrange
|
|
var tempPath = Path.Combine(Path.GetTempPath(), $"test_config_{Guid.NewGuid()}.json");
|
|
var config = new ValidationConfiguration
|
|
{
|
|
MinRecommendedEvents = 2,
|
|
MaxRecommendedEvents = 4
|
|
};
|
|
|
|
try
|
|
{
|
|
// Act
|
|
await config.SaveToFileAsync(tempPath);
|
|
var jsonContent = await File.ReadAllTextAsync(tempPath);
|
|
|
|
// Assert
|
|
Assert.That(jsonContent, Does.Contain("MinRecommendedEvents"));
|
|
Assert.That(jsonContent, Does.Contain("MaxRecommendedEvents"));
|
|
|
|
// Verify it's valid JSON
|
|
var doc = JsonDocument.Parse(jsonContent);
|
|
Assert.That(doc, Is.Not.Null);
|
|
}
|
|
finally
|
|
{
|
|
// Cleanup
|
|
if (File.Exists(tempPath))
|
|
File.Delete(tempPath);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void ValidationConfiguration_CanBeModified()
|
|
{
|
|
// Arrange
|
|
var config = ValidationConfiguration.Default;
|
|
|
|
// Act
|
|
config.MinRecommendedEvents = 5;
|
|
config.RequireRegionalEvent = false;
|
|
config.NoRegionalEventSeverity = ValidationSeverity.Error;
|
|
|
|
// Assert
|
|
Assert.That(config.MinRecommendedEvents, Is.EqualTo(5));
|
|
Assert.That(config.RequireRegionalEvent, Is.False);
|
|
Assert.That(config.NoRegionalEventSeverity, Is.EqualTo(ValidationSeverity.Error));
|
|
}
|
|
|
|
[Test]
|
|
public void ValidationConfiguration_AllPropertiesSerializable()
|
|
{
|
|
// Arrange
|
|
var config = new ValidationConfiguration
|
|
{
|
|
MinRecommendedEvents = 1,
|
|
MaxRecommendedEvents = 2,
|
|
MinCriticalEvents = 3,
|
|
MaxCriticalEvents = 4,
|
|
MaxRegionalEvents = 5,
|
|
RequireRegionalEvent = true,
|
|
RequireOnSiteActivity = false,
|
|
RequireIndividualEvent = true,
|
|
RequireTeamCaptain = false,
|
|
NoRegionalEventSeverity = ValidationSeverity.Error,
|
|
NoOnSiteActivitySeverity = ValidationSeverity.Warning,
|
|
NoIndividualEventSeverity = ValidationSeverity.Error,
|
|
TeamSizeSeverity = ValidationSeverity.Warning,
|
|
EventCountSeverity = ValidationSeverity.Error,
|
|
MissingCaptainSeverity = ValidationSeverity.Warning,
|
|
TooManyRegionalEventsSeverity = ValidationSeverity.Error
|
|
};
|
|
|
|
// Act
|
|
var json = JsonSerializer.Serialize(config);
|
|
var deserialized = JsonSerializer.Deserialize<ValidationConfiguration>(json);
|
|
|
|
// Assert
|
|
Assert.That(deserialized, Is.Not.Null);
|
|
Assert.That(deserialized!.MinRecommendedEvents, Is.EqualTo(config.MinRecommendedEvents));
|
|
Assert.That(deserialized.MaxRecommendedEvents, Is.EqualTo(config.MaxRecommendedEvents));
|
|
Assert.That(deserialized.RequireRegionalEvent, Is.EqualTo(config.RequireRegionalEvent));
|
|
Assert.That(deserialized.NoRegionalEventSeverity, Is.EqualTo(config.NoRegionalEventSeverity));
|
|
Assert.That(deserialized.MaxRegionalEvents, Is.EqualTo(config.MaxRegionalEvents));
|
|
Assert.That(deserialized.TooManyRegionalEventsSeverity, Is.EqualTo(config.TooManyRegionalEventsSeverity));
|
|
}
|
|
}
|