Files
chapter-organizer/Tests/Validation/ValidationConfigurationTests.cs
poprhythm 45edcf5e5f Refactor event assignment structure and introduce new models for assignment parameters and requirements
This commit removes the obsolete EventAssignment class from Core.Entities and introduces new models in Core.Models, including AssignmentParameters, AssignmentRequirement, PartialTeam, and StudentEventStatistics. The changes enhance the organization of assignment-related data and improve the overall structure of the codebase. Additionally, several files have been updated to include references to the new Core.Models namespace, ensuring consistency across the application.
2026-01-10 18:36:52 -05:00

231 lines
8.2 KiB
C#

using Core.Entities;
using Core.Models;
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));
}
}