Files
Omika/tests/Omika.Tests/ApplicationRuntimeContextTests.cs
2026-10-23 18:46:50 +02:00

271 lines
9.4 KiB
C#

using Omika.Core.Compatibility;
using Omika.Core.Runtime;
namespace Omika.Tests;
[Collection("ApplicationRuntimeContext")]
public class ApplicationRuntimeContextTests
{
[Fact]
public void Parse_Auto_IsRecognized()
{
var result = DatabaseSchemaSelectionParser.Parse("Auto");
Assert.True(result.IsSuccess);
Assert.Equal(DatabaseSchemaSelection.Auto, result.Value);
}
[Fact]
public void Parse_Batik_IsRecognized()
{
var result = DatabaseSchemaSelectionParser.Parse("Batik");
Assert.True(result.IsSuccess);
Assert.Equal(DatabaseSchemaSelection.Batik, result.Value);
}
[Fact]
public void Parse_Omika_IsRecognized()
{
var result = DatabaseSchemaSelectionParser.Parse("Omika");
Assert.True(result.IsSuccess);
Assert.Equal(DatabaseSchemaSelection.Omika, result.Value);
}
[Theory]
[InlineData("auto")]
[InlineData("AUTO")]
[InlineData("batik")]
[InlineData("Batik")]
[InlineData("BATIK")]
[InlineData(" Omika ")]
[InlineData("omika")]
[InlineData("OMIKA")]
public void Parse_IsCaseAndWhitespaceInsensitive(string value)
{
var result = DatabaseSchemaSelectionParser.Parse(value);
Assert.True(result.IsSuccess);
}
[Fact]
public void Parse_UnknownValue_ReturnsClearError()
{
var result = DatabaseSchemaSelectionParser.Parse("2024");
Assert.True(result.IsFailure);
var error = Assert.Single(result.Errors);
Assert.Contains("2024", error, StringComparison.OrdinalIgnoreCase);
Assert.Contains(nameof(DatabaseSchemaSelection.Auto), error, StringComparison.Ordinal);
Assert.Contains(nameof(DatabaseSchemaSelection.Batik), error, StringComparison.Ordinal);
Assert.Contains(nameof(DatabaseSchemaSelection.Omika), error, StringComparison.Ordinal);
}
[Fact]
public void Parse_NullOrEmpty_ReturnsClearError()
{
var result = DatabaseSchemaSelectionParser.Parse(null);
Assert.True(result.IsFailure);
Assert.NotEmpty(result.Errors);
}
[Fact]
public void TryParse_KnownValue_ReturnsTrue()
{
var ok = DatabaseSchemaSelectionParser.TryParse("Batik", out var selection);
Assert.True(ok);
Assert.Equal(DatabaseSchemaSelection.Batik, selection);
}
[Fact]
public void TryParse_UnknownValue_ReturnsFalse()
{
var ok = DatabaseSchemaSelectionParser.TryParse("inconnu", out _);
Assert.False(ok);
}
[Fact]
public void Configure_UnknownValue_ThrowsClearError()
{
ApplicationRuntimeContext.Reset();
var ex = Assert.Throws<InvalidOperationException>(() => ApplicationRuntimeContext.Configure("inconnu"));
Assert.Contains("inconnu", ex.Message, StringComparison.OrdinalIgnoreCase);
Assert.Contains(ApplicationRuntimeContext.ConfigurationKey, ex.Message, StringComparison.Ordinal);
}
[Fact]
public void Configure_ForcedSelection_WithoutDetection_IsNotActive()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Omika);
Assert.True(ApplicationRuntimeContext.IsConfigured);
Assert.Equal(DatabaseSchemaSelection.Omika, ApplicationRuntimeContext.Current.Selection);
Assert.Equal(DatabaseSchemaVersion.Unknown, ApplicationRuntimeContext.Current.DetectedVersion);
Assert.False(ApplicationRuntimeContext.Current.IsOmika);
Assert.False(ApplicationRuntimeContext.Current.IsBatik);
}
[Fact]
public void Configure_Auto_WithoutDetection_IsUnknown()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Auto);
Assert.True(ApplicationRuntimeContext.IsConfigured);
Assert.Equal(DatabaseSchemaVersion.Unknown, ApplicationRuntimeContext.Current.DetectedVersion);
Assert.False(ApplicationRuntimeContext.Current.IsBatik);
Assert.False(ApplicationRuntimeContext.Current.IsOmika);
}
[Fact]
public void Configure_Auto_WithDetectedOmika_IsOmika()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Auto);
var result = ApplicationRuntimeContext.SetDetectedVersion(DatabaseSchemaVersion.Omika);
Assert.True(result.IsSuccess);
Assert.True(ApplicationRuntimeContext.Current.IsOmika);
Assert.False(ApplicationRuntimeContext.Current.IsBatik);
Assert.Equal(DatabaseSchemaVersion.Omika, ApplicationRuntimeContext.Current.DetectedVersion);
}
[Fact]
public void Configure_Auto_WithDetectedBatik_IsBatik()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Auto);
var result = ApplicationRuntimeContext.SetDetectedVersion(DatabaseSchemaVersion.Batik);
Assert.True(result.IsSuccess);
Assert.True(ApplicationRuntimeContext.Current.IsBatik);
Assert.False(ApplicationRuntimeContext.Current.IsOmika);
Assert.Equal(DatabaseSchemaVersion.Batik, ApplicationRuntimeContext.Current.DetectedVersion);
}
[Fact]
public void Configure_ForcedOmika_WithDetectedOmika_IsOmika()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Omika);
var result = ApplicationRuntimeContext.SetDetectedVersion(DatabaseSchemaVersion.Omika);
Assert.True(result.IsSuccess);
Assert.True(ApplicationRuntimeContext.Current.IsOmika);
Assert.Equal(DatabaseSchemaVersion.Omika, ApplicationRuntimeContext.Current.DetectedVersion);
}
[Fact]
public void Configure_ForcedBatik_WithDetectedBatik_IsBatik()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Batik);
var result = ApplicationRuntimeContext.SetDetectedVersion(DatabaseSchemaVersion.Batik);
Assert.True(result.IsSuccess);
Assert.True(ApplicationRuntimeContext.Current.IsBatik);
Assert.Equal(DatabaseSchemaVersion.Batik, ApplicationRuntimeContext.Current.DetectedVersion);
}
[Fact]
public void Configure_ForcedOmika_WithDetectedBatik_ReturnsFailureAndKeepsUnknown()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Omika);
var result = ApplicationRuntimeContext.SetDetectedVersion(DatabaseSchemaVersion.Batik);
Assert.True(result.IsFailure);
Assert.NotEmpty(result.Errors);
Assert.Equal(DatabaseSchemaVersion.Unknown, ApplicationRuntimeContext.Current.DetectedVersion);
Assert.False(ApplicationRuntimeContext.Current.IsOmika);
Assert.False(ApplicationRuntimeContext.Current.IsBatik);
}
[Fact]
public void Configure_ForcedBatik_WithDetectedOmika_ReturnsFailureAndKeepsUnknown()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Batik);
var result = ApplicationRuntimeContext.SetDetectedVersion(DatabaseSchemaVersion.Omika);
Assert.True(result.IsFailure);
Assert.NotEmpty(result.Errors);
Assert.Equal(DatabaseSchemaVersion.Unknown, ApplicationRuntimeContext.Current.DetectedVersion);
Assert.False(ApplicationRuntimeContext.Current.IsOmika);
Assert.False(ApplicationRuntimeContext.Current.IsBatik);
}
[Fact]
public void SetDetectedVersion_UnknownVersion_ReturnsFailure()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Auto);
var result = ApplicationRuntimeContext.SetDetectedVersion(DatabaseSchemaVersion.Unknown);
Assert.True(result.IsFailure);
Assert.NotEmpty(result.Errors);
}
[Fact]
public void ValidateDetectedVersion_ForcedSelection_Mismatch_ReturnsFailure()
{
ApplicationRuntimeContext.Reset();
ApplicationRuntimeContext.Configure(DatabaseSchemaSelection.Omika);
var result = ApplicationRuntimeContext.Current.ValidateDetectedVersion(DatabaseSchemaVersion.Batik);
Assert.True(result.IsFailure);
var error = Assert.Single(result.Errors);
Assert.Contains(nameof(DatabaseSchemaSelection.Omika), error, StringComparison.Ordinal);
Assert.Contains(nameof(DatabaseSchemaVersion.Batik), error, StringComparison.Ordinal);
}
[Fact]
public void FromConfiguration_ReturnsContextWithParsedSelection()
{
var result = ApplicationRuntimeContext.FromConfiguration("Batik");
Assert.True(result.IsSuccess);
Assert.Equal(DatabaseSchemaSelection.Batik, result.Value.Selection);
Assert.Equal(DatabaseSchemaVersion.Unknown, result.Value.DetectedVersion);
Assert.False(result.Value.IsBatik);
Assert.False(result.Value.IsOmika);
}
[Fact]
public void FromConfiguration_UnknownValue_ReturnsFailure()
{
var result = ApplicationRuntimeContext.FromConfiguration("n'importe quoi");
Assert.True(result.IsFailure);
Assert.NotEmpty(result.Errors);
}
[Fact]
public void Current_WithoutConfiguration_ThrowsClearError()
{
ApplicationRuntimeContext.Reset();
var ex = Assert.Throws<InvalidOperationException>(() => _ = ApplicationRuntimeContext.Current);
Assert.Contains(nameof(ApplicationRuntimeContext.Configure), ex.Message, StringComparison.Ordinal);
}
}