Files
jdescopingtool/NEW/tests/JdeScoping.ConfigManager.Tests/ViewModels/Forms/SearchFormViewModelTests.cs
T
Joseph Doherty cc555e4e34 feat(configmanager): add SearchFormViewModel
Implements Task 18 from phases 7-9 plan. SearchFormViewModel wraps
SearchSection model with properties for MaxResultRows, TimeoutSeconds,
and MaxConcurrentSearches. Includes full test coverage with 7 tests
verifying initialization, two-way binding, change notification, and
null argument handling.
2026-01-19 19:45:07 -05:00

109 lines
2.8 KiB
C#

using JdeScoping.ConfigManager.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);
}
}