Files
jdescopingtool/NEW/tests/JdeScoping.ConfigManager.Tests/ViewModels/Forms/SearchFormViewModelTests.cs
T
Joseph Doherty 7c4781dfe3 refactor(configmanager): split into Core, CLI, and UI projects
Extract shared models, services, and application logic into
JdeScoping.ConfigManager.Core library. Add JdeScoping.ConfigManager.Cli
console app with validate, test-connection, and secret commands using
System.CommandLine. UI project now references Core for platform-agnostic
functionality while retaining Avalonia-specific dialog and clipboard services.
2026-01-28 10:01:48 -05:00

109 lines
2.8 KiB
C#

using JdeScoping.ConfigManager.Core.Models;
using JdeScoping.ConfigManager.ViewModels.Forms;
namespace JdeScoping.ConfigManager.Tests.ViewModels.Forms;
public class SearchFormViewModelTests
{
[Fact]
public void Constructor_InitializesFromModel()
{
// Arrange
var model = new SearchSection
{
MaxResultRows = 50000,
TimeoutSeconds = 600,
MaxConcurrentSearches = 10
};
// Act
var sut = new SearchFormViewModel(model, () => { });
// Assert
sut.MaxResultRows.ShouldBe(50000);
sut.TimeoutSeconds.ShouldBe(600);
sut.MaxConcurrentSearches.ShouldBe(10);
}
[Fact]
public void PropertyChange_UpdatesModel()
{
// Arrange
var model = new SearchSection { MaxResultRows = 100000 };
var sut = new SearchFormViewModel(model, () => { });
// Act
sut.MaxResultRows = 25000;
// Assert
model.MaxResultRows.ShouldBe(25000);
}
[Fact]
public void PropertyChange_InvokesOnChanged()
{
// Arrange
var model = new SearchSection();
var changedInvoked = false;
var sut = new SearchFormViewModel(model, () => changedInvoked = true);
// Act
sut.TimeoutSeconds = 120;
// Assert
changedInvoked.ShouldBeTrue();
}
[Fact]
public void PropertyChange_RaisesPropertyChanged()
{
// Arrange
var model = new SearchSection();
var sut = new SearchFormViewModel(model, () => { });
var propertyChangedRaised = false;
sut.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(SearchFormViewModel.MaxConcurrentSearches))
propertyChangedRaised = true;
};
// Act
sut.MaxConcurrentSearches = 8;
// Assert
propertyChangedRaised.ShouldBeTrue();
}
[Fact]
public void Constructor_ThrowsOnNullModel()
{
// Act & Assert
Should.Throw<ArgumentNullException>(() => new SearchFormViewModel(null!, () => { }));
}
[Fact]
public void Constructor_ThrowsOnNullCallback()
{
// Arrange
var model = new SearchSection();
// Act & Assert
Should.Throw<ArgumentNullException>(() => new SearchFormViewModel(model, null!));
}
[Fact]
public void PropertyChange_DoesNotInvokeOnChangedWhenValueUnchanged()
{
// Arrange
var model = new SearchSection { MaxResultRows = 50000 };
var changedCount = 0;
var sut = new SearchFormViewModel(model, () => changedCount++);
// Act - set to same value
sut.MaxResultRows = 50000;
// Assert
changedCount.ShouldBe(0);
}
}