45edcf5e5f
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.
231 lines
8.2 KiB
C#
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));
|
|
}
|
|
}
|