1c546c111a
- Fix CriteriaSheetGenerator.FormatTimestamp to handle all DateTimeKind values - Update TestWebApplicationFactory to use IAuthenticationService - Add logger parameter to ExcelParserServiceTests - Add SecureStoreManager to solution under /utils/ folder
536 lines
14 KiB
C#
536 lines
14 KiB
C#
using Shouldly;
|
|
using Xunit;
|
|
using JdeScoping.SecureStoreManager.ViewModels;
|
|
|
|
namespace JdeScoping.SecureStoreManager.Tests.ViewModels;
|
|
|
|
public class NewStoreDialogViewModelTests
|
|
{
|
|
[Fact]
|
|
public void IsValid_WhenStorePathEmpty_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = string.Empty;
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = "/path/to/key.key";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenUseKeyFileButKeyFilePathEmpty_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenUsePasswordButPasswordEmpty_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UsePassword = true;
|
|
sut.Password = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenPasswordsDoNotMatch_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UsePassword = true;
|
|
sut.Password = "password123";
|
|
sut.ConfirmPassword = "different456";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WithValidKeyFileConfiguration_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = "/path/to/key.key";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WithValidPasswordConfiguration_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UsePassword = true;
|
|
sut.Password = "password123";
|
|
sut.ConfirmPassword = "password123";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void UseKeyFile_WhenSetToTrue_SetsUsePasswordToFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.UsePassword = true;
|
|
|
|
// Act
|
|
sut.UseKeyFile = true;
|
|
|
|
// Assert
|
|
sut.UsePassword.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void UsePassword_WhenSetToTrue_SetsUseKeyFileToFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.UseKeyFile = true;
|
|
|
|
// Act
|
|
sut.UsePassword = true;
|
|
|
|
// Assert
|
|
sut.UseKeyFile.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenStorePathEmpty_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Store path is required.");
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenKeyFilePathEmpty_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Key file path is required.");
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenPasswordEmpty_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UsePassword = true;
|
|
sut.Password = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Password is required.");
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenPasswordsDoNotMatch_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UsePassword = true;
|
|
sut.Password = "password123";
|
|
sut.ConfirmPassword = "different456";
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Passwords do not match.");
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenValid_ReturnsNull()
|
|
{
|
|
// Arrange
|
|
var sut = new NewStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = "/path/to/key.key";
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBeNull();
|
|
}
|
|
}
|
|
|
|
public class OpenStoreDialogViewModelTests
|
|
{
|
|
[Fact]
|
|
public void IsValid_WhenStorePathEmpty_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenUseKeyFileButKeyFilePathEmpty_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenUsePasswordButPasswordEmpty_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UsePassword = true;
|
|
sut.Password = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WithValidKeyFileConfiguration_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = "/path/to/key.key";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WithValidPasswordConfiguration_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = "/path/to/store.json";
|
|
sut.UsePassword = true;
|
|
sut.Password = "password123";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void UseKeyFile_WhenSetToTrue_SetsUsePasswordToFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.UsePassword = true;
|
|
|
|
// Act
|
|
sut.UseKeyFile = true;
|
|
|
|
// Assert
|
|
sut.UsePassword.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void UsePassword_WhenSetToTrue_SetsUseKeyFileToFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.UseKeyFile = true;
|
|
|
|
// Act
|
|
sut.UsePassword = true;
|
|
|
|
// Assert
|
|
sut.UseKeyFile.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenStorePathEmpty_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Store path is required.");
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenStoreFileDoesNotExist_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = "/nonexistent/path/to/store.json";
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Store file does not exist.");
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenKeyFilePathEmpty_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange - Create temp store file so we get past that validation
|
|
var tempFile = Path.GetTempFileName();
|
|
try
|
|
{
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = tempFile;
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Key file path is required.");
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(tempFile);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenKeyFileDoesNotExist_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange - Create temp store file so we get past that validation
|
|
var tempFile = Path.GetTempFileName();
|
|
try
|
|
{
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = tempFile;
|
|
sut.UseKeyFile = true;
|
|
sut.KeyFilePath = "/nonexistent/key.key";
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Key file does not exist.");
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(tempFile);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenPasswordEmpty_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange - Create temp store file so we get past that validation
|
|
var tempFile = Path.GetTempFileName();
|
|
try
|
|
{
|
|
var sut = new OpenStoreDialogViewModel();
|
|
sut.StorePath = tempFile;
|
|
sut.UsePassword = true;
|
|
sut.Password = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Password is required.");
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(tempFile);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class SecretEditDialogViewModelTests
|
|
{
|
|
[Fact]
|
|
public void DefaultConstructor_SetsIsNewSecretToTrue()
|
|
{
|
|
// Arrange & Act
|
|
var sut = new SecretEditDialogViewModel();
|
|
|
|
// Assert
|
|
sut.IsNewSecret.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void ParameterizedConstructor_SetsKey()
|
|
{
|
|
// Arrange & Act
|
|
var sut = new SecretEditDialogViewModel("testKey", "testValue");
|
|
|
|
// Assert
|
|
sut.Key.ShouldBe("testKey");
|
|
}
|
|
|
|
[Fact]
|
|
public void ParameterizedConstructor_SetsValue()
|
|
{
|
|
// Arrange & Act
|
|
var sut = new SecretEditDialogViewModel("testKey", "testValue");
|
|
|
|
// Assert
|
|
sut.Value.ShouldBe("testValue");
|
|
}
|
|
|
|
[Fact]
|
|
public void ParameterizedConstructor_SetsIsNewSecretToFalse()
|
|
{
|
|
// Arrange & Act
|
|
var sut = new SecretEditDialogViewModel("testKey", "testValue");
|
|
|
|
// Assert
|
|
sut.IsNewSecret.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsKeyEditable_WhenIsNewSecret_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
|
|
// Act & Assert
|
|
sut.IsKeyEditable.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsKeyEditable_WhenEditingExisting_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel("testKey", "testValue");
|
|
|
|
// Act & Assert
|
|
sut.IsKeyEditable.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void DialogTitle_WhenIsNewSecret_ReturnsAddSecret()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
|
|
// Act & Assert
|
|
sut.DialogTitle.ShouldBe("Add Secret");
|
|
}
|
|
|
|
[Fact]
|
|
public void DialogTitle_WhenEditingExisting_ReturnsEditSecret()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel("testKey", "testValue");
|
|
|
|
// Act & Assert
|
|
sut.DialogTitle.ShouldBe("Edit Secret");
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenKeyEmpty_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
sut.Key = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenKeyWhitespace_ReturnsFalse()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
sut.Key = " ";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsValid_WhenKeyProvided_ReturnsTrue()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
sut.Key = "validKey";
|
|
|
|
// Act & Assert
|
|
sut.IsValid.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenKeyEmpty_ReturnsAppropriateMessage()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
sut.Key = string.Empty;
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBe("Key is required.");
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidationError_WhenKeyProvided_ReturnsNull()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
sut.Key = "validKey";
|
|
|
|
// Act & Assert
|
|
sut.ValidationError.ShouldBeNull();
|
|
}
|
|
|
|
[Fact]
|
|
public void Key_SetterRaisesPropertyChanged()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
var propertyChangedRaised = false;
|
|
sut.PropertyChanged += (s, e) =>
|
|
{
|
|
if (e.PropertyName == nameof(sut.Key))
|
|
propertyChangedRaised = true;
|
|
};
|
|
|
|
// Act
|
|
sut.Key = "newKey";
|
|
|
|
// Assert
|
|
propertyChangedRaised.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Value_SetterRaisesPropertyChanged()
|
|
{
|
|
// Arrange
|
|
var sut = new SecretEditDialogViewModel();
|
|
var propertyChangedRaised = false;
|
|
sut.PropertyChanged += (s, e) =>
|
|
{
|
|
if (e.PropertyName == nameof(sut.Value))
|
|
propertyChangedRaised = true;
|
|
};
|
|
|
|
// Act
|
|
sut.Value = "newValue";
|
|
|
|
// Assert
|
|
propertyChangedRaised.ShouldBeTrue();
|
|
}
|
|
}
|