1fc7792cd1
Rename ConfigManager to ConfigManager.Ui to match the Core/CLI/UI project structure, and split the monolithic test project into Core.Tests, Cli.Tests, and Ui.Tests to align with the source project organization.
194 lines
6.2 KiB
C#
194 lines
6.2 KiB
C#
using JdeScoping.ConfigManager.Core.Services;
|
|
using JdeScoping.ConfigManager.Ui.ViewModels.Dialogs;
|
|
|
|
namespace JdeScoping.ConfigManager.Ui.Tests.ViewModels.Dialogs;
|
|
|
|
public class ValidationResultsDialogViewModelTests
|
|
{
|
|
[Fact]
|
|
public void Constructor_WithEmptyResults_HasNoItems()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
var pipelinesResult = new ValidationResult();
|
|
|
|
// Act
|
|
var sut = new ValidationResultsDialogViewModel(appSettingsResult, pipelinesResult);
|
|
|
|
// Assert
|
|
sut.Items.Count.ShouldBe(0);
|
|
sut.ErrorCount.ShouldBe(0);
|
|
sut.WarningCount.ShouldBe(0);
|
|
sut.IsValid.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_WithErrors_PopulatesItemsCorrectly()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
appSettingsResult.AddError("Missing connection string");
|
|
appSettingsResult.AddError("Invalid timeout value");
|
|
var pipelinesResult = new ValidationResult();
|
|
|
|
// Act
|
|
var sut = new ValidationResultsDialogViewModel(appSettingsResult, pipelinesResult);
|
|
|
|
// Assert
|
|
sut.Items.Count.ShouldBe(2);
|
|
sut.ErrorCount.ShouldBe(2);
|
|
sut.WarningCount.ShouldBe(0);
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_WithWarnings_PopulatesItemsCorrectly()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
appSettingsResult.AddWarning("Deprecated setting used");
|
|
var pipelinesResult = new ValidationResult();
|
|
pipelinesResult.AddWarning("Pipeline has no transformers");
|
|
|
|
// Act
|
|
var sut = new ValidationResultsDialogViewModel(appSettingsResult, pipelinesResult);
|
|
|
|
// Assert
|
|
sut.Items.Count.ShouldBe(2);
|
|
sut.ErrorCount.ShouldBe(0);
|
|
sut.WarningCount.ShouldBe(2);
|
|
sut.IsValid.ShouldBeFalse(); // Both errors and warnings make it invalid
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_WithMixedResults_PopulatesAllItems()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
appSettingsResult.AddError("Error in appsettings");
|
|
appSettingsResult.AddWarning("Warning in appsettings");
|
|
var pipelinesResult = new ValidationResult();
|
|
pipelinesResult.AddError("Error in pipelines");
|
|
pipelinesResult.AddWarning("Warning in pipelines");
|
|
|
|
// Act
|
|
var sut = new ValidationResultsDialogViewModel(appSettingsResult, pipelinesResult);
|
|
|
|
// Assert
|
|
sut.Items.Count.ShouldBe(4);
|
|
sut.ErrorCount.ShouldBe(2);
|
|
sut.WarningCount.ShouldBe(2);
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_SetsCorrectSourceOnItems()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
appSettingsResult.AddError("App error");
|
|
var pipelinesResult = new ValidationResult();
|
|
pipelinesResult.AddError("Pipeline error");
|
|
|
|
// Act
|
|
var sut = new ValidationResultsDialogViewModel(appSettingsResult, pipelinesResult);
|
|
|
|
// Assert
|
|
sut.Items.ShouldContain(i => i.Source == "appsettings.json" && i.Message == "App error");
|
|
sut.Items.ShouldContain(i => i.Source == "pipelines.json" && i.Message == "Pipeline error");
|
|
}
|
|
|
|
[Fact]
|
|
public void CloseCommand_InvokesRequestClose()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
var pipelinesResult = new ValidationResult();
|
|
var sut = new ValidationResultsDialogViewModel(appSettingsResult, pipelinesResult);
|
|
var closeInvoked = false;
|
|
sut.RequestClose = () => closeInvoked = true;
|
|
|
|
// Act
|
|
sut.CloseCommand.Execute(null);
|
|
|
|
// Assert
|
|
closeInvoked.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void CloseCommand_DoesNotThrow_WhenRequestCloseIsNull()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
var pipelinesResult = new ValidationResult();
|
|
var sut = new ValidationResultsDialogViewModel(appSettingsResult, pipelinesResult);
|
|
sut.RequestClose = null;
|
|
|
|
// Act & Assert - Should not throw
|
|
Should.NotThrow(() => sut.CloseCommand.Execute(null));
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_ThrowsOnNullAppSettingsResult()
|
|
{
|
|
// Arrange
|
|
var pipelinesResult = new ValidationResult();
|
|
|
|
// Act & Assert
|
|
Should.Throw<ArgumentNullException>(() =>
|
|
new ValidationResultsDialogViewModel(null!, pipelinesResult));
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_ThrowsOnNullPipelinesResult()
|
|
{
|
|
// Arrange
|
|
var appSettingsResult = new ValidationResult();
|
|
|
|
// Act & Assert
|
|
Should.Throw<ArgumentNullException>(() =>
|
|
new ValidationResultsDialogViewModel(appSettingsResult, null!));
|
|
}
|
|
}
|
|
|
|
public class ValidationItemViewModelTests
|
|
{
|
|
[Fact]
|
|
public void Constructor_SetsPropertiesCorrectly()
|
|
{
|
|
// Act
|
|
var sut = new ValidationItemViewModel("Test message", "test.json", ValidationItemType.Error);
|
|
|
|
// Assert
|
|
sut.Message.ShouldBe("Test message");
|
|
sut.Source.ShouldBe("test.json");
|
|
sut.Type.ShouldBe(ValidationItemType.Error);
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_ErrorType_SetsErrorStyling()
|
|
{
|
|
// Act
|
|
var sut = new ValidationItemViewModel("Error", "test.json", ValidationItemType.Error);
|
|
|
|
// Assert
|
|
sut.Icon.ShouldBe("\u2717"); // X mark
|
|
sut.IconColor.ShouldBe("#FF6B6B");
|
|
sut.Background.ShouldBe("#1AFF6B6B");
|
|
sut.BorderColor.ShouldBe("#FF6B6B");
|
|
}
|
|
|
|
[Fact]
|
|
public void Constructor_WarningType_SetsWarningStyling()
|
|
{
|
|
// Act
|
|
var sut = new ValidationItemViewModel("Warning", "test.json", ValidationItemType.Warning);
|
|
|
|
// Assert
|
|
sut.Icon.ShouldBe("\u26A0"); // Warning sign
|
|
sut.IconColor.ShouldBe("#FFB84D");
|
|
sut.Background.ShouldBe("#1AFFB84D");
|
|
sut.BorderColor.ShouldBe("#FFB84D");
|
|
}
|
|
}
|