diff --git a/Directory.Packages.props b/Directory.Packages.props index 4ccf6f3b..3260542b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -24,7 +24,7 @@ - + @@ -43,4 +43,4 @@ - \ No newline at end of file + diff --git a/EstateManagementUI.BlazorServer.Tests/Common/AuthenticationHelpersTests.cs b/EstateManagementUI.BlazorServer.Tests/Common/AuthenticationHelpersTests.cs index f5945852..03ebe818 100644 --- a/EstateManagementUI.BlazorServer.Tests/Common/AuthenticationHelpersTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Common/AuthenticationHelpersTests.cs @@ -10,48 +10,48 @@ public void GetSecurityServiceAddresses_WithDefaultPorts_ReturnsCorrectAddresses { // Arrange var authority = "https://localhost:5001"; - + // Act var (authorityAddress, issuerAddress) = AuthenticationHelpers.GetSecurityServiceAddresses( authority, null, null); - + // Assert authorityAddress.ShouldBe("https://localhost:5001"); issuerAddress.ShouldBe("https://localhost:5001"); } - + [Fact] public void GetSecurityServiceAddresses_WithCustomLocalPort_ReturnsCorrectAuthorityAddress() { // Arrange var authority = "https://localhost:5001"; var securityServiceLocalPort = "6001"; - + // Act var (authorityAddress, issuerAddress) = AuthenticationHelpers.GetSecurityServiceAddresses( authority, securityServiceLocalPort, null); - + // Assert authorityAddress.ShouldBe("https://localhost:6001"); issuerAddress.ShouldBe("https://localhost:5001"); } - + [Fact] public void GetSecurityServiceAddresses_WithCustomPort_ReturnsCorrectIssuerAddress() { // Arrange var authority = "https://localhost:5001"; var securityServicePort = "7001"; - + // Act var (authorityAddress, issuerAddress) = AuthenticationHelpers.GetSecurityServiceAddresses( authority, null, securityServicePort); - + // Assert authorityAddress.ShouldBe("https://localhost:5001"); issuerAddress.ShouldBe("https://localhost:7001"); } - + [Fact] public void GetSecurityServiceAddresses_WithBothCustomPorts_ReturnsCorrectAddresses() { @@ -59,57 +59,57 @@ public void GetSecurityServiceAddresses_WithBothCustomPorts_ReturnsCorrectAddres var authority = "https://localhost:5001"; var securityServiceLocalPort = "6001"; var securityServicePort = "7001"; - + // Act var (authorityAddress, issuerAddress) = AuthenticationHelpers.GetSecurityServiceAddresses( authority, securityServiceLocalPort, securityServicePort); - + // Assert authorityAddress.ShouldBe("https://localhost:6001"); issuerAddress.ShouldBe("https://localhost:7001"); } - + [Fact] public void GetSecurityServiceAddresses_WithTrailingSlash_RemovesTrailingSlash() { // Arrange var authority = "https://localhost:5001/"; - + // Act var (authorityAddress, issuerAddress) = AuthenticationHelpers.GetSecurityServiceAddresses( authority, null, null); - + // Assert authorityAddress.ShouldBe("https://localhost:5001"); issuerAddress.ShouldBe("https://localhost:5001"); } - + [Fact] public void GetSecurityServiceAddresses_WithPath_PreservesPath() { // Arrange var authority = "https://localhost:5001/auth"; var securityServiceLocalPort = "6001"; - + // Act var (authorityAddress, issuerAddress) = AuthenticationHelpers.GetSecurityServiceAddresses( authority, securityServiceLocalPort, null); - + // Assert authorityAddress.ShouldBe("https://localhost:6001/auth"); issuerAddress.ShouldBe("https://localhost:5001/auth"); } - + [Fact] public void GetSecurityServiceAddresses_WithEmptyPortStrings_UsesDefaultPort() { // Arrange var authority = "https://localhost:5001"; - + // Act var (authorityAddress, issuerAddress) = AuthenticationHelpers.GetSecurityServiceAddresses( authority, string.Empty, string.Empty); - + // Assert authorityAddress.ShouldBe("https://localhost:5001"); issuerAddress.ShouldBe("https://localhost:5001"); diff --git a/EstateManagementUI.BlazorServer.Tests/Common/TestAuthenticationHandlerTests.cs b/EstateManagementUI.BlazorServer.Tests/Common/TestAuthenticationHandlerTests.cs index 761d6259..67068a9a 100644 --- a/EstateManagementUI.BlazorServer.Tests/Common/TestAuthenticationHandlerTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Common/TestAuthenticationHandlerTests.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Moq; +using Imposter.Abstractions; using Shouldly; using System.Security.Claims; using System.Text.Encodings.Web; @@ -14,22 +14,22 @@ namespace EstateManagementUI.BlazorServer.Tests.Common; public class TestAuthenticationHandlerTests { - private readonly Mock> _options; - private readonly Mock _loggerFactory; + private readonly IOptionsMonitorImposter _options; + private readonly ILoggerFactoryImposter _loggerFactory; private readonly IConfiguration _configuration; - private readonly Mock _httpContextAccessor; + private readonly IHttpContextAccessorImposter _httpContextAccessor; private readonly UrlEncoder _encoder; public TestAuthenticationHandlerTests() { - _options = new Mock>(); - _loggerFactory = new Mock(); - _httpContextAccessor = new Mock(); + _options = new IOptionsMonitorImposter(); + _loggerFactory = new ILoggerFactoryImposter(); + _httpContextAccessor = new IHttpContextAccessorImposter(); _encoder = UrlEncoder.Default; - - _options.Setup(x => x.Get(It.IsAny())).Returns(new AuthenticationSchemeOptions()); - _loggerFactory.Setup(x => x.CreateLogger(It.IsAny())).Returns(Mock.Of()); - + + _options.Get(Arg.Any()).Returns(new AuthenticationSchemeOptions()); + _loggerFactory.CreateLogger(Arg.Any()).Returns((new ILoggerImposter()).Instance()); + // Create a real configuration var configBuilder = new ConfigurationBuilder(); configBuilder.AddInMemoryCollection(new Dictionary @@ -52,29 +52,29 @@ public async Task HandleAuthenticateAsync_WithDefaultConfig_UsesAdministratorRol // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.QueryString = new QueryString(""); - + // Configure session - var sessionFeature = new Mock(); - var session = new Mock(); - sessionFeature.Setup(s => s.Session).Returns(session.Object); - httpContext.Features.Set(sessionFeature.Object); - - _httpContextAccessor.Setup(x => x.HttpContext).Returns(httpContext); - + var sessionFeature = new ISessionFeatureImposter(); + var session = new ISessionImposter(); + sessionFeature.Session.Getter().Returns(session.Instance()); + httpContext.Features.Set(sessionFeature.Instance()); + + _httpContextAccessor.HttpContext.Getter().Returns(httpContext); + var handler = new TestAuthenticationHandler( - _options.Object, - _loggerFactory.Object, - _encoder, - _configuration, - _httpContextAccessor.Object); - + _options.Instance(), + _loggerFactory.Instance(), + _encoder, + _configuration, + _httpContextAccessor.Instance()); + await handler.InitializeAsync( - new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), + new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), httpContext); - + // Act var result = await handler.AuthenticateAsync(); - + // Assert result.Succeeded.ShouldBeTrue(); result.Principal.ShouldNotBeNull(); @@ -89,42 +89,42 @@ public async Task HandleAuthenticateAsync_CreatesAdministratorUserClaims() // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.QueryString = new QueryString(""); - + // Configure session - var sessionFeature = new Mock(); - var session = new Mock(); - sessionFeature.Setup(s => s.Session).Returns(session.Object); - httpContext.Features.Set(sessionFeature.Object); - - _httpContextAccessor.Setup(x => x.HttpContext).Returns(httpContext); - + var sessionFeature = new ISessionFeatureImposter(); + var session = new ISessionImposter(); + sessionFeature.Session.Getter().Returns(session.Instance()); + httpContext.Features.Set(sessionFeature.Instance()); + + _httpContextAccessor.HttpContext.Getter().Returns(httpContext); + var handler = new TestAuthenticationHandler( - _options.Object, - _loggerFactory.Object, - _encoder, - _configuration, - _httpContextAccessor.Object); - + _options.Instance(), + _loggerFactory.Instance(), + _encoder, + _configuration, + _httpContextAccessor.Instance()); + await handler.InitializeAsync( - new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), + new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), httpContext); - + // Act var result = await handler.AuthenticateAsync(); - + // Assert result.Succeeded.ShouldBeTrue(); result.Principal.ShouldNotBeNull(); - + var roleClaim = result.Principal.FindFirst(ClaimTypes.Role); roleClaim?.Value.ShouldBe("Administrator"); - + var nameClaim = result.Principal.FindFirst(ClaimTypes.Name); nameClaim?.Value.ShouldBe("Admin User"); - + var emailClaim = result.Principal.FindFirst(ClaimTypes.Email); emailClaim?.Value.ShouldBe("administrator@test.com"); - + var estateIdClaim = result.Principal.FindFirst("estateId"); estateIdClaim?.Value.ShouldBe("11111111-1111-1111-1111-111111111111"); } @@ -135,33 +135,33 @@ public async Task HandleAuthenticateAsync_CreatesAllRequiredClaims() // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.QueryString = new QueryString(""); - + // Configure session - var sessionFeature = new Mock(); - var session = new Mock(); - sessionFeature.Setup(s => s.Session).Returns(session.Object); - httpContext.Features.Set(sessionFeature.Object); - - _httpContextAccessor.Setup(x => x.HttpContext).Returns(httpContext); - + var sessionFeature = new ISessionFeatureImposter(); + var session = new ISessionImposter(); + sessionFeature.Session.Getter().Returns(session.Instance()); + httpContext.Features.Set(sessionFeature.Instance()); + + _httpContextAccessor.HttpContext.Getter().Returns(httpContext); + var handler = new TestAuthenticationHandler( - _options.Object, - _loggerFactory.Object, - _encoder, - _configuration, - _httpContextAccessor.Object); - + _options.Instance(), + _loggerFactory.Instance(), + _encoder, + _configuration, + _httpContextAccessor.Instance()); + await handler.InitializeAsync( - new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), + new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), httpContext); - + // Act var result = await handler.AuthenticateAsync(); - + // Assert result.Succeeded.ShouldBeTrue(); result.Principal.ShouldNotBeNull(); - + result.Principal.FindFirst(ClaimTypes.NameIdentifier).ShouldNotBeNull(); result.Principal.FindFirst(ClaimTypes.Name).ShouldNotBeNull(); result.Principal.FindFirst(ClaimTypes.Email).ShouldNotBeNull(); @@ -176,29 +176,29 @@ public async Task HandleAuthenticateAsync_AlwaysSucceeds() // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.QueryString = new QueryString(""); - + // Configure session - var sessionFeature = new Mock(); - var session = new Mock(); - sessionFeature.Setup(s => s.Session).Returns(session.Object); - httpContext.Features.Set(sessionFeature.Object); - - _httpContextAccessor.Setup(x => x.HttpContext).Returns(httpContext); - + var sessionFeature = new ISessionFeatureImposter(); + var session = new ISessionImposter(); + sessionFeature.Session.Getter().Returns(session.Instance()); + httpContext.Features.Set(sessionFeature.Instance()); + + _httpContextAccessor.HttpContext.Getter().Returns(httpContext); + var handler = new TestAuthenticationHandler( - _options.Object, - _loggerFactory.Object, - _encoder, - _configuration, - _httpContextAccessor.Object); - + _options.Instance(), + _loggerFactory.Instance(), + _encoder, + _configuration, + _httpContextAccessor.Instance()); + await handler.InitializeAsync( - new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), + new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), httpContext); - + // Act var result = await handler.AuthenticateAsync(); - + // Assert result.Succeeded.ShouldBeTrue(); result.Failure.ShouldBeNull(); @@ -210,29 +210,29 @@ public async Task HandleAuthenticateAsync_CreatesAuthenticationTicket() // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.QueryString = new QueryString(""); - + // Configure session - var sessionFeature = new Mock(); - var session = new Mock(); - sessionFeature.Setup(s => s.Session).Returns(session.Object); - httpContext.Features.Set(sessionFeature.Object); - - _httpContextAccessor.Setup(x => x.HttpContext).Returns(httpContext); - + var sessionFeature = new ISessionFeatureImposter(); + var session = new ISessionImposter(); + sessionFeature.Session.Getter().Returns(session.Instance()); + httpContext.Features.Set(sessionFeature.Instance()); + + _httpContextAccessor.HttpContext.Getter().Returns(httpContext); + var handler = new TestAuthenticationHandler( - _options.Object, - _loggerFactory.Object, - _encoder, - _configuration, - _httpContextAccessor.Object); - + _options.Instance(), + _loggerFactory.Instance(), + _encoder, + _configuration, + _httpContextAccessor.Instance()); + await handler.InitializeAsync( - new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), + new AuthenticationScheme(TestAuthenticationHandler.SchemeName, null, typeof(TestAuthenticationHandler)), httpContext); - + // Act var result = await handler.AuthenticateAsync(); - + // Assert result.Succeeded.ShouldBeTrue(); result.Ticket.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj b/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj index f6b8834d..b6cda5d7 100644 --- a/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj +++ b/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj @@ -18,7 +18,7 @@ - + diff --git a/EstateManagementUI.BlazorServer.Tests/GlobalUsings.cs b/EstateManagementUI.BlazorServer.Tests/GlobalUsings.cs new file mode 100644 index 00000000..526fc02d --- /dev/null +++ b/EstateManagementUI.BlazorServer.Tests/GlobalUsings.cs @@ -0,0 +1,4 @@ +global using Microsoft.AspNetCore.Authentication; +global using Microsoft.AspNetCore.Hosting; +global using Microsoft.AspNetCore.Http.Features; +global using EstateManagementUI.BlazorServer.Permissions; diff --git a/EstateManagementUI.BlazorServer.Tests/Imposters.cs b/EstateManagementUI.BlazorServer.Tests/Imposters.cs new file mode 100644 index 00000000..f63032f1 --- /dev/null +++ b/EstateManagementUI.BlazorServer.Tests/Imposters.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.JSInterop; +using MediatR; +using Imposter.Abstractions; +using EstateManagementUI.BusinessLogic.Client; +using EstateManagementUI.BusinessLogic.Services; +using EstateManagementUI.BlazorServer.UIServices; +using EstateManagementUI.BlazorServer.Permissions; + + +[assembly: GenerateImposter(typeof(AuthenticationStateProvider))] +[assembly: GenerateImposter(typeof(IApiClient))] +[assembly: GenerateImposter(typeof(ICalendarUIService))] +[assembly: GenerateImposter(typeof(IContractUIService))] +[assembly: GenerateImposter(typeof(IEstateUIService))] +[assembly: GenerateImposter(typeof(IFileProcessingUIService))] +[assembly: GenerateImposter(typeof(IHttpContextAccessor))] +[assembly: GenerateImposter(typeof(IJSRuntime))] +[assembly: GenerateImposter(typeof(ILogger<>))] +[assembly: GenerateImposter(typeof(ILoggerFactory))] +[assembly: GenerateImposter(typeof(IMediator))] +[assembly: GenerateImposter(typeof(IMerchantUIService))] +[assembly: GenerateImposter(typeof(IOperatorUIService))] +[assembly: GenerateImposter(typeof(IOptionsMonitor))] +[assembly: GenerateImposter(typeof(IPermissionKeyProvider))] +[assembly: GenerateImposter(typeof(IPermissionService))] +[assembly: GenerateImposter(typeof(IPermissionStore))] +[assembly: GenerateImposter(typeof(ISession))] +[assembly: GenerateImposter(typeof(ISessionFeature))] +[assembly: GenerateImposter(typeof(ITransactionUIService))] +[assembly: GenerateImposter(typeof(IWebHostEnvironment))] +[assembly: GenerateImposter(typeof(NavigationManager))] diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs b/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs index 9aa23799..917ead3a 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs @@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using SimpleResults; using TestContext = Bunit.TestContext; @@ -18,25 +18,25 @@ namespace EstateManagementUI.BlazorServer.Tests.Pages; public abstract class BaseTest :TestContext { protected BaseTest() { - this._mockMediator = new Mock(); - this._mockNavigationManager = new Mock(); - this._mockPermissionKeyProvider = new Mock(); - this._mockAuthStateProvider = new Mock(); - this._mockPermissionService = new Mock(); - this._mockPermissionStore = new Mock(); + this._mockMediator = new IMediatorImposter(); + this._mockNavigationManager = new NavigationManagerImposter(); + this._mockPermissionKeyProvider = new IPermissionKeyProviderImposter(); + this._mockAuthStateProvider = new AuthenticationStateProviderImposter(); + this._mockPermissionService = new IPermissionServiceImposter(); + this._mockPermissionStore = new IPermissionStoreImposter(); this._fakeNavigationManager = new FakeNavigationManager(); - - this._mockPermissionKeyProvider.Setup(x => x.GetKey()).Returns("test-key"); - this._mockPermissionService.Setup(x => x.HasPermissionAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); - this.MerchantUIService.Setup(x => x.GetMerchants(It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + + this._mockPermissionKeyProvider.GetKey().Returns("test-key"); + this._mockPermissionService.HasPermissionAsync(Arg.Any(), Arg.Any()).ReturnsAsync(true); + this.MerchantUIService.GetMerchants(Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(x => x.GetMerchantsForDropDown(It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchantsForDropDown(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List { new() @@ -46,7 +46,7 @@ protected BaseTest() { MerchantName = "Test Merchant" } })); - this.FileProcessingUIService.Setup(x => x.GetFileProfiles(It.IsAny())) + this.FileProcessingUIService.GetFileProfiles(Arg.Any()) .ReturnsAsync(Result.Success(new List { new() @@ -66,18 +66,18 @@ protected BaseTest() { } })); - this.Services.AddSingleton(this._mockMediator.Object); - //this.Services.AddSingleton(this._mockNavigationManager.Object); + this.Services.AddSingleton(this._mockMediator.Instance()); + //this.Services.AddSingleton(this._mockNavigationManager.Instance()); Services.AddSingleton(_fakeNavigationManager); // register FakeNavigationManager - this.Services.AddSingleton(this._mockPermissionKeyProvider.Object); - this.Services.AddSingleton(this._mockPermissionService.Object); - this.Services.AddSingleton(this._mockAuthStateProvider.Object); - this.Services.AddSingleton(this._mockPermissionStore.Object); - this.Services.AddSingleton(this.EstateUIService.Object); - this.Services.AddSingleton(this.OperatorUIService.Object); - this.Services.AddSingleton(this.ContractUIService.Object); - this.Services.AddSingleton(this.MerchantUIService.Object); - this.Services.AddSingleton(this.FileProcessingUIService.Object); + this.Services.AddSingleton(this._mockPermissionKeyProvider.Instance()); + this.Services.AddSingleton(this._mockPermissionService.Instance()); + this.Services.AddSingleton(this._mockAuthStateProvider.Instance()); + this.Services.AddSingleton(this._mockPermissionStore.Instance()); + this.Services.AddSingleton(this.EstateUIService.Instance()); + this.Services.AddSingleton(this.OperatorUIService.Instance()); + this.Services.AddSingleton(this.ContractUIService.Instance()); + this.Services.AddSingleton(this.MerchantUIService.Instance()); + this.Services.AddSingleton(this.FileProcessingUIService.Instance()); // Add required permission components that render their children @@ -90,18 +90,18 @@ protected BaseTest() { this.AddTestAuthorization().SetClaims(claims); } - protected readonly Mock _mockMediator; - protected readonly Mock _mockNavigationManager; - protected readonly Mock _mockPermissionKeyProvider; - protected readonly Mock _mockPermissionService; - protected readonly Mock _mockAuthStateProvider; - protected readonly Mock _mockPermissionStore; + protected readonly IMediatorImposter _mockMediator; + protected readonly NavigationManagerImposter _mockNavigationManager; + protected readonly IPermissionKeyProviderImposter _mockPermissionKeyProvider; + protected readonly IPermissionServiceImposter _mockPermissionService; + protected readonly AuthenticationStateProviderImposter _mockAuthStateProvider; + protected readonly IPermissionStoreImposter _mockPermissionStore; protected readonly FakeNavigationManager _fakeNavigationManager; - protected readonly Mock EstateUIService = new Mock(); - protected readonly Mock OperatorUIService = new Mock(); - protected readonly Mock ContractUIService = new Mock(); - protected readonly Mock MerchantUIService = new Mock(); - protected readonly Mock FileProcessingUIService = new Mock(); + protected readonly IEstateUIServiceImposter EstateUIService = new IEstateUIServiceImposter(); + protected readonly IOperatorUIServiceImposter OperatorUIService = new IOperatorUIServiceImposter(); + protected readonly IContractUIServiceImposter ContractUIService = new IContractUIServiceImposter(); + protected readonly IMerchantUIServiceImposter MerchantUIService = new IMerchantUIServiceImposter(); + protected readonly IFileProcessingUIServiceImposter FileProcessingUIService = new IFileProcessingUIServiceImposter(); /// /// Minimal test double for NavigationManager. /// Register in DI as NavigationManager so components receive it in tests. diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs index 6cb9f658..ba7c3485 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs @@ -8,7 +8,7 @@ using MediatR; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using TransactionProcessor.DataTransferObjects.Responses.Contract; @@ -29,14 +29,14 @@ public void ContractsEdit_RendersCorrectly() OperatorName = "Test Operator", Products = new List() }; - - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); - + // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); - + // Assert cut.Markup.ShouldContain("Edit Contract"); } @@ -54,14 +54,14 @@ public void ContractsEdit_DisplaysContractDetails() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Contract"); cut.Markup.ShouldContain("Test Operator"); @@ -80,18 +80,18 @@ public void ContractsEdit_HasCorrectPageTitle() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); } - + [Fact] public void ContractsEdit_UpdateContractButton_CanBeFound() { @@ -105,18 +105,18 @@ public void ContractsEdit_UpdateContractButton_CanBeFound() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find Update Contract button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Contract")); - + // Assert updateButton.ShouldNotBeNull(); } @@ -134,18 +134,18 @@ public void ContractsEdit_AddProductButton_CanBeFound() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find Add Product button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product")); - + // Assert addProductButton.ShouldNotBeNull(); } @@ -163,20 +163,20 @@ public void ContractsEdit_AddProductButton_OpensModal() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find and click Add Product button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product")); addProductButton.ShouldNotBeNull(); addProductButton.Click(); - + // Assert - Modal should be visible cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add New Product"), timeout: TimeSpan.FromSeconds(5)); } @@ -206,14 +206,14 @@ public void ContractsEdit_WithProducts_DisplaysProductList() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Product 1"); cut.Markup.ShouldContain("Display 1"); @@ -245,19 +245,19 @@ public void ContractsEdit_WithProducts_HasRemoveProductButton() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find remove button (it has a trash icon svg) IRefreshableElementCollection buttons = cut.FindAll("button"); - var removeButton = buttons.FirstOrDefault(b => + var removeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Product"); - + // Assert removeButton.ShouldNotBeNull(); } @@ -298,18 +298,18 @@ public void ContractsEdit_WithProductHavingFees_HasAddFeeButton() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find Add Fee button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); - + // Assert addFeeButton.ShouldNotBeNull(); cut.Markup.ShouldContain("Fee 1"); @@ -341,20 +341,20 @@ public void ContractsEdit_AddFeeButton_OpensModal() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find and click Add Fee button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton.ShouldNotBeNull(); addFeeButton.Click(); - + // Assert - Modal should be visible cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add Transaction Fee"), timeout: TimeSpan.FromSeconds(5)); } @@ -372,18 +372,18 @@ public void ContractsEdit_WithNoProducts_ShowsEmptyState() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("No products added yet"); } - + [Fact] public void ContractsEdit_BackToListButton_NavigatesToContractsIndex() { // Arrange @@ -396,20 +396,20 @@ public void ContractsEdit_BackToListButton_NavigatesToContractsIndex() { Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find and click Back to List button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton.ShouldNotBeNull(); backButton.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("/contracts"); } @@ -427,27 +427,27 @@ public void ContractsEdit_ProductModal_HasCancelButton() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open the modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product")); addProductButton?.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add New Product"), timeout: TimeSpan.FromSeconds(5)); - + // Find cancel button in modal (type="button" excludes submit buttons) IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? cancelButton = modalButtons.FirstOrDefault(b => - b.TextContent.Contains("Cancel") && + IElement? cancelButton = modalButtons.FirstOrDefault(b => + b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); - + // Assert cancelButton.ShouldNotBeNull(); } @@ -478,27 +478,27 @@ public void ContractsEdit_FeeModal_HasCancelButton() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open the modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton?.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add Transaction Fee"), timeout: TimeSpan.FromSeconds(5)); - + // Find cancel button in modal (type="button" excludes submit buttons) IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? cancelButton = modalButtons.FirstOrDefault(b => - b.TextContent.Contains("Cancel") && + IElement? cancelButton = modalButtons.FirstOrDefault(b => + b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); - + // Assert cancelButton.ShouldNotBeNull(); } @@ -540,19 +540,19 @@ public void ContractsEdit_WithTransactionFees_HasRemoveFeeButton() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find remove fee button (it has a trash icon svg and title) IRefreshableElementCollection buttons = cut.FindAll("button"); - var removeFeeButton = buttons.FirstOrDefault(b => + var removeFeeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Fee"); - + // Assert removeFeeButton.ShouldNotBeNull(); } @@ -570,14 +570,14 @@ public void ContractsEdit_DisplaysOperatorNameAsReadOnly() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Operator"); cut.Markup.ShouldContain("Operator cannot be changed after contract creation"); @@ -596,14 +596,14 @@ public void ContractsEdit_UpdateContractButton_Exists() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert - Find Update Contract button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Contract")); @@ -623,31 +623,31 @@ public void ContractsEdit_AddProductModal_HasRequiredFields() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") != "submit"); addProductButton.ShouldNotBeNull(); addProductButton.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add New Product"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check form has required fields cut.Markup.ShouldContain("Product Name"); cut.Markup.ShouldContain("Display Text"); cut.Markup.ShouldContain("Variable Value"); cut.Markup.ShouldContain("Value"); - + // Check submit button exists IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? submitButton = modalButtons.FirstOrDefault(b => + IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); } @@ -665,25 +665,25 @@ public void ContractsEdit_AddProductModal_HasSubmitButton() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") != "submit"); addProductButton.ShouldNotBeNull(); addProductButton.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add New Product"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check submit button exists IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? submitButton = modalButtons.FirstOrDefault(b => + IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); } @@ -701,22 +701,22 @@ public void ContractsEdit_AddProductModal_HasVariableValueCheckbox() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") != "submit"); addProductButton.ShouldNotBeNull(); addProductButton.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add New Product"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check variable value checkbox exists cut.Markup.ShouldContain("Variable Value"); var checkbox = cut.Find("input[type='checkbox']"); @@ -749,31 +749,31 @@ public void ContractsEdit_AddFeeModal_HasRequiredFields() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton.ShouldNotBeNull(); addFeeButton.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add Transaction Fee"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check form has required fields cut.Markup.ShouldContain("Description"); cut.Markup.ShouldContain("Calculation Type"); cut.Markup.ShouldContain("Fee Type"); cut.Markup.ShouldContain("Fee Value"); - + // Check submit button exists IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? submitButton = modalButtons.FirstOrDefault(b => + IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Fee") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); } @@ -804,25 +804,25 @@ public void ContractsEdit_AddFeeModal_HasSubmitButton() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton.ShouldNotBeNull(); addFeeButton.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add Transaction Fee"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check submit button exists IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? submitButton = modalButtons.FirstOrDefault(b => + IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Fee") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); } @@ -853,17 +853,17 @@ public void ContractsEdit_RemoveProduct_HasRemoveButton() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert - Find remove product button IRefreshableElementCollection buttons = cut.FindAll("button"); - var removeButton = buttons.FirstOrDefault(b => + var removeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Product"); removeButton.ShouldNotBeNull(); } @@ -905,17 +905,17 @@ public void ContractsEdit_RemoveFee_HasRemoveButton() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert - Find remove fee button IRefreshableElementCollection buttons = cut.FindAll("button"); - var removeFeeButton = buttons.FirstOrDefault(b => + var removeFeeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Fee"); removeFeeButton.ShouldNotBeNull(); } @@ -933,25 +933,25 @@ public void ContractsEdit_ProductModal_HasCancelButtonWithCorrectType() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open the modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product")); addProductButton?.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add New Product"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check cancel button exists with correct type IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? cancelButton = modalButtons.FirstOrDefault(b => - b.TextContent.Contains("Cancel") && + IElement? cancelButton = modalButtons.FirstOrDefault(b => + b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); cancelButton.ShouldNotBeNull(); } @@ -982,25 +982,25 @@ public void ContractsEdit_FeeModal_HasCancelButtonWithCorrectType() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Open the modal IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton?.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add Transaction Fee"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check cancel button exists with correct type IRefreshableElementCollection modalButtons = cut.FindAll("button"); - IElement? cancelButton = modalButtons.FirstOrDefault(b => - b.TextContent.Contains("Cancel") && + IElement? cancelButton = modalButtons.FirstOrDefault(b => + b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); cancelButton.ShouldNotBeNull(); } @@ -1040,14 +1040,14 @@ public void ContractsEdit_WithMultipleProducts_DisplaysAllProducts() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Product 1"); cut.Markup.ShouldContain("Product 2"); @@ -1099,14 +1099,14 @@ public void ContractsEdit_WithMultipleFees_DisplaysAllFees() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Fee 1"); cut.Markup.ShouldContain("Fee 2"); @@ -1146,20 +1146,21 @@ public async Task ContractsEdit_AddProduct_CallsServiceAndReloadsContract() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); - this.ContractUIService.Setup(c => c.AddProductToContract( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.ContractUIService.AddProductToContract( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success()) - .Callback(() => + .Callback((_, _, _, _) => { // After successful add, GetContract should return updated contract - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contractWithProduct)); + return Task.CompletedTask; }); // Act @@ -1189,7 +1190,7 @@ public async Task ContractsEdit_AddProduct_CallsServiceAndReloadsContract() // Submit form var modalButtons = cut.FindAll("button"); - var submitButton = modalButtons.FirstOrDefault(b => + var submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); @@ -1199,19 +1200,19 @@ public async Task ContractsEdit_AddProduct_CallsServiceAndReloadsContract() cut.WaitForAssertion(() => cut.Markup.ShouldContain("Product added successfully"), timeout: TimeSpan.FromSeconds(5)); // Assert - this.ContractUIService.Verify(c => c.AddProductToContract( - It.IsAny(), - It.IsAny(), + this.ContractUIService.AddProductToContract( + Arg.Any(), + Arg.Any(), contractId, - It.Is(p => - p.ProductName == "New Product" && - p.DisplayText == "New Display")), Times.Once); + Arg.Is(p => + p.ProductName == "New Product" && + p.DisplayText == "New Display")).Called(Count.Once()); // Verify contract was reloaded (called at least twice - once on init, once after add) - this.ContractUIService.Verify(c => c.GetContract( - It.IsAny(), - It.IsAny(), - contractId), Times.AtLeast(2)); + this.ContractUIService.GetContract( + Arg.Any(), + Arg.Any(), + contractId).Called(Count.AtLeast(2)); } [Fact] @@ -1270,21 +1271,22 @@ public async Task ContractsEdit_AddFee_CallsServiceAndReloadsContract() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); - this.ContractUIService.Setup(c => c.AddTransactionFeeToProduct( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.ContractUIService.AddTransactionFeeToProduct( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success()) - .Callback(() => + .Callback((_, _, _, _, _) => { // After successful add, GetContract should return updated contract - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contractWithFee)); + return Task.CompletedTask; }); // Act @@ -1306,12 +1308,12 @@ public async Task ContractsEdit_AddFee_CallsServiceAndReloadsContract() var descriptionInput = cut.Find("input[placeholder='Enter fee description']"); descriptionInput.Change("New Fee"); - var calculationTypeSelect = cut.FindAll("select").FirstOrDefault(s => + var calculationTypeSelect = cut.FindAll("select").FirstOrDefault(s => s.OuterHtml.Contains("Select Calculation Type")); calculationTypeSelect.ShouldNotBeNull(); calculationTypeSelect.Change("0"); // Fixed - var feeTypeSelect = cut.FindAll("select").FirstOrDefault(s => + var feeTypeSelect = cut.FindAll("select").FirstOrDefault(s => s.OuterHtml.Contains("Select Fee Type")); feeTypeSelect.ShouldNotBeNull(); feeTypeSelect.Change("0"); // Merchant @@ -1321,7 +1323,7 @@ public async Task ContractsEdit_AddFee_CallsServiceAndReloadsContract() // Submit form var modalButtons = cut.FindAll("button"); - var submitButton = modalButtons.FirstOrDefault(b => + var submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Fee") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); @@ -1331,20 +1333,20 @@ public async Task ContractsEdit_AddFee_CallsServiceAndReloadsContract() cut.WaitForAssertion(() => cut.Markup.ShouldContain("Transaction fee added successfully"), timeout: TimeSpan.FromSeconds(5)); // Assert - this.ContractUIService.Verify(c => c.AddTransactionFeeToProduct( - It.IsAny(), - It.IsAny(), + this.ContractUIService.AddTransactionFeeToProduct( + Arg.Any(), + Arg.Any(), contractId, productId, - It.Is(f => - f.Description == "New Fee" && - f.FeeValue == 1.5m)), Times.Once); + Arg.Is(f => + f.Description == "New Fee" && + f.FeeValue == 1.5m)).Called(Count.Once()); // Verify contract was reloaded - this.ContractUIService.Verify(c => c.GetContract( - It.IsAny(), - It.IsAny(), - contractId), Times.AtLeast(2)); + this.ContractUIService.GetContract( + Arg.Any(), + Arg.Any(), + contractId).Called(Count.AtLeast(2)); } [Fact] @@ -1373,7 +1375,7 @@ public async Task ContractsEdit_RemoveProduct_ShowsNotSupportedMessage() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act @@ -1389,8 +1391,8 @@ public async Task ContractsEdit_RemoveProduct_ShowsNotSupportedMessage() await cut.InvokeAsync(() => removeButton.Click()); // Assert - Should show error message about unsupported feature - cut.WaitForAssertion(() => - cut.Markup.ShouldContain("Product removal is not yet supported by the backend API"), + cut.WaitForAssertion(() => + cut.Markup.ShouldContain("Product removal is not yet supported by the backend API"), timeout: TimeSpan.FromSeconds(5)); } @@ -1451,21 +1453,22 @@ public async Task ContractsEdit_RemoveFee_CallsServiceAndReloadsContract() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); - this.ContractUIService.Setup(c => c.RemoveTransactionFeeFromProduct( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.ContractUIService.RemoveTransactionFeeFromProduct( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success()) - .Callback(() => + .Callback((_, _, _, _, _) => { // After successful removal, GetContract should return updated contract - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contractWithoutFee)); + return Task.CompletedTask; }); // Act @@ -1486,17 +1489,17 @@ public async Task ContractsEdit_RemoveFee_CallsServiceAndReloadsContract() cut.WaitForAssertion(() => cut.Markup.ShouldContain("Transaction fee removed successfully"), timeout: TimeSpan.FromSeconds(5)); // Assert - this.ContractUIService.Verify(c => c.RemoveTransactionFeeFromProduct( - It.IsAny(), - It.IsAny(), + this.ContractUIService.RemoveTransactionFeeFromProduct( + Arg.Any(), + Arg.Any(), contractId, productId, - feeId), Times.Once); + feeId).Called(Count.Once()); // Verify contract was reloaded - this.ContractUIService.Verify(c => c.GetContract( - It.IsAny(), - It.IsAny(), - contractId), Times.AtLeast(2)); + this.ContractUIService.GetContract( + Arg.Any(), + Arg.Any(), + contractId).Called(Count.AtLeast(2)); } } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs index 826c3b3d..1c105074 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs @@ -9,7 +9,7 @@ using MediatR; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using TransactionProcessor.DataTransferObjects.Responses.Contract; @@ -35,13 +35,13 @@ public void ContractsIndex_RendersCorrectly() Products = new List() } }; - - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts)); - + // Act IRenderedComponent cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Contract Management"); } @@ -51,12 +51,12 @@ public void ContractsIndex_WithNoContracts_ShowsEmptyState() { // Arrange List emptyList = new(); - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(emptyList)); // Act IRenderedComponent cut = RenderComponent(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No contracts found"), timeout: TimeSpan.FromSeconds(5)); } @@ -85,12 +85,12 @@ public void ContractsIndex_WithContracts_DisplaysContractList() } }; - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts)); // Act IRenderedComponent cut = RenderComponent(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Contract 1"), timeout: TimeSpan.FromSeconds(5)); cut.Markup.ShouldContain("Contract 2"); @@ -117,12 +117,12 @@ public void ContractsIndex_DisplaysProductCount() } }; - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts)); // Act IRenderedComponent cut = RenderComponent(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Product(s)"), timeout: TimeSpan.FromSeconds(5)); } @@ -131,12 +131,12 @@ public void ContractsIndex_DisplaysProductCount() public void ContractsIndex_HasCorrectPageTitle() { // Arrange - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); // Act IRenderedComponent cut = RenderComponent(); - + // Assert IRenderedComponent pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -146,7 +146,7 @@ public void ContractsIndex_HasCorrectPageTitle() public void ContractsIndex_LoadContractFails_NavigatesToError() { // Arrange - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); // Act @@ -160,16 +160,16 @@ public void ContractsIndex_LoadContractFails_NavigatesToError() public void ContractsIndex_AddNewContractButton_NavigatesToNewContractPage() { // Arrange - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Contract Management"), timeout: TimeSpan.FromSeconds(5)); - + // Act - Find and click the "Add New Contract" button IElement addButton = cut.Find("#newContractButton"); addButton.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("/contracts/new"); } @@ -191,18 +191,18 @@ public void ContractsIndex_ViewButton_NavigatesToContractDetails() } }; - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts)); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Contract"), timeout: TimeSpan.FromSeconds(5)); - + // Act - Find and click the "View" button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? viewButton = buttons.FirstOrDefault(b => b.TextContent.Contains("View")); viewButton.ShouldNotBeNull(); viewButton.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain($"/contracts/{contractId}"); } @@ -224,18 +224,18 @@ public void ContractsIndex_EditButton_NavigatesToEditContractPage() } }; - this.ContractUIService.Setup(c => c.GetContracts(It.IsAny(), It.IsAny())) + this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts)); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Contract"), timeout: TimeSpan.FromSeconds(5)); - + // Act - Find and click the "Edit" button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? editButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Edit")); editButton.ShouldNotBeNull(); editButton.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain($"/contracts/{contractId}/edit"); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs index 61f4a2d4..af4a2e75 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs @@ -2,7 +2,7 @@ using Bunit; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using ContractsNew = EstateManagementUI.BlazorServer.Components.Pages.Contracts.New; @@ -15,7 +15,7 @@ public class ContractsNewPageTests : BaseTest public void ContractsNew_RendersCorrectly() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); // Act IRenderedComponent cut = RenderComponent(); @@ -28,7 +28,7 @@ public void ContractsNew_RendersCorrectly() public void ContractsNew_HasCorrectPageTitle() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); // Act IRenderedComponent cut = RenderComponent(); @@ -42,7 +42,7 @@ public void ContractsNew_HasCorrectPageTitle() public void ContractsNew_CancelButton_NavigatesToContractsIndex() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Contract"), timeout: TimeSpan.FromSeconds(5)); @@ -61,7 +61,7 @@ public void ContractsNew_CancelButton_NavigatesToContractsIndex() public void ContractsNew_CreateContractButton_IsPresent() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Contract"), timeout: TimeSpan.FromSeconds(5)); @@ -88,7 +88,7 @@ public void ContractsNew_LoadsOperatorsSuccessfully() OperatorName = "Test Operator 2" } }; - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(operators)); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); // Act IRenderedComponent cut = RenderComponent(); @@ -102,7 +102,7 @@ public void ContractsNew_LoadsOperatorsSuccessfully() public void ContractsNew_LoadsOperatorsFailed_NavigateToError() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Failure()); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure()); // Act IRenderedComponent cut = RenderComponent(); @@ -114,7 +114,7 @@ public void ContractsNew_LoadsOperatorsFailed_NavigateToError() public void ContractsNew_WithNoOperators_ShowsNoOperatorsMessage() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); // Act IRenderedComponent cut = RenderComponent(); @@ -137,8 +137,8 @@ public void ContractsNew_SuccessfulCreation_NavigatesToContractsIndex() } }; - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(operators)); - this.ContractUIService.Setup(c => c.CreateContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); + this.ContractUIService.CreateContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(); @@ -175,9 +175,9 @@ public void ContractsNew_FailedCreation_ShowsErrorMessage() } }; - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(operators)); - this.ContractUIService.Setup(c => c.CreateContract(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); + this.ContractUIService.CreateContract(Arg.Any(), Arg.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); @@ -213,7 +213,7 @@ public void ContractsNew_FormValidation_RequiresDescription() } }; - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(operators)); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); @@ -245,7 +245,7 @@ public void ContractsNew_FormValidation_RequiresOperator() } }; - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(operators)); + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs index 715cecec..9f19ed12 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs @@ -3,7 +3,7 @@ using EstateManagementUI.BlazorServer.Components.Pages.Contracts; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using TransactionProcessor.DataTransferObjects.Responses.Contract; @@ -23,14 +23,14 @@ public void ContractsView_RendersCorrectly() Description = "Test Contract", OperatorName = "Test Operator" }; - - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); - + // Assert cut.Markup.ShouldContain("View Contract"); } @@ -47,14 +47,14 @@ public void ContractsView_DisplaysContractDetails() OperatorName = "Test Operator" }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Contract"); } @@ -70,13 +70,13 @@ public void ContractsView_HasCorrectPageTitle() Description = "Test Contract", OperatorName = "Test Operator" }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -94,14 +94,14 @@ public void ContractsView_HasBackButton() OperatorName = "Test Operator" }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Back to List"); } @@ -118,20 +118,20 @@ public void ContractsView_BackButton_NavigatesToContractsList() OperatorName = "Test Operator" }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Find and click the Back to List button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton.ShouldNotBeNull(); backButton.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("/contracts"); } @@ -160,14 +160,14 @@ public void ContractsView_DisplaysProducts_WhenPresent() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Product"); cut.Markup.ShouldContain("Test Display"); @@ -187,14 +187,14 @@ public void ContractsView_DisplaysNoProducts_WhenEmpty() Products = new List() }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("No products added to this contract yet"); } @@ -234,14 +234,14 @@ public void ContractsView_DisplaysTransactionFees_WhenPresent() } }; - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Transaction Fees"); cut.Markup.ShouldContain("Service Fee"); @@ -253,7 +253,7 @@ public void ContractsView_LoadContract_QueryFails_ShowsNotFoundMessage() { // Arrange var contractId = Guid.NewGuid(); - this.ContractUIService.Setup(c => c.GetContract(It.IsAny(), It.IsAny(), It.IsAny())) + this.ContractUIService.GetContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); // Act diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs index 3637c784..9f49d0b4 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs @@ -12,65 +12,65 @@ public void EntryScreen_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Estate Management"); cut.Markup.ShouldContain("Merchant Management"); cut.Markup.ShouldContain("File Processing"); } - + [Fact] public void EntryScreen_HasEstateManagementCard() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Manage estate details"); cut.Markup.ShouldContain("Manage estate users"); cut.Markup.ShouldContain("Operator Management"); } - + [Fact] public void EntryScreen_HasMerchantManagementCard() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Manage Merchant Details"); cut.Markup.ShouldContain("Balance Management"); } - + [Fact] public void EntryScreen_HasFileProcessingCard() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Transaction Files"); cut.Markup.ShouldContain("Settlement Processing"); } - + [Fact] public void EntryScreen_HasViewMoreLinks() { // Act var cut = RenderComponent(); - + // Assert cut.FindAll("a[href='/estate-info']").Count.ShouldBeGreaterThan(0); cut.FindAll("a[href='/merchant-info']").Count.ShouldBeGreaterThan(0); cut.FindAll("a[href='/file-info']").Count.ShouldBeGreaterThan(0); } - + [Fact] public void EntryScreen_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs index b38d126e..f1e19ed9 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Moq; +using Imposter.Abstractions; using Shouldly; namespace EstateManagementUI.BlazorServer.Tests.Pages; @@ -13,10 +13,10 @@ namespace EstateManagementUI.BlazorServer.Tests.Pages; public class ErrorPageTests : BaseTest { public ErrorPageTests() :base() { - Mock _mockWebHostEnvironment = new(); - _mockWebHostEnvironment.Setup(x => x.EnvironmentName).Returns(Environments.Development); - - Services.AddSingleton(_mockWebHostEnvironment.Object); + IWebHostEnvironmentImposter _mockWebHostEnvironment = new(); + _mockWebHostEnvironment.EnvironmentName.Getter().Returns(Environments.Development); + + Services.AddSingleton(_mockWebHostEnvironment.Instance()); // Use a real IConfiguration with an in-memory value so GetSection/GetValue work as expected var inMemorySettings = new Dictionary @@ -36,72 +36,72 @@ public void Error_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Find("h1").TextContent.ShouldContain("Oops! Something went wrong"); cut.Markup.ShouldContain("We encountered an unexpected error"); } - + [Fact] public void Error_WithoutRequestId_DoesNotShowRequestId() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldNotContain("Reference ID for support:"); } - + [Fact] public void Error_ShowsDevelopmentModeInformation() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Development Mode Information"); cut.Markup.ShouldContain("ASPNETCORE_ENVIRONMENT"); } - + [Fact] public void Error_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); } - + [Fact] public void Error_HasHomePageLink() { // Act var cut = RenderComponent(); - + // Assert var homeLink = cut.Find("a[href='/']"); homeLink.TextContent.ShouldContain("Go to Home"); } - + [Fact] public void Error_HasBackButton() { // Act var cut = RenderComponent(); - + // Assert var backButton = cut.Find("button[onclick='window.history.back()']"); backButton.TextContent.ShouldContain("Go Back"); } - + [Fact] public void Error_HasSupportEmail() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("support@example.com"); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs index df6ff213..3faea1fb 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs @@ -1,12 +1,11 @@ using AngleSharp.Dom; using Bunit; -using Castle.Components.DictionaryAdapter; using EstateManagementUI.BlazorServer.Common; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BlazorServer.Tests.Pages.FileProcessing; using EstateManagementUI.BusinessLogic.Requests; using Microsoft.AspNetCore.Components.Web; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using EstateIndex = EstateManagementUI.BlazorServer.Components.Pages.Estate.Index; @@ -29,13 +28,13 @@ public void EstateIndex_RendersCorrectly() MerchantCount = 0, RecentMerchants = new List(), UserCount = 0 - }; - - this.EstateUIService.Setup(e => e.LoadEstate(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(estate)); + }; + + this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(estate)); // Act IRenderedComponent cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Estate Management"); } @@ -56,11 +55,11 @@ public void EstateIndex_DisplaysEstateDetails() RecentMerchants = new List(), UserCount = 0 }; - this.EstateUIService.Setup(e => e.LoadEstate(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(estate)); + this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(estate)); // Act IRenderedComponent cut = RenderComponent(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Estate"), timeout: TimeSpan.FromSeconds(5)); } @@ -81,11 +80,11 @@ public void EstateIndex_HasCorrectPageTitle() RecentMerchants = new List(), UserCount = 0 }; - this.EstateUIService.Setup(e => e.LoadEstate(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(estate)); + this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(estate)); // Act IRenderedComponent cut = RenderComponent(); - + // Assert IRenderedComponent pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -98,12 +97,12 @@ public void EstateIndex_TabSwitch_ToOperators_UpdatesActiveTab() SetupSuccessfulDataLoad(); IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find operators button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Assigned Operators"), timeout: TimeSpan.FromSeconds(5)); } @@ -115,16 +114,16 @@ public void EstateIndex_TabSwitch_BackToOverview_UpdatesActiveTab() SetupSuccessfulDataLoad(); IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators first IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Act - switch back to overview IElement? overviewButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Overview")); overviewButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Estate Name"), timeout: TimeSpan.FromSeconds(5)); } @@ -138,9 +137,9 @@ public void EstateIndex_AddOperator_Success_UpdatesAssignedOperators() OperatorId = operatorId, OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithOperators(new List { operatorToAdd }); - + OperatorModels.OperatorModel operatorDetails = new() { OperatorId = operatorId, Name = "Test Operator", @@ -148,23 +147,23 @@ public void EstateIndex_AddOperator_Success_UpdatesAssignedOperators() RequireCustomTerminalNumber = false }; - this.EstateUIService.Setup(e => e.AddOperatorToEstate(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); + this.EstateUIService.AddOperatorToEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Click Add Operator button IElement addOperatorButton = cut.Find("#addOperatorButton"); addOperatorButton.Click(); - + // Act - Select operator and add IElement selectElement = cut.Find("select"); selectElement.Change(operatorId.ToString()); @@ -174,7 +173,7 @@ public void EstateIndex_AddOperator_Success_UpdatesAssignedOperators() // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Operator added successfully"), timeout: TimeSpan.FromSeconds(10)); - + } [Fact] @@ -186,23 +185,23 @@ public void EstateIndex_AddOperator_Failure_ShowsErrorMessage() OperatorId = operatorId, OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithOperators(new List { operatorToAdd }); - this.EstateUIService.Setup(e => e.AddOperatorToEstate(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Failure); + this.EstateUIService.AddOperatorToEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure()); IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Click Add Operator button IElement addOperatorButton = cut.Find("#addOperatorButton"); addOperatorButton.Click(); - + // Act - Select operator and add IElement selectElement = cut.Find("select"); selectElement.Change(operatorId.ToString()); @@ -225,26 +224,26 @@ public void EstateIndex_RemoveOperator_Success_RemovesFromList() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - + SetupSuccessfulDataLoadWithAssignedOperators(new List { assignedOperator }); - this.EstateUIService.Setup(e => e.RemoveOperatorFromEstate(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); + this.EstateUIService.RemoveOperatorFromEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Act - Remove operator IRefreshableElementCollection removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Operator removed successfully"), timeout: TimeSpan.FromSeconds(5)); } @@ -260,24 +259,24 @@ public void EstateIndex_RemoveOperator_Failure_ShowsErrorMessage() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - + SetupSuccessfulDataLoadWithAssignedOperators(new List { assignedOperator }); - this.EstateUIService.Setup(e => e.RemoveOperatorFromEstate(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Failure(String.Empty)); + this.EstateUIService.RemoveOperatorFromEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure(String.Empty)); IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Act - Remove operator IRefreshableElementCollection removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Failed to remove operator"), timeout: TimeSpan.FromSeconds(5)); } @@ -295,13 +294,13 @@ public void EstateIndex_DisplaysMerchants_WhenPresent() CreatedDateTime = new DateTime(2024, 1, 1, 12, 0, 0) } }; - + SetupSuccessfulDataLoadWithMerchants(merchants); - + // Act IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Merchant"); cut.Markup.ShouldContain("MERCH001"); @@ -312,11 +311,11 @@ public void EstateIndex_DisplaysNoMerchants_WhenEmpty() { // Arrange SetupSuccessfulDataLoad(); - + // Act IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("No merchants found"); } @@ -333,13 +332,13 @@ public void EstateIndex_DisplaysContracts_WhenPresent() OperatorName = "Test Operator" } }; - + SetupSuccessfulDataLoadWithContracts(contracts); - + // Act IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Contract"); } @@ -349,24 +348,24 @@ public void EstateIndex_DisplaysNoContracts_WhenEmpty() { // Arrange SetupSuccessfulDataLoad(); - + // Act IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("No contracts found"); } - + [Fact] public void EstateIndex_LoadEstateData_LoadFails_NavigatesToError() { // Arrange - this.EstateUIService.Setup(e => e.LoadEstate(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Failure()); + this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure()); // Act IRenderedComponent cut = RenderComponent(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("error"); } @@ -382,17 +381,17 @@ public void EstateIndex_DisplaysOperatorRequirements_WhenPresent() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = true }; - + SetupSuccessfulDataLoadWithAssignedOperators(new List { assignedOperator }); - + IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => { cut.Markup.ShouldContain("Requires Merchant Number"); @@ -405,19 +404,19 @@ public void EstateIndex_DisplaysNoOperators_WhenNoneAssigned() { // Arrange SetupSuccessfulDataLoad(); - + IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No operators assigned"), timeout: TimeSpan.FromSeconds(5)); } - + [Fact] public void EstateIndex_SuccessMessage_ClearsWhenSwitchingTabs() { @@ -429,31 +428,31 @@ public void EstateIndex_SuccessMessage_ClearsWhenSwitchingTabs() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - + SetupSuccessfulDataLoadWithAssignedOperators(new List { assignedOperator }); - this.EstateUIService.Setup(e => e.RemoveOperatorFromEstate(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); + this.EstateUIService.RemoveOperatorFromEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); - + // Remove operator to trigger success message IRefreshableElementCollection removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); - + cut.WaitForAssertion(() => cut.Markup.ShouldContain("Operator removed successfully"), timeout: TimeSpan.FromSeconds(5)); - + // Act - Switch to overview tab IRefreshableElementCollection overviewButtons = cut.FindAll("button"); IElement? overviewButton = overviewButtons.FirstOrDefault(b => b.TextContent.Contains("Overview")); overviewButton?.Click(); - + // Assert - Success message should be cleared cut.WaitForAssertion(() => cut.Markup.ShouldNotContain("Operator removed successfully"), timeout: TimeSpan.FromSeconds(5)); } @@ -476,7 +475,7 @@ private void SetupSuccessfulDataLoad(List? RecentMerchants = merchants ?? new List(), UserCount = 2 }; - this.EstateUIService.Setup(e => e.LoadEstate(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(estate)); + this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(estate)); } private void SetupSuccessfulDataLoadWithOperators(List operators) diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs index 056d701a..6f9450ae 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs @@ -12,52 +12,52 @@ public void EstateInfo_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Estate Management"); cut.Markup.ShouldContain("Comprehensive estate management and configuration"); } - + [Fact] public void EstateInfo_HasFeatureSections() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Manage Estate Details"); cut.Markup.ShouldContain("Manage Estate Users"); cut.Markup.ShouldContain("Operator Management"); } - + [Fact] public void EstateInfo_HasSignInButton() { // Act var cut = RenderComponent(); - + // Assert var loginButton = cut.Find("a#loginButton"); loginButton.GetAttribute("href").ShouldBe("/login"); loginButton.TextContent.ShouldContain("Sign In"); } - + [Fact] public void EstateInfo_HasBackButton() { // Act var cut = RenderComponent(); - + // Assert cut.FindAll("a[href='/entry']").Count.ShouldBeGreaterThan(0); } - + [Fact] public void EstateInfo_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs index 444dfc7c..7bf97318 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs @@ -12,52 +12,52 @@ public void FileInfo_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("File Processing"); cut.Markup.ShouldContain("Automated file processing and settlement management"); } - + [Fact] public void FileInfo_HasFeatureSections() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Transaction Files"); cut.Markup.ShouldContain("Settlement Processing"); cut.Markup.ShouldContain("Bulk Processing"); } - + [Fact] public void FileInfo_HasSignInButton() { // Act var cut = RenderComponent(); - + // Assert var loginButton = cut.Find("a#loginButton"); loginButton.GetAttribute("href").ShouldBe("/login"); loginButton.TextContent.ShouldContain("Sign In"); } - + [Fact] public void FileInfo_HasBackButton() { // Act var cut = RenderComponent(); - + // Assert cut.FindAll("a[href='/entry']").Count.ShouldBeGreaterThan(0); } - + [Fact] public void FileInfo_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs index f305883c..6dc974d0 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs @@ -1,7 +1,7 @@ using Bunit; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using FileProcessingDetails = EstateManagementUI.BlazorServer.Components.Pages.FileProcessing.Details; @@ -35,8 +35,8 @@ public void FileProcessingDetails_RendersFilesAndLines() } }; - this.FileProcessingUIService.Setup(f => f.GetImportLog(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLog(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs[0])); var log = FileProcessingSeedData.ImportLogs[0]; @@ -83,8 +83,8 @@ public void FileProcessingDetails_PaginatesTheFileList() } }; - this.FileProcessingUIService.Setup(f => f.GetImportLog(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLog(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs[0])); var log = FileProcessingSeedData.ImportLogs[0]; @@ -127,8 +127,8 @@ public void FileProcessingDetails_FileNameFilter_FiltersTheVisibleFiles() } }; - this.FileProcessingUIService.Setup(f => f.GetImportLog(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLog(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs[0])); var log = FileProcessingSeedData.ImportLogs[0]; @@ -156,8 +156,8 @@ public void FileProcessingDetails_BackButton_NavigatesToIndex() } }; - this.FileProcessingUIService.Setup(f => f.GetImportLog(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLog(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs[0])); var log = FileProcessingSeedData.ImportLogs[0]; diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs index cb3c6c77..a94f8ee4 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs @@ -4,7 +4,7 @@ using EstateManagementUI.BusinessLogic.Client; using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using FileProcessingIndex = EstateManagementUI.BlazorServer.Components.Pages.FileProcessing.Index; @@ -24,8 +24,8 @@ public void FileProcessingIndex_RendersSummaryAndLogs() } }; - this.FileProcessingUIService.Setup(f => f.GetImportLogList(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLogList(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); var cut = RenderComponent(); @@ -52,10 +52,10 @@ public void FileProcessingIndex_FilterByDate_UpdatesTheDisplayedLogs() { } }; - this.FileProcessingUIService.Setup(f => f.GetImportLogList(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLogList(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); - + var cut = RenderComponent(); var targetDate = FileProcessingSeedData.ImportLogs[1].ImportLogDateTime.Date; @@ -86,8 +86,8 @@ public void FileProcessingIndex_RowClick_NavigatesToImportLogDetails() } }; - this.FileProcessingUIService.Setup(f => f.GetImportLogList(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLogList(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); var cut = RenderComponent(); @@ -109,8 +109,8 @@ public void FileProcessingIndex_UploadButton_NavigatesToUploadScreen() } }; - this.FileProcessingUIService.Setup(f => f.GetImportLogList(It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + this.FileProcessingUIService.GetImportLogList(Arg.Any(), + Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); var cut = RenderComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs index bfcd8b53..1ec5cdc3 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs @@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.DependencyInjection; using Microsoft.JSInterop; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using System.Security.Claims; @@ -21,24 +21,24 @@ namespace EstateManagementUI.BlazorServer.Tests.Pages; public class HomePageTests : BaseTest { - private readonly Mock _mockCalenderUiService; - private readonly Mock _mockMerchantUiService; - private readonly Mock _mockTransactionUiService; - private readonly Mock _mockJSRuntime; - + private readonly ICalendarUIServiceImposter _mockCalenderUiService; + private readonly IMerchantUIServiceImposter _mockMerchantUiService; + private readonly ITransactionUIServiceImposter _mockTransactionUiService; + private readonly IJSRuntimeImposter _mockJSRuntime; + public HomePageTests() { - _mockCalenderUiService = new Mock(); - _mockMerchantUiService = new Mock(); - _mockTransactionUiService = new Mock(); - - _mockJSRuntime = new Mock(); - - Services.AddSingleton(_mockCalenderUiService.Object); - Services.AddSingleton(_mockMerchantUiService.Object); - Services.AddSingleton(_mockTransactionUiService.Object); - Services.AddSingleton(_mockJSRuntime.Object); - + _mockCalenderUiService = new ICalendarUIServiceImposter(); + _mockMerchantUiService = new IMerchantUIServiceImposter(); + _mockTransactionUiService = new ITransactionUIServiceImposter(); + + _mockJSRuntime = new IJSRuntimeImposter(); + + Services.AddSingleton(_mockCalenderUiService.Instance()); + Services.AddSingleton(_mockMerchantUiService.Instance()); + Services.AddSingleton(_mockTransactionUiService.Instance()); + Services.AddSingleton(_mockJSRuntime.Instance()); + // Add required permission components ComponentFactories.AddStub(); ComponentFactories.AddStub(); @@ -107,16 +107,16 @@ public void Home_RendersCorrectly() } }; - _mockAuthStateProvider.Setup(x => x.GetAuthenticationStateAsync()).Returns(authState); - this._mockCalenderUiService.Setup(m => m.GetComparisonDates(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(comparisonDates)); - this._mockMerchantUiService.Setup(m => m.GetMerchantKpis(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(merchantKpi)); - this._mockMerchantUiService.Setup(m => m.GetRecentMerchants(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(recentMerchants)); - this._mockTransactionUiService.Setup(m => m.GetTodaysSales(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(todaysSales)); - this._mockTransactionUiService.Setup(m => m.GetTodaysFailedSales(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(todaysSales)); + _mockAuthStateProvider.GetAuthenticationStateAsync().Returns(authState); + this._mockCalenderUiService.GetComparisonDates(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(comparisonDates)); + this._mockMerchantUiService.GetMerchantKpis(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(merchantKpi)); + this._mockMerchantUiService.GetRecentMerchants(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(recentMerchants)); + this._mockTransactionUiService.GetTodaysSales(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(todaysSales)); + this._mockTransactionUiService.GetTodaysFailedSales(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(todaysSales)); // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Dashboard"); cut.Markup.ShouldContain("Welcome to Estate Management System"); @@ -126,7 +126,7 @@ public void Home_RendersCorrectly() public void Home_HasCorrectPageTitle() { // Arrange - var claims = new[] { new Claim(ClaimTypes.Role, "Estate"), + var claims = new[] { new Claim(ClaimTypes.Role, "Estate"), new Claim("estateId", Guid.NewGuid().ToString()), new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "EstateUser") }; @@ -185,18 +185,18 @@ public void Home_HasCorrectPageTitle() } }; - _mockAuthStateProvider.Setup(x => x.GetAuthenticationStateAsync()).Returns(authState); + _mockAuthStateProvider.GetAuthenticationStateAsync().Returns(authState); - this._mockCalenderUiService.Setup(m => m.GetComparisonDates(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(comparisonDates)); - this._mockMerchantUiService.Setup(m => m.GetMerchantKpis(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(merchantKpi)); - this._mockMerchantUiService.Setup(m => m.GetRecentMerchants(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(recentMerchants)); - this._mockTransactionUiService.Setup(m => m.GetTodaysSales(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(todaysSales)); - this._mockTransactionUiService.Setup(m => m.GetTodaysFailedSales(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(todaysSales)); + this._mockCalenderUiService.GetComparisonDates(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(comparisonDates)); + this._mockMerchantUiService.GetMerchantKpis(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(merchantKpi)); + this._mockMerchantUiService.GetRecentMerchants(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(recentMerchants)); + this._mockTransactionUiService.GetTodaysSales(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(todaysSales)); + this._mockTransactionUiService.GetTodaysFailedSales(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(todaysSales)); // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs index d8f25ae2..89e4a14f 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs @@ -12,50 +12,50 @@ public void MerchantInfo_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Merchant Management"); } - + [Fact] public void MerchantInfo_HasFeatureSections() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Manage Merchant Details"); cut.Markup.ShouldContain("Balance Management"); } - + [Fact] public void MerchantInfo_HasSignInButton() { // Act var cut = RenderComponent(); - + // Assert var loginButtons = cut.FindAll("a#loginButton"); loginButtons.Count.ShouldBeGreaterThan(0); loginButtons[0].GetAttribute("href").ShouldBe("/login"); } - + [Fact] public void MerchantInfo_HasBackButton() { // Act var cut = RenderComponent(); - + // Assert cut.FindAll("a[href='/entry']").Count.ShouldBeGreaterThan(0); } - + [Fact] public void MerchantInfo_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs index aa8c5bdb..27c86b32 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs @@ -2,7 +2,7 @@ using EstateManagementUI.BlazorServer.Components.Pages.Merchants; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using Xunit; @@ -98,8 +98,8 @@ public void MerchantSchedule_SaveSelectedYear_SendsYearPayload() SetupPageData(merchantId, currentYear, new MerchantModels.MerchantScheduleModel { Year = currentYear, Months = [] }); SetupSchedule(futureYear, new MerchantModels.MerchantScheduleModel { Year = futureYear, Months = [] }); - this.MerchantUIService.Setup(m => m.SaveMerchantSchedule(It.IsAny(), It.IsAny(), merchantId, - It.IsAny())) + this.MerchantUIService.SaveMerchantSchedule(Arg.Any(), Arg.Any(), merchantId, + Arg.Any()) .ReturnsAsync(Result.Success()); var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); @@ -111,14 +111,14 @@ public void MerchantSchedule_SaveSelectedYear_SendsYearPayload() cut.Find("#month-1-closed-days").Change("1, 2, 15"); cut.Find("#saveScheduleButton").Click(); - this.MerchantUIService.Verify(m => m.SaveMerchantSchedule( - It.IsAny(), - It.IsAny(), + this.MerchantUIService.SaveMerchantSchedule( + Arg.Any(), + Arg.Any(), merchantId, - It.Is(schedule => + Arg.Is(schedule => schedule.Year == futureYear && schedule.Months.Any(month => month.Month == 1 && month.ClosedDays.SequenceEqual(new[] { 1, 2, 15 })) - )), Times.Once); + )).Called(Count.Once()); } [Fact(Skip = "Temporarily skipped due to CI-only failure; investigate merchant schedule invalid November validation test.")] @@ -130,7 +130,7 @@ public async Task MerchantSchedule_SaveSelectedYear_InvalidNovemberDate_ShowsErr SetupPageData(merchantId, currentYear, new MerchantModels.MerchantScheduleModel { Year = currentYear, Months = [] }); SetupSchedule(futureYear, new MerchantModels.MerchantScheduleModel { Year = futureYear, Months = [] }); - + var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -140,8 +140,8 @@ public async Task MerchantSchedule_SaveSelectedYear_InvalidNovemberDate_ShowsErr cut.Find("#month-11-closed-days").Change("31"); cut.Markup.ShouldContain($"Invalid closed days for November."); - this.MerchantUIService.Verify(m => m.SaveMerchantSchedule(It.IsAny(), It.IsAny(), merchantId, - It.IsAny()), Times.Never); + this.MerchantUIService.SaveMerchantSchedule(Arg.Any(), Arg.Any(), merchantId, + Arg.Any()).Called(Count.Never()); } [Fact] @@ -153,8 +153,8 @@ public void MerchantSchedule_SaveSelectedYear_LeapYearFebruary_Allows29th() SetupPageData(merchantId, currentYear, new MerchantModels.MerchantScheduleModel { Year = currentYear, Months = [] }); SetupSchedule(leapYear, new MerchantModels.MerchantScheduleModel { Year = leapYear, Months = [] }); - this.MerchantUIService.Setup(m => m.SaveMerchantSchedule(It.IsAny(), It.IsAny(), merchantId, - It.IsAny())) + this.MerchantUIService.SaveMerchantSchedule(Arg.Any(), Arg.Any(), merchantId, + Arg.Any()) .ReturnsAsync(Result.Success()); var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); @@ -166,14 +166,14 @@ public void MerchantSchedule_SaveSelectedYear_LeapYearFebruary_Allows29th() cut.Find("#month-2-closed-days").Change("29"); cut.Find("#saveScheduleButton").Click(); - this.MerchantUIService.Verify(m => m.SaveMerchantSchedule( - It.IsAny(), - It.IsAny(), + this.MerchantUIService.SaveMerchantSchedule( + Arg.Any(), + Arg.Any(), merchantId, - It.Is(schedule => + Arg.Is(schedule => schedule.Year == leapYear && schedule.Months.Any(month => month.Month == 2 && month.ClosedDays.SequenceEqual(new[] { 29 })) - )), Times.Once); + )).Called(Count.Once()); } [Fact(Skip = "Temporarily skipped due to CI-only failure; investigate merchant schedule non-leap February validation test.")] @@ -185,8 +185,8 @@ public async Task MerchantSchedule_SaveSelectedYear_NonLeapYearFebruary_Rejects2 SetupPageData(merchantId, currentYear, new MerchantModels.MerchantScheduleModel { Year = currentYear, Months = [] }); SetupSchedule(nonLeapYear, new MerchantModels.MerchantScheduleModel { Year = nonLeapYear, Months = [] }); - this.MerchantUIService.Setup(m => m.SaveMerchantSchedule(It.IsAny(), It.IsAny(), merchantId, - It.IsAny())).ReturnsAsync(Result.Failure($"Only days between 1 and 28 can be supplied for February {nonLeapYear}.")); + this.MerchantUIService.SaveMerchantSchedule(Arg.Any(), Arg.Any(), merchantId, + Arg.Any()).ReturnsAsync(Result.Failure($"Only days between 1 and 28 can be supplied for February {nonLeapYear}.")); var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -282,7 +282,7 @@ private void SetupPageData(Guid merchantId, Int32 scheduleYear, MerchantModels.MerchantScheduleModel schedule) { - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(new MerchantModels.MerchantModel { MerchantId = merchantId, @@ -296,7 +296,7 @@ private void SetupPageData(Guid merchantId, private void SetupSchedule(Int32 year, MerchantModels.MerchantScheduleModel schedule) { - this.MerchantUIService.Setup(m => m.GetMerchantSchedule(It.IsAny(), It.IsAny(), It.IsAny(), year)) + this.MerchantUIService.GetMerchantSchedule(Arg.Any(), Arg.Any(), Arg.Any(), year) .ReturnsAsync(Result.Success(schedule)); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs index fa4b0f39..0990caab 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs @@ -3,7 +3,7 @@ using EstateManagementUI.BlazorServer.Common; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using MerchantsDeposit = EstateManagementUI.BlazorServer.Components.Pages.Merchants.Deposit; @@ -21,9 +21,9 @@ public void Deposit_RendersCorrectly() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); - + // Assert cut.Markup.ShouldContain("Make Merchant Deposit"); } @@ -35,11 +35,11 @@ public void Deposit_HasCorrectPageTitle() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); - + // Assert - IRenderedComponent pageTitle = + IRenderedComponent pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); } @@ -51,10 +51,10 @@ public void Deposit_DisplaysMerchantName() SetupSuccessfulMerchantLoad("Test Merchant Name"); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("For merchant: Test Merchant Name"); } @@ -66,21 +66,21 @@ public void Deposit_DisplaysFormFields() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Deposit Amount"); cut.Markup.ShouldContain("Date of Deposit"); cut.Markup.ShouldContain("Reference"); - + IElement depositAmountInput = cut.Find("#depositAmount"); depositAmountInput.ShouldNotBeNull(); - + IElement depositDateInput = cut.Find("#depositDate"); depositDateInput.ShouldNotBeNull(); - + IElement depositReferenceInput = cut.Find("#depositReference"); depositReferenceInput.ShouldNotBeNull(); } @@ -90,14 +90,14 @@ public void Deposit_MakeDepositButton_SubmitsForm() { // Arrange SetupSuccessfulMerchantLoad(); - this.MerchantUIService.Setup(m => m.MakeMerchantDeposit( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(Result.Success); - - IRenderedComponent cut = RenderComponent(parameters => + this.MerchantUIService.MakeMerchantDeposit( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .ReturnsAsync(Result.Success()); + + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render @@ -106,25 +106,25 @@ public void Deposit_MakeDepositButton_SubmitsForm() // Act - Fill form fields IElement depositAmountInput = cut.Find("#depositAmount"); depositAmountInput.Change(100); - + IElement depositDateInput = cut.Find("#depositDate"); depositDateInput.Change(DateTime.Today.ToString("yyyy-MM-dd")); - + IElement depositReferenceInput = cut.Find("#depositReference"); depositReferenceInput.Change("TEST-REF-001"); // Find and click the Make Deposit button IRefreshableElementCollection buttons = cut.FindAll("button"); - IElement? makeDepositButton = buttons.FirstOrDefault(b => - b.TextContent.Contains("Make Deposit") && + IElement? makeDepositButton = buttons.FirstOrDefault(b => + b.TextContent.Contains("Make Deposit") && (b.GetAttribute("id") ?? "") == "makeDepositButton"); makeDepositButton?.Click(); - + // Assert - cut.WaitForAssertion(() => - cut.Markup.ShouldContain("Deposit recorded successfully"), + cut.WaitForAssertion(() => + cut.Markup.ShouldContain("Deposit recorded successfully"), timeout: TimeSpan.FromSeconds(5)); - + // Verify navigation to merchants index _fakeNavigationManager.Uri.ShouldContain("/merchants"); } @@ -134,14 +134,14 @@ public void Deposit_MakeDepositButton_ShowsErrorOnFailure() { // Arrange SetupSuccessfulMerchantLoad(); - this.MerchantUIService.Setup(m => m.MakeMerchantDeposit( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.MakeMerchantDeposit( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render @@ -150,23 +150,23 @@ public void Deposit_MakeDepositButton_ShowsErrorOnFailure() // Act - Fill form fields IElement depositAmountInput = cut.Find("#depositAmount"); depositAmountInput.Change(100); - + IElement depositDateInput = cut.Find("#depositDate"); depositDateInput.Change(DateTime.Today.ToString("yyyy-MM-dd")); - + IElement depositReferenceInput = cut.Find("#depositReference"); depositReferenceInput.Change("TEST-REF-001"); // Find and click the Make Deposit button IRefreshableElementCollection buttons = cut.FindAll("button"); - IElement? makeDepositButton = buttons.FirstOrDefault(b => - b.TextContent.Contains("Make Deposit") && + IElement? makeDepositButton = buttons.FirstOrDefault(b => + b.TextContent.Contains("Make Deposit") && (b.GetAttribute("id") ?? "") == "makeDepositButton"); makeDepositButton?.Click(); - + // Assert - cut.WaitForAssertion(() => - cut.Markup.ShouldContain("Failed to make deposit"), + cut.WaitForAssertion(() => + cut.Markup.ShouldContain("Failed to make deposit"), timeout: TimeSpan.FromSeconds(5)); } @@ -177,7 +177,7 @@ public void Deposit_HasTwoCancelButtons() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -193,7 +193,7 @@ public void Deposit_CancelButton_NavigatesToMerchantsIndex() // Arrange SetupSuccessfulMerchantLoad(); - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -210,16 +210,16 @@ public void Deposit_CancelButton_NavigatesToMerchantsIndex() public void Deposit_LoadMerchant_LoadFails_NavigatesToError() { // Arrange - this.MerchantUIService.Setup(m => m.GetMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Failure()); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); - + // Assert _fakeNavigationManager.Uri.ShouldContain("error"); } @@ -234,10 +234,10 @@ private void SetupSuccessfulMerchantLoad(string merchantName = "Test Merchant") MerchantReference = "TEST-REF" }; - this.MerchantUIService.Setup(m => m.GetMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchant)); } } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs index 7001cd1e..fabb4cf1 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs @@ -4,7 +4,7 @@ using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; using Microsoft.AspNetCore.Components.Web; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using MerchantsEdit = EstateManagementUI.BlazorServer.Components.Pages.Merchants.Edit; @@ -23,7 +23,7 @@ public void MerchantsEdit_RendersCorrectly() // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); - + // Assert cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Markup.ShouldContain("Edit Merchant"); @@ -39,7 +39,7 @@ public void MerchantsEdit_HasCorrectPageTitle() // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); - + // Assert cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); IRenderedComponent pageTitle = cut.FindComponent(); @@ -56,7 +56,7 @@ public void MerchantsEdit_DisplaysMerchantDetails() // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); - + // Assert cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Markup.ShouldContain("Test Merchant"); @@ -73,12 +73,12 @@ public void MerchantsEdit_BackToListButton_NavigatesToMerchantsList() IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find Back to List button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton?.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("/merchants"); } @@ -108,12 +108,12 @@ public void MerchantsEdit_TabSwitch_ToAddress_UpdatesActiveTab() IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find address button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Address Line 1"), timeout: TimeSpan.FromSeconds(5)); } @@ -127,12 +127,12 @@ public void MerchantsEdit_TabSwitch_ToContact_UpdatesActiveTab() IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find contact button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contactButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Contact Details")); contactButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Contact Name"), timeout: TimeSpan.FromSeconds(5)); } @@ -166,12 +166,12 @@ public void MerchantsEdit_TabSwitch_ToOperators_UpdatesActiveTab() IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find operators button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Assigned Operators"), timeout: TimeSpan.FromSeconds(5)); } @@ -185,12 +185,12 @@ public void MerchantsEdit_TabSwitch_ToContracts_UpdatesActiveTab() IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find contracts button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Assigned Contracts"), timeout: TimeSpan.FromSeconds(5)); } @@ -204,12 +204,12 @@ public void MerchantsEdit_TabSwitch_ToDevices_UpdatesActiveTab() IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find devices button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Assigned Devices"), timeout: TimeSpan.FromSeconds(5)); } @@ -223,16 +223,16 @@ public void MerchantsEdit_TabSwitch_BackToDetails_UpdatesActiveTab() IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to address first IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); - + // Act - switch back to details IElement? detailsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Merchant Details")); detailsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Merchant Name"), timeout: TimeSpan.FromSeconds(5)); } @@ -242,13 +242,13 @@ public void MerchantsEdit_LoadMerchantData_LoadFails_NavigatesToError() { // Arrange var merchantId = Guid.NewGuid(); - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Failure()); // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); - + // Assert cut.WaitForState(() => _fakeNavigationManager.Uri.Contains("error"), TimeSpan.FromSeconds(5)); _fakeNavigationManager.Uri.ShouldContain("error"); @@ -260,16 +260,16 @@ public void MerchantsEdit_DisplaysNoOperators_WhenNoneAssigned() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No operators assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -280,16 +280,16 @@ public void MerchantsEdit_DisplaysNoContracts_WhenNoneAssigned() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No contracts assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -300,16 +300,16 @@ public void MerchantsEdit_DisplaysNoDevices_WhenNoneAssigned() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No devices assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -320,20 +320,20 @@ public void MerchantsEdit_AddOperatorButton_TogglesAddOperatorForm() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Act - Click Add Operator button IElement addOperatorButton = cut.Find("#addOperatorButton"); addOperatorButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Select Operator"), timeout: TimeSpan.FromSeconds(5)); } @@ -344,20 +344,20 @@ public void MerchantsEdit_AddContractButton_TogglesAddContractForm() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Act - Click Add Contract button IElement addContractButton = cut.Find("#addContractButton"); addContractButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Select Contract"), timeout: TimeSpan.FromSeconds(5)); } @@ -368,20 +368,20 @@ public void MerchantsEdit_AddDeviceButton_TogglesAddDeviceForm() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Act - Click Add Device button IElement addDeviceButton = cut.Find("#addDeviceButton"); addDeviceButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Device Identifier"), timeout: TimeSpan.FromSeconds(5)); } @@ -396,39 +396,39 @@ public void MerchantsEdit_AddOperator_Success_ShowsSuccessMessage() OperatorId = operatorId, OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithOperators(merchantId, new List { operatorToAdd }); - + OperatorModels.OperatorModel operatorDetails = new() { OperatorId = operatorId, Name = "Test Operator", RequireCustomMerchantNumber = false, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), operatorId)) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), operatorId) .ReturnsAsync(Result.Success(operatorDetails)); - this.MerchantUIService.Setup(m => m.AddOperatorToMerchant(It.IsAny(), It.IsAny(), merchantId, operatorId, It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + this.MerchantUIService.AddOperatorToMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId, Arg.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Click Add Operator button IElement addOperatorButton = cut.Find("#addOperatorButton"); addOperatorButton.Click(); - + // Act - Select operator and add IElement selectElement = cut.Find("select"); selectElement.Change(operatorId.ToString()); cut.WaitForState(() => cut.Markup.Contains("Add"), TimeSpan.FromSeconds(5)); - + IElement addButton = cut.FindAll("button") .First(b => b.TextContent.Trim() == "Add" && (b.GetAttribute("id") ?? "") != "addOperatorButton"); addButton.Click(); @@ -447,39 +447,39 @@ public void MerchantsEdit_AddOperator_Failure_ShowsErrorMessage() OperatorId = operatorId, OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithOperators(merchantId, new List { operatorToAdd }); - + OperatorModels.OperatorModel operatorDetails = new() { OperatorId = operatorId, Name = "Test Operator", RequireCustomMerchantNumber = false, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), operatorId)) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), operatorId) .ReturnsAsync(Result.Success(operatorDetails)); - this.MerchantUIService.Setup(m => m.AddOperatorToMerchant(It.IsAny(), It.IsAny(), merchantId, operatorId, It.IsAny(), It.IsAny())) + this.MerchantUIService.AddOperatorToMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId, Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Click Add Operator button IElement addOperatorButton = cut.Find("#addOperatorButton"); addOperatorButton.Click(); - + // Act - Select operator and add IElement selectElement = cut.Find("select"); selectElement.Change(operatorId.ToString()); cut.WaitForState(() => cut.Markup.Contains("Add"), TimeSpan.FromSeconds(5)); - + IElement addButton = cut.FindAll("button") .First(b => b.TextContent.Trim() == "Add" && (b.GetAttribute("id") ?? "") != "addOperatorButton"); addButton.Click(); @@ -498,26 +498,26 @@ public void MerchantsEdit_RemoveOperator_Success_ShowsSuccessMessage() OperatorId = operatorId, OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithAssignedOperators(merchantId, new List { assignedOperator }); - this.MerchantUIService.Setup(m => m.RemoveOperatorFromMerchant(It.IsAny(), It.IsAny(), merchantId, operatorId)) - .ReturnsAsync(Result.Success); + this.MerchantUIService.RemoveOperatorFromMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId) + .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Act - Remove operator IRefreshableElementCollection removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Operator removed successfully"), timeout: TimeSpan.FromSeconds(5)); } @@ -532,26 +532,26 @@ public void MerchantsEdit_RemoveOperator_Failure_ShowsErrorMessage() OperatorId = operatorId, OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithAssignedOperators(merchantId, new List { assignedOperator }); - this.MerchantUIService.Setup(m => m.RemoveOperatorFromMerchant(It.IsAny(), It.IsAny(), merchantId, operatorId)) + this.MerchantUIService.RemoveOperatorFromMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId) .ReturnsAsync(Result.Failure(String.Empty)); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Act - Remove operator IRefreshableElementCollection removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Failed to remove operator"), timeout: TimeSpan.FromSeconds(5)); } @@ -567,25 +567,25 @@ public void MerchantsEdit_AssignContract_Success_ShowsSuccessMessage() Description = "Test Contract", OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithContracts(merchantId, new List { contractToAdd }); - this.MerchantUIService.Setup(m => m.AssignContractToMerchant(It.IsAny(), It.IsAny(), merchantId, contractId)) - .ReturnsAsync(Result.Success); + this.MerchantUIService.AssignContractToMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) + .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Click Add Contract button IElement addContractButton = cut.Find("#addContractButton"); addContractButton.Click(); - + // Act - Select contract and assign IElement selectElement = cut.Find("select"); selectElement.Change(contractId.ToString()); @@ -608,25 +608,25 @@ public void MerchantsEdit_AssignContract_Failure_ShowsErrorMessage() Description = "Test Contract", OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithContracts(merchantId, new List { contractToAdd }); - this.MerchantUIService.Setup(m => m.AssignContractToMerchant(It.IsAny(), It.IsAny(), merchantId, contractId)) + this.MerchantUIService.AssignContractToMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) .ReturnsAsync(Result.Failure()); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Click Add Contract button IElement addContractButton = cut.Find("#addContractButton"); addContractButton.Click(); - + // Act - Select contract and assign IElement selectElement = cut.Find("select"); selectElement.Change(contractId.ToString()); @@ -649,26 +649,26 @@ public void MerchantsEdit_RemoveContract_Success_ShowsSuccessMessage() ContractName = "Test Contract", OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithAssignedContracts(merchantId, new List { assignedContract }); - this.MerchantUIService.Setup(m => m.RemoveContractFromMerchant(It.IsAny(), It.IsAny(), merchantId, contractId)) - .ReturnsAsync(Result.Success); + this.MerchantUIService.RemoveContractFromMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) + .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Act - Remove contract IRefreshableElementCollection removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Contract removed successfully"), timeout: TimeSpan.FromSeconds(5)); } @@ -684,26 +684,26 @@ public void MerchantsEdit_RemoveContract_Failure_ShowsErrorMessage() ContractName = "Test Contract", OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithAssignedContracts(merchantId, new List { assignedContract }); - this.MerchantUIService.Setup(m => m.RemoveContractFromMerchant(It.IsAny(), It.IsAny(), merchantId, contractId)) + this.MerchantUIService.RemoveContractFromMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) .ReturnsAsync(Result.Failure(String.Empty)); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Act - Remove contract IRefreshableElementCollection removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Failed to remove contract"), timeout: TimeSpan.FromSeconds(5)); } @@ -718,18 +718,18 @@ public void MerchantsEdit_DisplaysAssignedOperators_WhenPresent() OperatorId = operatorId, OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithAssignedOperators(merchantId, new List { assignedOperator }); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); } @@ -745,18 +745,18 @@ public void MerchantsEdit_DisplaysAssignedContracts_WhenPresent() ContractName = "Test Contract", OperatorName = "Test Operator" }; - + SetupSuccessfulDataLoadWithAssignedContracts(merchantId, new List { assignedContract }); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Contract"), timeout: TimeSpan.FromSeconds(5)); } @@ -767,18 +767,18 @@ public void MerchantsEdit_LoadMerchant_Success_LoadsAllData() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId, "Test Merchant", "MERCH001"); - + // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Merchant"), timeout: TimeSpan.FromSeconds(5)); cut.Markup.ShouldContain("MERCH001"); - this.MerchantUIService.Verify(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId), Times.Once); - this.MerchantUIService.Verify(m => m.GetMerchantOperators(It.IsAny(), It.IsAny(), merchantId), Times.Once); - this.MerchantUIService.Verify(m => m.GetMerchantContracts(It.IsAny(), It.IsAny(), merchantId), Times.Once); - this.MerchantUIService.Verify(m => m.GetMerchantDevices(It.IsAny(), It.IsAny(), merchantId), Times.Once); + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId).Called(Count.Once()); + this.MerchantUIService.GetMerchantOperators(Arg.Any(), Arg.Any(), merchantId).Called(Count.Once()); + this.MerchantUIService.GetMerchantContracts(Arg.Any(), Arg.Any(), merchantId).Called(Count.Once()); + this.MerchantUIService.GetMerchantDevices(Arg.Any(), Arg.Any(), merchantId).Called(Count.Once()); } [Fact] @@ -787,35 +787,35 @@ public void MerchantsEdit_AddDeviceToMerchant_Success_ShowsSuccessMessage() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - - this.MerchantUIService.Setup(m => m.AddMerchantDevice(It.IsAny(), It.IsAny(), merchantId, It.IsAny())) - .ReturnsAsync(Result.Success); - + + this.MerchantUIService.AddMerchantDevice(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) + .ReturnsAsync(Result.Success()); + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Click Add Device button IElement addDeviceButton = cut.Find("#addDeviceButton"); addDeviceButton.Click(); - + // Act - Enter device identifier and add cut.WaitForAssertion(() => cut.Markup.ShouldContain("Device Identifier"), timeout: TimeSpan.FromSeconds(5)); IElement deviceInput = cut.Find("input[placeholder*='device']"); deviceInput.Change("DEV123"); - + IElement addButton = cut.FindAll("button") .First(b => b.TextContent.Trim() == "Add" && (b.GetAttribute("id") ?? "") != "addDeviceButton"); addButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Device added successfully"), timeout: TimeSpan.FromSeconds(10)); - this.MerchantUIService.Verify(m => m.AddMerchantDevice(It.IsAny(), It.IsAny(), merchantId, "DEV123"), Times.Once); + this.MerchantUIService.AddMerchantDevice(Arg.Any(), Arg.Any(), merchantId, "DEV123").Called(Count.Once()); } [Fact] @@ -824,32 +824,32 @@ public void MerchantsEdit_AddDeviceToMerchant_Failure_ShowsErrorMessage() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - - this.MerchantUIService.Setup(m => m.AddMerchantDevice(It.IsAny(), It.IsAny(), merchantId, It.IsAny())) + + this.MerchantUIService.AddMerchantDevice(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) .ReturnsAsync(Result.Failure()); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Click Add Device button IElement addDeviceButton = cut.Find("#addDeviceButton"); addDeviceButton.Click(); - + // Act - Enter device identifier and add cut.WaitForAssertion(() => cut.Markup.ShouldContain("Device Identifier"), timeout: TimeSpan.FromSeconds(5)); IElement deviceInput = cut.Find("input[placeholder*='device']"); deviceInput.Change("DEV123"); - + IElement addButton = cut.FindAll("button") .First(b => b.TextContent.Trim() == "Add" && (b.GetAttribute("id") ?? "") != "addDeviceButton"); addButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Failed to add device"), timeout: TimeSpan.FromSeconds(5)); } @@ -860,25 +860,25 @@ public void MerchantsEdit_SaveAllChanges_Success_ShowsSuccessMessageAndNavigates // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - - this.MerchantUIService.Setup(m => m.UpdateMerchant(It.IsAny(), It.IsAny(), merchantId, It.IsAny())) - .ReturnsAsync(Result.Success); - + + this.MerchantUIService.UpdateMerchant(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) + .ReturnsAsync(Result.Success()); + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find and click save button (button text is "Save" not "Save Changes") IRefreshableElementCollection buttons = cut.FindAll("button[type='submit']"); IElement? saveButton = buttons.FirstOrDefault(); saveButton.ShouldNotBeNull(); saveButton.Click(); - + // Assert - Component has WaitOnUIRefresh() with 2.5s delay before navigation cut.WaitForAssertion(() => cut.Markup.ShouldContain("Merchant details updated successfully"), timeout: TimeSpan.FromSeconds(10)); cut.WaitForState(() => _fakeNavigationManager.Uri.Contains("/merchants"), TimeSpan.FromSeconds(10)); _fakeNavigationManager.Uri.ShouldContain("/merchants"); - this.MerchantUIService.Verify(m => m.UpdateMerchant(It.IsAny(), It.IsAny(), merchantId, It.IsAny()), Times.Once); + this.MerchantUIService.UpdateMerchant(Arg.Any(), Arg.Any(), merchantId, Arg.Any()).Called(Count.Once()); } [Fact] @@ -887,23 +887,23 @@ public void MerchantsEdit_SaveAllChanges_Failure_ShowsErrorMessage() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - - this.MerchantUIService.Setup(m => m.UpdateMerchant(It.IsAny(), It.IsAny(), merchantId, It.IsAny())) + + this.MerchantUIService.UpdateMerchant(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) .ReturnsAsync(Result.Failure()); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find and click save button (button text is "Save" not "Save Changes") IRefreshableElementCollection buttons = cut.FindAll("button[type='submit']"); IElement? saveButton = buttons.FirstOrDefault(); saveButton.ShouldNotBeNull(); saveButton.Click(); - + // Assert - Use longer timeout to account for async operations cut.WaitForAssertion(() => cut.Markup.ShouldContain("Failed to update merchant"), timeout: TimeSpan.FromSeconds(10)); - this.MerchantUIService.Verify(m => m.UpdateMerchant(It.IsAny(), It.IsAny(), merchantId, It.IsAny()), Times.Once); + this.MerchantUIService.UpdateMerchant(Arg.Any(), Arg.Any(), merchantId, Arg.Any()).Called(Count.Once()); } [Fact] @@ -912,8 +912,8 @@ public void MerchantsEdit_SaveOpeningHours_Success_ShowsSuccessMessageAndCallsSe var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - this.MerchantUIService.Setup(m => m.UpdateMerchantOpeningHours(It.IsAny(), It.IsAny(), merchantId, It.IsAny())) - .ReturnsAsync(Result.Success); + this.MerchantUIService.UpdateMerchantOpeningHours(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) + .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); @@ -940,16 +940,15 @@ public void MerchantsEdit_SaveOpeningHours_Success_ShowsSuccessMessageAndCallsSe cut.Find("#saveOpeningHoursButton").Click(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Merchant opening hours updated successfully"), timeout: TimeSpan.FromSeconds(10)); - this.MerchantUIService.Verify(m => m.UpdateMerchantOpeningHours( - It.IsAny(), - It.IsAny(), + this.MerchantUIService.UpdateMerchantOpeningHours( + Arg.Any(), + Arg.Any(), merchantId, - It.Is(hours => + Arg.Is(hours => hours.Sunday.Opening == "0800" && hours.Sunday.Closing == "1800" && hours.Saturday.Opening == "0900" && - hours.Saturday.Closing == "1600")), - Times.Once); + hours.Saturday.Closing == "1600")).Called(Count.Once()); } [Fact] @@ -971,7 +970,7 @@ public void MerchantsEdit_SaveOpeningHours_InvalidClosingTimeAbove2359_ShowsErro cut.Find("#saveOpeningHoursButton").Click(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Sunday closing time must be entered in HHmm format."), timeout: TimeSpan.FromSeconds(10)); - this.MerchantUIService.Verify(m => m.UpdateMerchantOpeningHours(It.IsAny(), It.IsAny(), merchantId, It.IsAny()), Times.Never); + this.MerchantUIService.UpdateMerchantOpeningHours(Arg.Any(), Arg.Any(), merchantId, Arg.Any()).Called(Count.Never()); } [Fact] @@ -993,7 +992,7 @@ public void MerchantsEdit_SaveOpeningHours_InvalidOpeningTimeBelow0000_ShowsErro cut.Find("#saveOpeningHoursButton").Click(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Monday opening time must be entered in HHmm format."), timeout: TimeSpan.FromSeconds(10)); - this.MerchantUIService.Verify(m => m.UpdateMerchantOpeningHours(It.IsAny(), It.IsAny(), merchantId, It.IsAny()), Times.Never); + this.MerchantUIService.UpdateMerchantOpeningHours(Arg.Any(), Arg.Any(), merchantId, Arg.Any()).Called(Count.Never()); } [Fact] @@ -1003,37 +1002,37 @@ public void MerchantsEdit_SwapDeviceConfirm_Success_ShowsSuccessMessage() var merchantId = Guid.NewGuid(); var existingDevice = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV123" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { existingDevice }); - - this.MerchantUIService.Setup(m => m.SwapMerchantDevice(It.IsAny(), It.IsAny(), merchantId, "DEV123", "DEV456")) - .ReturnsAsync(Result.Success); - + + this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), merchantId, "DEV123", "DEV456") + .ReturnsAsync(Result.Success()); + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Click Swap button for the device cut.WaitForAssertion(() => cut.FindAll("button").Any(b => b.TextContent.Contains("Swap")).ShouldBeTrue(), timeout: TimeSpan.FromSeconds(5)); IElement swapButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Swap")); swapButton.Click(); - + // Act - Enter new device identifier and confirm swap cut.WaitForAssertion(() => cut.Markup.ShouldContain("New Device Identifier"), timeout: TimeSpan.FromSeconds(5)); IElement swapInput = cut.FindAll("input").Last(); swapInput.Change("DEV456"); - + IElement confirmButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Confirm")); confirmButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Device DEV123 swapped for DEV456"), timeout: TimeSpan.FromSeconds(5)); - this.MerchantUIService.Verify(m => m.SwapMerchantDevice(It.IsAny(), It.IsAny(), merchantId, "DEV123", "DEV456"), Times.Once); + this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), merchantId, "DEV123", "DEV456").Called(Count.Once()); } [Fact] @@ -1043,31 +1042,31 @@ public void MerchantsEdit_SwapDeviceConfirm_EmptyIdentifier_ShowsError() var merchantId = Guid.NewGuid(); var existingDevice = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV123" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { existingDevice }); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Click Swap button for the device cut.WaitForAssertion(() => cut.FindAll("button").Any(b => b.TextContent.Contains("Swap")).ShouldBeTrue(), timeout: TimeSpan.FromSeconds(5)); IElement swapButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Swap")); swapButton.Click(); - + // Act - Try to confirm swap without entering identifier cut.WaitForAssertion(() => cut.Markup.ShouldContain("New Device Identifier"), timeout: TimeSpan.FromSeconds(5)); IElement confirmButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Confirm")); confirmButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("New device identifier is required"), timeout: TimeSpan.FromSeconds(5)); - this.MerchantUIService.Verify(m => m.SwapMerchantDevice(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).Called(Count.Never()); } [Fact] @@ -1077,34 +1076,34 @@ public void MerchantsEdit_SwapDeviceConfirm_SameIdentifier_ShowsError() var merchantId = Guid.NewGuid(); var existingDevice = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV123" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { existingDevice }); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Click Swap button for the device cut.WaitForAssertion(() => cut.FindAll("button").Any(b => b.TextContent.Contains("Swap")).ShouldBeTrue(), timeout: TimeSpan.FromSeconds(5)); IElement swapButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Swap")); swapButton.Click(); - + // Act - Enter same device identifier and try to confirm swap cut.WaitForAssertion(() => cut.Markup.ShouldContain("New Device Identifier"), timeout: TimeSpan.FromSeconds(5)); IElement swapInput = cut.FindAll("input").Last(); swapInput.Change("DEV123"); - + IElement confirmButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Confirm")); confirmButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("New device identifier cannot be the same as the current device"), timeout: TimeSpan.FromSeconds(5)); - this.MerchantUIService.Verify(m => m.SwapMerchantDevice(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).Called(Count.Never()); } [Fact] @@ -1115,34 +1114,34 @@ public void MerchantsEdit_SwapDeviceConfirm_DuplicateIdentifier_ShowsError() var device1 = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV123" }; var device2 = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV456" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { device1, device2 }); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Click Swap button for the first device cut.WaitForAssertion(() => cut.FindAll("button").Any(b => b.TextContent.Contains("Swap")).ShouldBeTrue(), timeout: TimeSpan.FromSeconds(5)); IElement swapButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Swap")); swapButton.Click(); - + // Act - Try to swap to an already assigned device identifier cut.WaitForAssertion(() => cut.Markup.ShouldContain("New Device Identifier"), timeout: TimeSpan.FromSeconds(5)); IElement swapInput = cut.FindAll("input").Last(); swapInput.Change("DEV456"); - + IElement confirmButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Confirm")); confirmButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("The specified device identifier is already assigned"), timeout: TimeSpan.FromSeconds(5)); - this.MerchantUIService.Verify(m => m.SwapMerchantDevice(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).Called(Count.Never()); } [Fact] @@ -1152,45 +1151,45 @@ public void MerchantsEdit_SwapDeviceConfirm_Failure_ClearsSwapUI() var merchantId = Guid.NewGuid(); var existingDevice = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV123" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { existingDevice }); - - this.MerchantUIService.Setup(m => m.SwapMerchantDevice(It.IsAny(), It.IsAny(), merchantId, "DEV123", "DEV456")) + + this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), merchantId, "DEV123", "DEV456") .ReturnsAsync(Result.Failure()); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Click Swap button for the device cut.WaitForAssertion(() => cut.FindAll("button").Any(b => b.TextContent.Contains("Swap")).ShouldBeTrue(), timeout: TimeSpan.FromSeconds(5)); IElement swapButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Swap")); swapButton.Click(); - + // Verify swap UI is shown cut.WaitForAssertion(() => cut.Markup.ShouldContain("New Device Identifier"), timeout: TimeSpan.FromSeconds(5)); - + // Act - Enter new device identifier and confirm swap IElement swapInput = cut.FindAll("input").Last(); swapInput.Change("DEV456"); - + IElement confirmButton = cut.FindAll("button") .First(b => b.TextContent.Contains("Confirm")); confirmButton.Click(); - + // Assert - Component calls CancelSwapDevice() which clears the swap UI even on failure // This means "New Device Identifier" should no longer be in markup after the operation cut.WaitForAssertion(() => cut.Markup.ShouldNotContain("New Device Identifier"), timeout: TimeSpan.FromSeconds(5)); - this.MerchantUIService.Verify(m => m.SwapMerchantDevice(It.IsAny(), It.IsAny(), merchantId, "DEV123", "DEV456"), Times.Once); + this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), merchantId, "DEV123", "DEV456").Called(Count.Once()); } // Helper methods - private void SetupSuccessfulDataLoad(Guid merchantId, - string merchantName = "Test Merchant", + private void SetupSuccessfulDataLoad(Guid merchantId, + string merchantName = "Test Merchant", string merchantReference = "MERCH001", List? assignedOperators = null, List? availableOperators = null, @@ -1229,24 +1228,24 @@ private void SetupSuccessfulDataLoad(Guid merchantId, Sunday = new MerchantModels.DayOpeningHoursModel { Opening = "1000", Closing = "1500" } }; - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(merchant)); - - this.MerchantUIService.Setup(m => m.GetMerchantOperators(It.IsAny(), It.IsAny(), merchantId)) + + this.MerchantUIService.GetMerchantOperators(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(assignedOperators ?? new List())); - - this.MerchantUIService.Setup(m => m.GetMerchantContracts(It.IsAny(), It.IsAny(), merchantId)) + + this.MerchantUIService.GetMerchantContracts(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(assignedContracts ?? new List())); - - this.MerchantUIService.Setup(m => m.GetMerchantDevices(It.IsAny(), It.IsAny(), merchantId)) + + this.MerchantUIService.GetMerchantDevices(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(assignedDevices ?? new List())); - this.MerchantUIService.Setup(m => m.GetMerchantOpeningHours(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(openingHours)); - this.OperatorUIService.Setup(o => o.GetOperatorsForDropDown(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(availableOperators ?? new List())); - - this.ContractUIService.Setup(c => c.GetContractsForDropDown(It.IsAny(), It.IsAny())) + + this.ContractUIService.GetContractsForDropDown(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(availableContracts ?? new List())); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs index 55f776c8..13f07553 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs @@ -7,7 +7,7 @@ using MediatR; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using MerchantsIndex = EstateManagementUI.BlazorServer.Components.Pages.Merchants.Index; @@ -28,16 +28,16 @@ public void MerchantsIndex_InitialState_ShowsLoadingIndicator() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Merchant Management"); } @@ -47,17 +47,17 @@ public void MerchantsIndex_WithNoMerchants_ShowsEmptyState() { // Arrange var merchants = new List(); - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin")); - + // Assert cut.Markup.ShouldContain("No merchants found"); } @@ -82,18 +82,18 @@ public void MerchantsIndex_WithMerchants_DisplaysMerchantList() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Merchant 1"); cut.Markup.ShouldContain("Test Merchant 2"); @@ -119,18 +119,18 @@ public void MerchantsIndex_WithMerchants_DisplaysSummaryCards() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Total Merchants"); cut.Markup.ShouldContain("Total Balance"); @@ -140,17 +140,17 @@ public void MerchantsIndex_WithMerchants_DisplaysSummaryCards() public void MerchantsIndex_HasCorrectPageTitle() { // Arrange - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(new List())); // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -169,18 +169,18 @@ public void MerchantsIndex_WithMerchants_DisplaysFilters() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Filters"); cut.Markup.ShouldContain("Name"); @@ -200,18 +200,18 @@ public void MerchantsIndex_WithManyMerchants_DisplaysPagination() MerchantName = $"Merchant {i}" }).ToList(); - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Page"); cut.Markup.ShouldContain("Showing"); @@ -233,18 +233,18 @@ public void MerchantsIndex_WithMerchants_DisplaysRegionAndPostcode() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("North Region"); cut.Markup.ShouldContain("12345"); @@ -255,11 +255,11 @@ public void MerchantsIndex_AddNewMerchantButton_NavigatesToNewMerchantPage() { // Arrange var merchants = new List(); - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -287,11 +287,11 @@ public void MerchantsIndex_ApplyFiltersButton_ClickIsHandled() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -303,11 +303,11 @@ public void MerchantsIndex_ApplyFiltersButton_ClickIsHandled() applyFiltersButton?.Click(); // Assert - Verify GetMerchants was called at least twice (once on load, once on filter) - this.MerchantUIService.Verify(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny()), Times.AtLeast(2)); + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()).Called(Count.AtLeast(2)); } [Fact] @@ -323,11 +323,11 @@ public void MerchantsIndex_ClearFiltersButton_ClickIsHandled() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -339,11 +339,11 @@ public void MerchantsIndex_ClearFiltersButton_ClickIsHandled() clearFiltersButton?.Click(); // Assert - Verify GetMerchants was called at least twice (once on load, once on clear) - this.MerchantUIService.Verify(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny()), Times.AtLeast(2)); + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()).Called(Count.AtLeast(2)); } [Fact] @@ -361,11 +361,11 @@ public void MerchantsIndex_ViewButton_NavigatesToMerchantDetailsPage() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -394,11 +394,11 @@ public void MerchantsIndex_EditButton_NavigatesToEditMerchantPage() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -427,14 +427,14 @@ public void MerchantsIndex_MakeDepositButton_OpensDepositModal() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(new MerchantModels.MerchantModel { MerchantId = merchantId, @@ -470,14 +470,14 @@ public void MerchantsIndex_DepositModal_HasOneCancelButton() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(new MerchantModels.MerchantModel { MerchantId = merchantId, @@ -512,14 +512,14 @@ public void MerchantsIndex_DepositModal_CancelButton_ClosesModal() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(new MerchantModels.MerchantModel { MerchantId = merchantId, @@ -556,26 +556,26 @@ public void MerchantsIndex_DepositModal_Submit_ShowsSuccess() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Success(new MerchantModels.MerchantModel { MerchantId = merchantId, MerchantName = "Test Merchant" })); - this.MerchantUIService.Setup(m => m.MakeMerchantDeposit( - It.IsAny(), - It.IsAny(), + this.MerchantUIService.MakeMerchantDeposit( + Arg.Any(), + Arg.Any(), merchantId, - It.IsAny())) - .ReturnsAsync(Result.Success); + Arg.Any()) + .ReturnsAsync(Result.Success()); var cut = RenderComponent(); cut.Instance.SetDelayOverride(500); @@ -610,14 +610,14 @@ public void MerchantsIndex_DepositModal_OpensWithoutMerchantName_WhenGetMerchant } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), merchantId)) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Failure()); var cut = RenderComponent(); @@ -642,11 +642,11 @@ public void MerchantsIndex_PaginationButtons_FirstPage_IsHandled() MerchantName = $"Merchant {i}" }).ToList(); - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -676,11 +676,11 @@ public void MerchantsIndex_PaginationButtons_PreviousPage_IsHandled() MerchantName = $"Merchant {i}" }).ToList(); - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -710,11 +710,11 @@ public void MerchantsIndex_PaginationButtons_NextPage_IsHandled() MerchantName = $"Merchant {i}" }).ToList(); - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -739,11 +739,11 @@ public void MerchantsIndex_PaginationButtons_LastPage_IsHandled() MerchantName = $"Merchant {i}" }).ToList(); - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); @@ -762,11 +762,11 @@ public void MerchantsIndex_PaginationButtons_LastPage_IsHandled() public void MerchantsIndex_LoadMerchants_LoadFails_NavigatesToError() { // Arrange - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Failure()); // Act @@ -791,11 +791,11 @@ public void MerchantsIndex_RowClick_NavigatesToMerchantDetailsPage() } }; - this.MerchantUIService.Setup(m => m.GetMerchants(It.IsAny(), It.IsAny(), It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) + this.MerchantUIService.GetMerchants(Arg.Any(), Arg.Any(), Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var cut = RenderComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs index b07d2e06..8a7e125e 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs @@ -1,7 +1,7 @@ using Bunit; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using MerchantsNew = EstateManagementUI.BlazorServer.Components.Pages.Merchants.New; @@ -13,7 +13,7 @@ public class MerchantsNewPageTests : BaseTest { private System.Reflection.MethodInfo GetHandleSubmitMethod() { - return typeof(MerchantsNew).GetMethod("HandleSubmit", + return typeof(MerchantsNew).GetMethod("HandleSubmit", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); } @@ -22,14 +22,14 @@ private System.Reflection.FieldInfo GetErrorMessageField(object instance) // Search through the type hierarchy to find the errorMessage field Type currentType = instance.GetType(); System.Reflection.FieldInfo field = null; - + while (currentType != null && field == null) { - field = currentType.GetField("errorMessage", + field = currentType.GetField("errorMessage", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); currentType = currentType.BaseType; } - + return field; } @@ -38,7 +38,7 @@ public void MerchantsNew_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Create New Merchant"); } @@ -48,7 +48,7 @@ public void MerchantsNew_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -87,12 +87,12 @@ public void MerchantsNew_CreateMerchantButton_Exists() public async Task HandleSubmit_SuccessfulCreation_SetsSuccessMessage() { // Arrange - this.MerchantUIService.Setup(m => m.CreateMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(Result.Success); + this.MerchantUIService.CreateMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .ReturnsAsync(Result.Success()); var cut = RenderComponent(); cut.Instance.SetDelayOverride(0); @@ -100,7 +100,7 @@ public async Task HandleSubmit_SuccessfulCreation_SetsSuccessMessage() // Act - Use reflection to call the private HandleSubmit method on the Dispatcher var handleSubmitMethod = GetHandleSubmitMethod(); handleSubmitMethod.ShouldNotBeNull(); - + await cut.InvokeAsync(async () => { var task = (Task)handleSubmitMethod.Invoke(cut.Instance, null); @@ -118,12 +118,12 @@ await cut.InvokeAsync(async () => public async Task HandleSubmit_SuccessfulCreation_NavigatesToMerchantsList() { // Arrange - this.MerchantUIService.Setup(m => m.CreateMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(Result.Success); + this.MerchantUIService.CreateMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .ReturnsAsync(Result.Success()); var cut = RenderComponent(); cut.Instance.SetDelayOverride(0); @@ -131,7 +131,7 @@ public async Task HandleSubmit_SuccessfulCreation_NavigatesToMerchantsList() // Act - Use reflection to call the private HandleSubmit method on the Dispatcher var handleSubmitMethod = GetHandleSubmitMethod(); handleSubmitMethod.ShouldNotBeNull(); - + await cut.InvokeAsync(async () => { var task = (Task)handleSubmitMethod.Invoke(cut.Instance, null); @@ -146,19 +146,19 @@ await cut.InvokeAsync(async () => public async Task HandleSubmit_FailedCreation_SetsErrorMessage() { // Arrange - this.MerchantUIService.Setup(m => m.CreateMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(Result.Failure); + this.MerchantUIService.CreateMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .ReturnsAsync(Result.Failure()); var cut = RenderComponent(); // Act - Use reflection to call the private HandleSubmit method on the Dispatcher var handleSubmitMethod = GetHandleSubmitMethod(); handleSubmitMethod.ShouldNotBeNull(); - + await cut.InvokeAsync(async () => { var task = (Task)handleSubmitMethod.Invoke(cut.Instance, null); @@ -176,12 +176,12 @@ await cut.InvokeAsync(async () => public async Task HandleSubmit_FailedCreation_DoesNotNavigate() { // Arrange - this.MerchantUIService.Setup(m => m.CreateMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(Result.Failure); + this.MerchantUIService.CreateMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .ReturnsAsync(Result.Failure()); var cut = RenderComponent(); var initialUri = _fakeNavigationManager.Uri; @@ -189,7 +189,7 @@ public async Task HandleSubmit_FailedCreation_DoesNotNavigate() // Act - Use reflection to call the private HandleSubmit method on the Dispatcher var handleSubmitMethod = GetHandleSubmitMethod(); handleSubmitMethod.ShouldNotBeNull(); - + await cut.InvokeAsync(async () => { var task = (Task)handleSubmitMethod.Invoke(cut.Instance, null); @@ -209,19 +209,20 @@ public async Task HandleSubmit_CallsCreateMerchantWithCorrectParameters() CorrelationId capturedCorrelationId = default; MerchantModels.CreateMerchantModel capturedModel = default; - this.MerchantUIService.Setup(m => m.CreateMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Callback( + this.MerchantUIService.CreateMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .ReturnsAsync(Result.Success()) + .Callback( (correlationId, estateId, merchantId, model) => { capturedCorrelationId = correlationId; capturedEstateId = estateId; capturedMerchantId = merchantId; capturedModel = model; - }) - .ReturnsAsync(Result.Success); + return Task.CompletedTask; + }); var cut = RenderComponent(); cut.Instance.SetDelayOverride(0); @@ -229,7 +230,7 @@ public async Task HandleSubmit_CallsCreateMerchantWithCorrectParameters() // Act - Use reflection to call the private HandleSubmit method on the Dispatcher var handleSubmitMethod = GetHandleSubmitMethod(); handleSubmitMethod.ShouldNotBeNull(); - + await cut.InvokeAsync(async () => { var task = (Task)handleSubmitMethod.Invoke(cut.Instance, null); @@ -237,12 +238,12 @@ await cut.InvokeAsync(async () => }); // Assert - Verify CreateMerchant was called with proper parameters - this.MerchantUIService.Verify(m => m.CreateMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny()), Times.Once); - + this.MerchantUIService.CreateMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()).Called(Count.Once()); + capturedCorrelationId.ShouldNotBeNull(); capturedEstateId.ShouldNotBe(Guid.Empty); capturedMerchantId.ShouldNotBe(Guid.Empty); @@ -253,12 +254,12 @@ await cut.InvokeAsync(async () => public async Task HandleSubmit_ClearsErrorMessageBeforeSubmit() { // Arrange - this.MerchantUIService.Setup(m => m.CreateMerchant( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(Result.Success); + this.MerchantUIService.CreateMerchant( + Arg.Any(), + Arg.Any(), + Arg.Any(), + Arg.Any()) + .ReturnsAsync(Result.Success()); var cut = RenderComponent(); cut.Instance.SetDelayOverride(0); @@ -275,7 +276,7 @@ public async Task HandleSubmit_ClearsErrorMessageBeforeSubmit() // Act - Use reflection to call the private HandleSubmit method on the Dispatcher var handleSubmitMethod = GetHandleSubmitMethod(); handleSubmitMethod.ShouldNotBeNull(); - + await cut.InvokeAsync(async () => { var task = (Task)handleSubmitMethod.Invoke(cut.Instance, null); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs index 675adfd4..2a02af3e 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs @@ -7,7 +7,7 @@ using MediatR; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -27,17 +27,17 @@ public void MerchantsView_InitialState_ShowsLoadingIndicator() MerchantReference = "REF001" }; - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(merchant)); - this.MerchantUIService.Setup(m => m.GetMerchantOperators(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantContracts(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantDevices(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantOpeningHours(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); + this.MerchantUIService.GetMerchantOperators(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantContracts(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantDevices(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); - + // Assert cut.Markup.ShouldContain("View Merchant"); } @@ -54,18 +54,18 @@ public void MerchantsView_WithMerchant_DisplaysMerchantName() MerchantReference = "REF001" }; - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(merchant)); - this.MerchantUIService.Setup(m => m.GetMerchantOperators(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantContracts(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantDevices(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantOpeningHours(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); + this.MerchantUIService.GetMerchantOperators(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantContracts(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantDevices(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Merchant"); cut.Markup.ShouldContain("REF001"); @@ -83,17 +83,17 @@ public void MerchantsView_HasCorrectPageTitle() MerchantReference = "REF001" }; - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(merchant)); - this.MerchantUIService.Setup(m => m.GetMerchantOperators(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantContracts(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantDevices(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantOpeningHours(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); + this.MerchantUIService.GetMerchantOperators(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantContracts(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantDevices(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -111,18 +111,18 @@ public void MerchantsView_HasBackButton() MerchantReference = "REF001" }; - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(merchant)); - this.MerchantUIService.Setup(m => m.GetMerchantOperators(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantContracts(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantDevices(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new List())); - this.MerchantUIService.Setup(m => m.GetMerchantOpeningHours(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); + this.MerchantUIService.GetMerchantOperators(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantContracts(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantDevices(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); + this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Back to List"); } @@ -135,12 +135,12 @@ public void MerchantsView_TabSwitch_ToAddress_UpdatesActiveTab() var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find address button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Address Line 1"), timeout: TimeSpan.FromSeconds(5)); } @@ -153,12 +153,12 @@ public void MerchantsView_TabSwitch_ToContact_UpdatesActiveTab() var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find contact button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contactButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Contact Details")); contactButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Contact Name"), timeout: TimeSpan.FromSeconds(5)); } @@ -171,12 +171,12 @@ public void MerchantsView_TabSwitch_ToOperators_UpdatesActiveTab() var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find operators button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No operators assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -189,12 +189,12 @@ public void MerchantsView_TabSwitch_ToContracts_UpdatesActiveTab() var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find contracts button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No contracts assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -207,12 +207,12 @@ public void MerchantsView_TabSwitch_ToDevices_UpdatesActiveTab() var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find devices button and click it IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No devices assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -225,16 +225,16 @@ public void MerchantsView_TabSwitch_BackToDetails_UpdatesActiveTab() var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Switch to operators first IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Act - switch back to details IElement? detailsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Merchant Details")); detailsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Merchant Name"), timeout: TimeSpan.FromSeconds(5)); } @@ -252,18 +252,18 @@ public void MerchantsView_DisplaysOperators_WhenPresent() TerminalNumber = "TERM001" } }; - + SetupSuccessfulDataLoadWithOperators(operators); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => { cut.Markup.ShouldContain("Test Operator"); @@ -276,16 +276,16 @@ public void MerchantsView_DisplaysNoOperators_WhenNoneAssigned() { // Arrange SetupSuccessfulDataLoad(); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to operators tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No operators assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -311,18 +311,18 @@ public void MerchantsView_DisplaysContracts_WhenPresent() } } }; - + SetupSuccessfulDataLoadWithContracts(contracts); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Assert cut.WaitForAssertion(() => { cut.Markup.ShouldContain("Test Contract"); @@ -335,16 +335,16 @@ public void MerchantsView_DisplaysNoContracts_WhenEmpty() { // Arrange SetupSuccessfulDataLoad(); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to contracts tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No contracts assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -360,18 +360,18 @@ public void MerchantsView_DisplaysDevices_WhenPresent() DeviceIdentifier = "DEVICE12345" } }; - + SetupSuccessfulDataLoadWithDevices(devices); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("DEVICE12345"), timeout: TimeSpan.FromSeconds(5)); } @@ -381,16 +381,16 @@ public void MerchantsView_DisplaysNoDevices_WhenEmpty() { // Arrange SetupSuccessfulDataLoad(); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to devices tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No devices assigned"), timeout: TimeSpan.FromSeconds(5)); } @@ -399,13 +399,13 @@ public void MerchantsView_DisplaysNoDevices_WhenEmpty() public void MerchantsView_LoadMerchantData_LoadFails_NavigatesToError() { // Arrange - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); - + // Assert _fakeNavigationManager.Uri.ShouldContain("error"); } @@ -425,11 +425,11 @@ public void MerchantsView_DisplaysMerchantDetails_WhenPresent() }; SetupSuccessfulDataLoadWithMerchant(merchant); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchant.MerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Merchant"); cut.Markup.ShouldContain("REF001"); @@ -454,16 +454,16 @@ public void MerchantsView_DisplaysAddressDetails_WhenPresent() }; SetupSuccessfulDataLoadWithMerchant(merchant); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchant.MerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to address tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); - + // Assert cut.WaitForAssertion(() => { cut.Markup.ShouldContain("123 Main Street"); @@ -487,16 +487,16 @@ public void MerchantsView_DisplaysContactDetails_WhenPresent() }; SetupSuccessfulDataLoadWithMerchant(merchant); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, merchant.MerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Switch to contact tab IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? contactButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Contact Details")); contactButton?.Click(); - + // Assert cut.WaitForAssertion(() => { cut.Markup.ShouldContain("John Doe"); @@ -533,16 +533,16 @@ public void MerchantsView_BackButton_NavigatesToMerchantsList() { // Arrange SetupSuccessfulDataLoad(); - + var cut = RenderComponent(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Click back button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton?.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("/merchants"); } @@ -591,15 +591,15 @@ private void SetupSuccessfulDataLoad( Sunday = new MerchantModels.DayOpeningHoursModel { Opening = "1000", Closing = "1500" } }; - this.MerchantUIService.Setup(m => m.GetMerchant(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(merchant)); - this.MerchantUIService.Setup(m => m.GetMerchantOperators(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchantOperators(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators ?? new List())); - this.MerchantUIService.Setup(m => m.GetMerchantContracts(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchantContracts(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts ?? new List())); - this.MerchantUIService.Setup(m => m.GetMerchantDevices(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchantDevices(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(devices ?? new List())); - this.MerchantUIService.Setup(m => m.GetMerchantOpeningHours(It.IsAny(), It.IsAny(), It.IsAny())) + this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(openingHours ?? new MerchantModels.MerchantOpeningHoursModel())); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs index 33bbbf0a..d2abfd38 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs @@ -13,18 +13,18 @@ public void NotFound_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Find("h3").TextContent.ShouldBe("Not Found"); cut.Find("p").TextContent.ShouldBe("Sorry, the content you are looking for does not exist."); } - + [Fact] public void NotFound_HasCorrectLayout() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldNotBeNullOrEmpty(); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs index b9bb0f52..d8de2df3 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs @@ -2,7 +2,7 @@ using Bunit; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using OperatorsEdit = EstateManagementUI.BlazorServer.Components.Pages.Operators.Edit; @@ -23,16 +23,16 @@ public void OperatorsEdit_RendersCorrectly() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - + // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Edit Operator"); } @@ -49,14 +49,14 @@ public void OperatorsEdit_HasCorrectPageTitle() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - + // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + // Assert IRenderedComponent pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -74,16 +74,16 @@ public void OperatorsEdit_LoadOperator_DisplaysOperatorDetails() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - + // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Edit Operator: Test Operator"); cut.Markup.ShouldContain("Operator Name"); @@ -103,21 +103,21 @@ public void OperatorsEdit_BackToListButton_NavigatesToOperatorsList() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find and click "Back to List" button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton.ShouldNotBeNull(); backButton.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("/operators"); } @@ -134,21 +134,21 @@ public void OperatorsEdit_CancelButton_NavigatesToOperatorsList() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find and click "Cancel" button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? cancelButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Cancel")); cancelButton.ShouldNotBeNull(); cancelButton.Click(); - + // Assert _fakeNavigationManager.Uri.ShouldContain("/operators"); } @@ -165,27 +165,27 @@ public void OperatorsEdit_UpdateOperator_Success_ShowsSuccessMessageAndNavigates RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - - this.OperatorUIService.Setup(o => o.UpdateOperator(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.UpdateOperator(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - + var cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find and click "Update Operator" button var buttons = cut.FindAll("button"); var updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Operator")); updateButton.ShouldNotBeNull(); updateButton.Click(); - + // Assert - Check for success message cut.WaitForAssertion(() => cut.Markup.ShouldContain("Operator updated successfully"), timeout: TimeSpan.FromSeconds(5)); - + // Assert - Check navigation cut.WaitForAssertion(() => _fakeNavigationManager.Uri.ShouldContain("/operators"), timeout: TimeSpan.FromSeconds(5)); } @@ -202,24 +202,24 @@ public void OperatorsEdit_UpdateOperator_Failure_ShowsErrorMessage() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - - this.OperatorUIService.Setup(o => o.UpdateOperator(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.UpdateOperator(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find and click "Update Operator" button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Operator")); updateButton.ShouldNotBeNull(); updateButton.Click(); - + // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Failed to update operator"), timeout: TimeSpan.FromSeconds(5)); } @@ -229,14 +229,14 @@ public void OperatorsEdit_LoadOperator_LoadFails_NavigatesToError() { // Arrange var operatorId = Guid.NewGuid(); - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - + // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + // Assert _fakeNavigationManager.Uri.ShouldContain("error"); } @@ -246,16 +246,16 @@ public void OperatorsEdit_OperatorNotFound_DisplaysMessage() { // Arrange var operatorId = Guid.NewGuid(); - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(null)); - + // Act IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Operator not found"); } @@ -272,29 +272,29 @@ public void OperatorsEdit_SubmitButton_DisplaysSavingState() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - + // Setup a delayed response to capture the saving state TaskCompletionSource tcs = new TaskCompletionSource(); - this.OperatorUIService.Setup(o => o.UpdateOperator(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.UpdateOperator(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .Returns(tcs.Task); - + IRenderedComponent cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Act - Find and click "Update Operator" button IRefreshableElementCollection buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Operator")); updateButton.ShouldNotBeNull(); updateButton.Click(); - + // Assert - Check for "Saving..." text while operation is in progress cut.Markup.ShouldContain("Saving..."); - + // Complete the operation tcs.SetResult(Result.Success()); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs index 7a21b3e9..d6693cb0 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs @@ -7,7 +7,7 @@ using MediatR; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using OperatorsIndex = EstateManagementUI.BlazorServer.Components.Pages.Operators.Index; @@ -30,13 +30,13 @@ public void OperatorsIndex_RendersCorrectly() RequireCustomTerminalNumber = false } }; - - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); - + // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Operator Management"); } @@ -46,13 +46,13 @@ public void OperatorsIndex_WithNoOperators_ShowsEmptyState() { // Arrange var emptyList = new List(); - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(emptyList)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin")); - + // Assert cut.Markup.ShouldContain("No operators found"); } @@ -79,13 +79,13 @@ public void OperatorsIndex_WithOperators_DisplaysOperatorList() } }; - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Operator 1"); cut.Markup.ShouldContain("Operator 2"); @@ -106,13 +106,13 @@ public void OperatorsIndex_DisplaysCustomNumberRequirements() } }; - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); // Act var cut = RenderComponent(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Custom Merchant Number"); cut.Markup.ShouldContain("Custom Terminal Number"); @@ -122,12 +122,12 @@ public void OperatorsIndex_DisplaysCustomNumberRequirements() public void OperatorsIndex_HasCorrectPageTitle() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -148,7 +148,7 @@ public void OperatorsIndex_AddNewOperatorButton_NavigatesToNewOperatorPage() } }; - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); var cut = RenderComponent(); @@ -180,7 +180,7 @@ public void OperatorsIndex_ViewButton_NavigatesToOperatorViewPage() } }; - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); var cut = RenderComponent(); @@ -212,7 +212,7 @@ public void OperatorsIndex_EditButton_NavigatesToOperatorEditPage() } }; - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); var cut = RenderComponent(); @@ -244,7 +244,7 @@ public void OperatorsIndex_TableRowClick_NavigatesToOperatorViewPage() } }; - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); var cut = RenderComponent(); @@ -264,7 +264,7 @@ public void OperatorsIndex_TableRowClick_NavigatesToOperatorViewPage() public void OperatorsIndex_LoadOperators_LoadFails_NavigatesToError() { // Arrange - this.OperatorUIService.Setup(o => o.GetOperators(It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); // Act diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs index e4fe71f1..ccc46581 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs @@ -2,7 +2,7 @@ using Bunit; using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using OperatorsNew = EstateManagementUI.BlazorServer.Components.Pages.Operators.New; @@ -65,7 +65,7 @@ public void OperatorsNew_CreateOperatorButton_IsPresent() public void OperatorsNew_SuccessfulCreation_NavigatesToOperatorsIndex() { // Arrange - this.OperatorUIService.Setup(o => o.CreateOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.CreateOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(); @@ -89,8 +89,8 @@ public void OperatorsNew_SuccessfulCreation_NavigatesToOperatorsIndex() public void OperatorsNew_FailedCreation_ShowsErrorMessage() { // Arrange - this.OperatorUIService.Setup(o => o.CreateOperator(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + this.OperatorUIService.CreateOperator(Arg.Any(), Arg.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); IRenderedComponent cut = RenderComponent(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Operator"), timeout: TimeSpan.FromSeconds(5)); @@ -141,7 +141,7 @@ public void OperatorsNew_DisplaysCheckboxOptions() public void OperatorsNew_SuccessfulCreation_ShowsSuccessMessage() { // Arrange - this.OperatorUIService.Setup(o => o.CreateOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.CreateOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); IRenderedComponent cut = RenderComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs index b3834de1..1d4dbb61 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs @@ -7,7 +7,7 @@ using MediatR; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -26,13 +26,13 @@ public void OperatorsView_RendersCorrectly() Name = "Test Operator" }; - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + // Assert cut.Markup.ShouldContain("View Operator"); } @@ -48,14 +48,14 @@ public void OperatorsView_DisplaysOperatorName() Name = "Test Operator" }; - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); // Act var cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - + // Assert cut.Markup.ShouldContain("Test Operator"); } @@ -65,13 +65,13 @@ public void OperatorsView_HasCorrectPageTitle() { // Arrange var operatorId = Guid.NewGuid(); - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new OperatorModels.OperatorModel { OperatorId = operatorId })); - + // Act var cut = RenderComponent(parameters => parameters .Add(p => p.OperatorId, operatorId)); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); @@ -88,7 +88,7 @@ public void OperatorsView_BackToListButton_NavigatesToOperatorsIndex() Name = "Test Operator" }; - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); var cut = RenderComponent(parameters => parameters @@ -117,7 +117,7 @@ public void OperatorsView_DisplaysRequireCustomMerchantNumber_WhenRequired() RequireCustomTerminalNumber = false }; - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); // Act @@ -143,7 +143,7 @@ public void OperatorsView_DisplaysRequireCustomMerchantNumber_WhenNotRequired() RequireCustomTerminalNumber = false }; - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); // Act @@ -169,7 +169,7 @@ public void OperatorsView_DisplaysRequireCustomTerminalNumber_WhenRequired() RequireCustomTerminalNumber = true }; - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); // Act @@ -195,7 +195,7 @@ public void OperatorsView_DisplaysRequireCustomTerminalNumber_WhenNotRequired() RequireCustomTerminalNumber = false }; - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); // Act @@ -213,7 +213,7 @@ public void OperatorsView_LoadOperator_LoadFails_NavigatesToError() { // Arrange var operatorId = Guid.NewGuid(); - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); // Act @@ -229,7 +229,7 @@ public void OperatorsView_DisplaysOperatorNotFound_WhenOperatorIsNull() { // Arrange var operatorId = Guid.NewGuid(); - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(null)); // Act @@ -246,7 +246,7 @@ public void OperatorsView_OperatorNotFoundBackButton_NavigatesToOperatorsIndex() { // Arrange var operatorId = Guid.NewGuid(); - this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(null)); var cut = RenderComponent(parameters => parameters diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs index 889db84d..84d33ef5 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs @@ -5,7 +5,7 @@ using MediatR; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using PermissionsIndex = EstateManagementUI.BlazorServer.Components.Pages.Permissions.Index; @@ -17,12 +17,12 @@ public class PermissionsIndexPageTests : BaseTest public void PermissionsIndex_RendersCorrectly() { // Arrange - _mockPermissionStore.Setup(x => x.GetAllRolesAsync()) + _mockPermissionStore.GetAllRolesAsync() .ReturnsAsync(new List()); - + // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Permission Management"); } @@ -31,12 +31,12 @@ public void PermissionsIndex_RendersCorrectly() public void PermissionsIndex_HasCorrectPageTitle() { // Arrange - _mockPermissionStore.Setup(x => x.GetAllRolesAsync()) + _mockPermissionStore.GetAllRolesAsync() .ReturnsAsync(new List()); - + // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs index 49518c80..79a566c1 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs @@ -3,7 +3,7 @@ using EstateManagementUI.BlazorServer.Permissions; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using System.Security.Claims; using TestContext = Bunit.TestContext; @@ -12,16 +12,16 @@ namespace EstateManagementUI.BlazorServer.Tests.Pages; public class PermissionsDebugPageTests : TestContext { - private readonly Mock _mockPermissionService; - private readonly Mock _mockAuthStateProvider; - private readonly Mock _mockPermissionStore; + private readonly IPermissionServiceImposter _mockPermissionService; + private readonly AuthenticationStateProviderImposter _mockAuthStateProvider; + private readonly IPermissionStoreImposter _mockPermissionStore; public PermissionsDebugPageTests() { - _mockPermissionService = new Mock(); - _mockAuthStateProvider = new Mock(); - _mockPermissionStore = new Mock(); - + _mockPermissionService = new IPermissionServiceImposter(); + _mockAuthStateProvider = new AuthenticationStateProviderImposter(); + _mockPermissionStore = new IPermissionStoreImposter(); + // Setup default mock behaviors var identity = new ClaimsIdentity(new[] { @@ -30,25 +30,25 @@ public PermissionsDebugPageTests() }, "TestAuth"); var principal = new ClaimsPrincipal(identity); var authState = new AuthenticationState(principal); - - _mockAuthStateProvider.Setup(x => x.GetAuthenticationStateAsync()) + + _mockAuthStateProvider.GetAuthenticationStateAsync() .ReturnsAsync(authState); - - _mockPermissionService.Setup(x => x.GetUserRoleAsync()) + + _mockPermissionService.GetUserRoleAsync() .ReturnsAsync("TestRole"); - - _mockPermissionService.Setup(x => x.GetUserPermissionsAsync()) + + _mockPermissionService.GetUserPermissionsAsync() .ReturnsAsync(new List()); - - _mockPermissionService.Setup(x => x.HasPermissionAsync(It.IsAny(), It.IsAny())) + + _mockPermissionService.HasPermissionAsync(Arg.Any(), Arg.Any()) .ReturnsAsync(false); - - _mockPermissionStore.Setup(x => x.GetAllRolesAsync()) + + _mockPermissionStore.GetAllRolesAsync() .ReturnsAsync(new List()); - - Services.AddSingleton(_mockPermissionService.Object); - Services.AddSingleton(_mockAuthStateProvider.Object); - Services.AddSingleton(_mockPermissionStore.Object); + + Services.AddSingleton(_mockPermissionService.Instance()); + Services.AddSingleton(_mockAuthStateProvider.Instance()); + Services.AddSingleton(_mockPermissionStore.Instance()); } [Fact] @@ -56,17 +56,17 @@ public void PermissionsDebug_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldNotBeNullOrEmpty(); } - + [Fact] public void PermissionsDebug_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs index e5aeb0f1..875b1f47 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs @@ -3,7 +3,7 @@ using EstateManagementUI.BlazorServer.Permissions; using EstateManagementUI.BlazorServer.Tests.Pages.FileProcessing; using Microsoft.Extensions.DependencyInjection; -using Moq; +using Imposter.Abstractions; using Shouldly; using ReportingIndex = EstateManagementUI.BlazorServer.Components.Pages.Reporting.Index; @@ -16,7 +16,7 @@ public void ReportingIndex_RendersCorrectly() { // Act var cut = RenderComponent(); - + // Assert cut.Markup.ShouldContain("Reporting"); } @@ -26,7 +26,7 @@ public void ReportingIndex_HasCorrectPageTitle() { // Act var cut = RenderComponent(); - + // Assert var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionKeyProviderTests.cs b/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionKeyProviderTests.cs index c94fef9b..28ec7e75 100644 --- a/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionKeyProviderTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionKeyProviderTests.cs @@ -10,57 +10,57 @@ public void GetKey_ReturnsNonEmptyKey() { // Arrange var provider = new PermissionKeyProvider(); - + // Act var key = provider.GetKey(); - + // Assert key.ShouldNotBeNullOrEmpty(); } - + [Fact] public void GetKey_ReturnsSameKeyWhenCalledMultipleTimes() { // Arrange var provider = new PermissionKeyProvider(); - + // Act var key1 = provider.GetKey(); var key2 = provider.GetKey(); - + // Assert key1.ShouldBe(key2); } - + [Fact] public void RefreshKey_ChangesKey() { // Arrange var provider = new PermissionKeyProvider(); var originalKey = provider.GetKey(); - + // Act provider.RefreshKey(); var newKey = provider.GetKey(); - + // Assert newKey.ShouldNotBe(originalKey); } - + [Fact] public void RefreshKey_GeneratesUniqueKeys() { // Arrange var provider = new PermissionKeyProvider(); var keys = new HashSet(); - + // Act for (int i = 0; i < 100; i++) { provider.RefreshKey(); keys.Add(provider.GetKey()); } - + // Assert keys.Count.ShouldBe(100); } diff --git a/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionServiceTests.cs b/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionServiceTests.cs index 6c8ccb6b..6eb680e4 100644 --- a/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionServiceTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Permissions/PermissionServiceTests.cs @@ -1,7 +1,7 @@ using EstateManagementUI.BlazorServer.Permissions; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.Logging; -using Moq; +using Imposter.Abstractions; using Shouldly; using System.Security.Claims; @@ -9,17 +9,17 @@ namespace EstateManagementUI.BlazorServer.Tests.Permissions; public class PermissionServiceTests { - private readonly Mock _authStateProvider; - private readonly Mock _permissionStore; - private readonly Mock> _logger; + private readonly AuthenticationStateProviderImposter _authStateProvider; + private readonly IPermissionStoreImposter _permissionStore; + private readonly ILoggerImposter _logger; private readonly PermissionService _permissionService; public PermissionServiceTests() { - _authStateProvider = new Mock(); - _permissionStore = new Mock(); - _logger = new Mock>(); - _permissionService = new PermissionService(_authStateProvider.Object, _permissionStore.Object, _logger.Object); + _authStateProvider = new AuthenticationStateProviderImposter(); + _permissionStore = new IPermissionStoreImposter(); + _logger = new ILoggerImposter(); + _permissionService = new PermissionService(_authStateProvider.Instance(), _permissionStore.Instance(), _logger.Instance()); } [Fact] @@ -32,18 +32,18 @@ public async Task HasPermissionAsync_WithValidPermission_ReturnsTrue() new Permission(PermissionSection.Merchant, PermissionFunction.Create) }; var role = new Role("Estate", permissions); - + var claims = new List { new Claim(ClaimTypes.Role, "Estate") }; var identity = new ClaimsIdentity(claims, "TestAuth"); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - _permissionStore.Setup(x => x.GetRoleAsync("Estate")).ReturnsAsync(role); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + _permissionStore.GetRoleAsync("Estate").ReturnsAsync(role); + // Act var result = await _permissionService.HasPermissionAsync(PermissionSection.Merchant, PermissionFunction.View); - + // Assert result.ShouldBeTrue(); } @@ -57,18 +57,18 @@ public async Task HasPermissionAsync_WithInvalidPermission_ReturnsFalse() new Permission(PermissionSection.Merchant, PermissionFunction.View) }; var role = new Role("Viewer", permissions); - + var claims = new List { new Claim(ClaimTypes.Role, "Viewer") }; var identity = new ClaimsIdentity(claims, "TestAuth"); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - _permissionStore.Setup(x => x.GetRoleAsync("Viewer")).ReturnsAsync(role); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + _permissionStore.GetRoleAsync("Viewer").ReturnsAsync(role); + // Act var result = await _permissionService.HasPermissionAsync(PermissionSection.Merchant, PermissionFunction.Create); - + // Assert result.ShouldBeFalse(); } @@ -80,12 +80,12 @@ public async Task HasPermissionAsync_WithUnauthenticatedUser_ReturnsFalse() var identity = new ClaimsIdentity(); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + // Act var result = await _permissionService.HasPermissionAsync(PermissionSection.Merchant, PermissionFunction.View); - + // Assert result.ShouldBeFalse(); } @@ -100,18 +100,18 @@ public async Task HasSectionAccessAsync_WithAccessToSection_ReturnsTrue() new Permission(PermissionSection.Merchant, PermissionFunction.Create) }; var role = new Role("Estate", permissions); - + var claims = new List { new Claim(ClaimTypes.Role, "Estate") }; var identity = new ClaimsIdentity(claims, "TestAuth"); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - _permissionStore.Setup(x => x.GetRoleAsync("Estate")).ReturnsAsync(role); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + _permissionStore.GetRoleAsync("Estate").ReturnsAsync(role); + // Act var result = await _permissionService.HasSectionAccessAsync(PermissionSection.Merchant); - + // Assert result.ShouldBeTrue(); } @@ -125,18 +125,18 @@ public async Task HasSectionAccessAsync_WithoutAccessToSection_ReturnsFalse() new Permission(PermissionSection.Merchant, PermissionFunction.View) }; var role = new Role("Viewer", permissions); - + var claims = new List { new Claim(ClaimTypes.Role, "Viewer") }; var identity = new ClaimsIdentity(claims, "TestAuth"); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - _permissionStore.Setup(x => x.GetRoleAsync("Viewer")).ReturnsAsync(role); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + _permissionStore.GetRoleAsync("Viewer").ReturnsAsync(role); + // Act var result = await _permissionService.HasSectionAccessAsync(PermissionSection.Operator); - + // Assert result.ShouldBeFalse(); } @@ -151,18 +151,18 @@ public async Task GetUserPermissionsAsync_WithValidRole_ReturnsPermissions() new Permission(PermissionSection.Operator, PermissionFunction.View) }; var role = new Role("Viewer", permissions); - + var claims = new List { new Claim(ClaimTypes.Role, "Viewer") }; var identity = new ClaimsIdentity(claims, "TestAuth"); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - _permissionStore.Setup(x => x.GetRoleAsync("Viewer")).ReturnsAsync(role); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + _permissionStore.GetRoleAsync("Viewer").ReturnsAsync(role); + // Act var result = await _permissionService.GetUserPermissionsAsync(); - + // Assert result.ShouldNotBeNull(); result.Count.ShouldBe(2); @@ -176,12 +176,12 @@ public async Task GetUserPermissionsAsync_WithNoRole_ReturnsEmptyList() var identity = new ClaimsIdentity(claims, "TestAuth"); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + // Act var result = await _permissionService.GetUserPermissionsAsync(); - + // Assert result.ShouldNotBeNull(); result.ShouldBeEmpty(); @@ -195,12 +195,12 @@ public async Task GetUserRoleAsync_WithValidRole_ReturnsRoleName() var identity = new ClaimsIdentity(claims, "TestAuth"); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + // Act var result = await _permissionService.GetUserRoleAsync(); - + // Assert result.ShouldBe("Estate"); } @@ -212,12 +212,12 @@ public async Task GetUserRoleAsync_WithUnauthenticatedUser_ReturnsNull() var identity = new ClaimsIdentity(); var user = new ClaimsPrincipal(identity); var authState = new AuthenticationState(user); - - _authStateProvider.Setup(x => x.GetAuthenticationStateAsync()).ReturnsAsync(authState); - + + _authStateProvider.GetAuthenticationStateAsync().ReturnsAsync(authState); + // Act var result = await _permissionService.GetUserRoleAsync(); - + // Assert result.ShouldBeNull(); } diff --git a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/ContractRequestHandlerTests.cs b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/ContractRequestHandlerTests.cs index 2e4f1fef..03be3c67 100644 --- a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/ContractRequestHandlerTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/ContractRequestHandlerTests.cs @@ -2,7 +2,7 @@ using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.RequestHandlers; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -10,13 +10,13 @@ namespace EstateManagementUI.BlazorServer.Tests.RequestHandlers; public class ContractRequestHandlerTests { - private readonly Mock _mockApiClient; + private readonly IApiClientImposter _mockApiClient; private readonly ContractRequestHandler _handler; public ContractRequestHandlerTests() { - _mockApiClient = new Mock(); - _handler = new ContractRequestHandler(_mockApiClient.Object); + _mockApiClient = new IApiClientImposter(); + _handler = new ContractRequestHandler(_mockApiClient.Instance()); } [Fact] @@ -32,7 +32,7 @@ public async Task Handle_GetContractsQuery_ReturnsSuccess_WhenApiClientSucceeds( }; _mockApiClient - .Setup(c => c.GetContracts(query, It.IsAny())) + .GetContracts(query, Arg.Any()) .ReturnsAsync(Result.Success(contracts)); // Act @@ -43,7 +43,7 @@ public async Task Handle_GetContractsQuery_ReturnsSuccess_WhenApiClientSucceeds( result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(2); - _mockApiClient.Verify(c => c.GetContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetContracts(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -53,7 +53,7 @@ public async Task Handle_GetContractsQuery_ReturnsFailure_WhenApiClientFails() var query = new ContractQueries.GetContractsQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetContracts(query, It.IsAny())) + .GetContracts(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -62,7 +62,7 @@ public async Task Handle_GetContractsQuery_ReturnsFailure_WhenApiClientFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetContracts(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -80,7 +80,7 @@ public async Task Handle_GetContractQuery_ReturnsSuccess_WhenApiClientSucceeds() }; _mockApiClient - .Setup(c => c.GetContract(query, It.IsAny())) + .GetContract(query, Arg.Any()) .ReturnsAsync(Result.Success(contract)); // Act @@ -91,7 +91,7 @@ public async Task Handle_GetContractQuery_ReturnsSuccess_WhenApiClientSucceeds() result.Data.ShouldNotBeNull(); result.Data!.ContractId.ShouldBe(contractId); - _mockApiClient.Verify(c => c.GetContract(query, It.IsAny()), Times.Once); + _mockApiClient.GetContract(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -101,7 +101,7 @@ public async Task Handle_GetContractQuery_ReturnsFailure_WhenApiClientFails() var query = new ContractQueries.GetContractQuery(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetContract(query, It.IsAny())) + .GetContract(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -110,7 +110,7 @@ public async Task Handle_GetContractQuery_ReturnsFailure_WhenApiClientFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetContract(query, It.IsAny()), Times.Once); + _mockApiClient.GetContract(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -120,7 +120,7 @@ public async Task Handle_CreateContractCommand_ReturnsSuccess_WhenApiClientSucce var command = new ContractCommands.CreateContractCommand(CorrelationIdHelper.New(), Guid.NewGuid(), "Test Contract", Guid.NewGuid()); _mockApiClient - .Setup(c => c.CreateContract(command, It.IsAny())) + .CreateContract(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -129,7 +129,7 @@ public async Task Handle_CreateContractCommand_ReturnsSuccess_WhenApiClientSucce // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.CreateContract(command, It.IsAny()), Times.Once); + _mockApiClient.CreateContract(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -139,7 +139,7 @@ public async Task Handle_CreateContractCommand_ReturnsFailure_WhenApiClientFails var command = new ContractCommands.CreateContractCommand(CorrelationIdHelper.New(), Guid.NewGuid(), "Test Contract", Guid.NewGuid()); _mockApiClient - .Setup(c => c.CreateContract(command, It.IsAny())) + .CreateContract(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -148,7 +148,7 @@ public async Task Handle_CreateContractCommand_ReturnsFailure_WhenApiClientFails // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.CreateContract(command, It.IsAny()), Times.Once); + _mockApiClient.CreateContract(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -158,7 +158,7 @@ public async Task Handle_AddProductToContractCommand_ReturnsSuccess_WhenApiClien var command = new ContractCommands.AddProductToContractCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Product 1", "Product Display", 9.99m); _mockApiClient - .Setup(c => c.AddProductToContract(command, It.IsAny())) + .AddProductToContract(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -167,7 +167,7 @@ public async Task Handle_AddProductToContractCommand_ReturnsSuccess_WhenApiClien // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddProductToContract(command, It.IsAny()), Times.Once); + _mockApiClient.AddProductToContract(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -177,7 +177,7 @@ public async Task Handle_AddProductToContractCommand_ReturnsFailure_WhenApiClien var command = new ContractCommands.AddProductToContractCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Product 1", "Product Display", 9.99m); _mockApiClient - .Setup(c => c.AddProductToContract(command, It.IsAny())) + .AddProductToContract(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -186,7 +186,7 @@ public async Task Handle_AddProductToContractCommand_ReturnsFailure_WhenApiClien // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddProductToContract(command, It.IsAny()), Times.Once); + _mockApiClient.AddProductToContract(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -196,7 +196,7 @@ public async Task Handle_AddTransactionFeeToProductCommand_ReturnsSuccess_WhenAp var command = new ContractCommands.AddTransactionFeeToProductCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "Fee Description", 1.50m, "Fixed", "Merchant"); _mockApiClient - .Setup(c => c.AddTransactionFeeToProduct(command, It.IsAny())) + .AddTransactionFeeToProduct(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -205,7 +205,7 @@ public async Task Handle_AddTransactionFeeToProductCommand_ReturnsSuccess_WhenAp // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddTransactionFeeToProduct(command, It.IsAny()), Times.Once); + _mockApiClient.AddTransactionFeeToProduct(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -215,7 +215,7 @@ public async Task Handle_AddTransactionFeeToProductCommand_ReturnsFailure_WhenAp var command = new ContractCommands.AddTransactionFeeToProductCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "Fee Description", 1.50m, "Fixed", "Merchant"); _mockApiClient - .Setup(c => c.AddTransactionFeeToProduct(command, It.IsAny())) + .AddTransactionFeeToProduct(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -224,7 +224,7 @@ public async Task Handle_AddTransactionFeeToProductCommand_ReturnsFailure_WhenAp // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddTransactionFeeToProduct(command, It.IsAny()), Times.Once); + _mockApiClient.AddTransactionFeeToProduct(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -234,7 +234,7 @@ public async Task Handle_RemoveTransactionFeeFromProductCommand_ReturnsSuccess_W var command = new ContractCommands.RemoveTransactionFeeFromProductCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.RemoveTransactionFeeFromProduct(command, It.IsAny())) + .RemoveTransactionFeeFromProduct(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -243,7 +243,7 @@ public async Task Handle_RemoveTransactionFeeFromProductCommand_ReturnsSuccess_W // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveTransactionFeeFromProduct(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveTransactionFeeFromProduct(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -253,7 +253,7 @@ public async Task Handle_RemoveTransactionFeeFromProductCommand_ReturnsFailure_W var command = new ContractCommands.RemoveTransactionFeeFromProductCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.RemoveTransactionFeeFromProduct(command, It.IsAny())) + .RemoveTransactionFeeFromProduct(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -262,7 +262,7 @@ public async Task Handle_RemoveTransactionFeeFromProductCommand_ReturnsFailure_W // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveTransactionFeeFromProduct(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveTransactionFeeFromProduct(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -277,7 +277,7 @@ public async Task Handle_GetRecentContractsQuery_ReturnsSuccess_WhenApiClientSuc }; _mockApiClient - .Setup(c => c.GetRecentContracts(query, It.IsAny())) + .GetRecentContracts(query, Arg.Any()) .ReturnsAsync(Result.Success(recentContracts)); // Act @@ -288,7 +288,7 @@ public async Task Handle_GetRecentContractsQuery_ReturnsSuccess_WhenApiClientSuc result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(1); - _mockApiClient.Verify(c => c.GetRecentContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetRecentContracts(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -298,7 +298,7 @@ public async Task Handle_GetRecentContractsQuery_ReturnsFailure_WhenApiClientFai var query = new ContractQueries.GetRecentContractsQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetRecentContracts(query, It.IsAny())) + .GetRecentContracts(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -307,7 +307,7 @@ public async Task Handle_GetRecentContractsQuery_ReturnsFailure_WhenApiClientFai // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetRecentContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetRecentContracts(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -323,7 +323,7 @@ public async Task Handle_GetContractsForDropDownQuery_ReturnsSuccess_WhenApiClie }; _mockApiClient - .Setup(c => c.GetContracts(query, It.IsAny())) + .GetContracts(query, Arg.Any()) .ReturnsAsync(Result.Success(dropDownContracts)); // Act @@ -334,7 +334,7 @@ public async Task Handle_GetContractsForDropDownQuery_ReturnsSuccess_WhenApiClie result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(2); - _mockApiClient.Verify(c => c.GetContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetContracts(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -344,7 +344,7 @@ public async Task Handle_GetContractsForDropDownQuery_ReturnsFailure_WhenApiClie var query = new ContractQueries.GetContractsForDropDownQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetContracts(query, It.IsAny())) + .GetContracts(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -353,6 +353,6 @@ public async Task Handle_GetContractsForDropDownQuery_ReturnsFailure_WhenApiClie // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetContracts(query, Arg.Any()).Called(Count.Once()); } } diff --git a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/DateRequestHandlerTests.cs b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/DateRequestHandlerTests.cs index b533f87a..1ddffbf2 100644 --- a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/DateRequestHandlerTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/DateRequestHandlerTests.cs @@ -2,7 +2,7 @@ using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.RequestHandlers; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -10,13 +10,13 @@ namespace EstateManagementUI.BlazorServer.Tests.RequestHandlers; public class DateRequestHandlerTests { - private readonly Mock _mockApiClient; + private readonly IApiClientImposter _mockApiClient; private readonly DateRequestHandler _handler; public DateRequestHandlerTests() { - _mockApiClient = new Mock(); - _handler = new DateRequestHandler(_mockApiClient.Object); + _mockApiClient = new IApiClientImposter(); + _handler = new DateRequestHandler(_mockApiClient.Instance()); } [Fact] @@ -32,7 +32,7 @@ public async Task Handle_ReturnsSuccess_WhenApiClientSucceeds() }; _mockApiClient - .Setup(c => c.GetComparisonDates(query, It.IsAny())) + .GetComparisonDates(query, Arg.Any()) .ReturnsAsync(Result.Success(dates)); // Act @@ -45,7 +45,7 @@ public async Task Handle_ReturnsSuccess_WhenApiClientSucceeds() result.Data[0].Description.ShouldBe("Yesterday"); result.Data[1].Description.ShouldBe("Last Week"); - _mockApiClient.Verify(c => c.GetComparisonDates(query, It.IsAny()), Times.Once); + _mockApiClient.GetComparisonDates(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -55,7 +55,7 @@ public async Task Handle_ReturnsFailure_WhenApiClientFails() var query = new DateQueries.GetComparisonDatesQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetComparisonDates(query, It.IsAny())) + .GetComparisonDates(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -64,6 +64,6 @@ public async Task Handle_ReturnsFailure_WhenApiClientFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetComparisonDates(query, It.IsAny()), Times.Once); + _mockApiClient.GetComparisonDates(query, Arg.Any()).Called(Count.Once()); } } diff --git a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/EstateRequestHandlerTests.cs b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/EstateRequestHandlerTests.cs index 6f0bee05..b89681f1 100644 --- a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/EstateRequestHandlerTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/EstateRequestHandlerTests.cs @@ -2,7 +2,7 @@ using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.RequestHandlers; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -10,13 +10,13 @@ namespace EstateManagementUI.BlazorServer.Tests.RequestHandlers; public class EstateRequestHandlerTests { - private readonly Mock _mockApiClient; + private readonly IApiClientImposter _mockApiClient; private readonly EstateRequestHandler _handler; public EstateRequestHandlerTests() { - _mockApiClient = new Mock(); - _handler = new EstateRequestHandler(_mockApiClient.Object); + _mockApiClient = new IApiClientImposter(); + _handler = new EstateRequestHandler(_mockApiClient.Instance()); } [Fact] @@ -32,7 +32,7 @@ public async Task Handle_GetEstateQuery_ReturnsSuccess_WhenApiClientSucceeds() }; _mockApiClient - .Setup(c => c.GetEstate(query, It.IsAny())) + .GetEstate(query, Arg.Any()) .ReturnsAsync(Result.Success(estateModel)); // Act @@ -44,7 +44,7 @@ public async Task Handle_GetEstateQuery_ReturnsSuccess_WhenApiClientSucceeds() result.Data!.EstateId.ShouldBe(estateId); result.Data.EstateName.ShouldBe("Test Estate"); - _mockApiClient.Verify(c => c.GetEstate(query, It.IsAny()), Times.Once); + _mockApiClient.GetEstate(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -54,7 +54,7 @@ public async Task Handle_GetEstateQuery_ReturnsFailure_WhenApiClientFails() var query = new EstateQueries.GetEstateQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetEstate(query, It.IsAny())) + .GetEstate(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -63,7 +63,7 @@ public async Task Handle_GetEstateQuery_ReturnsFailure_WhenApiClientFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetEstate(query, It.IsAny()), Times.Once); + _mockApiClient.GetEstate(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -73,7 +73,7 @@ public async Task Handle_AddOperatorToEstateCommand_ReturnsSuccess_WhenApiClient var command = new EstateCommands.AddOperatorToEstateCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.AddEstateOperator(command, It.IsAny())) + .AddEstateOperator(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -82,7 +82,7 @@ public async Task Handle_AddOperatorToEstateCommand_ReturnsSuccess_WhenApiClient // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddEstateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.AddEstateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -92,7 +92,7 @@ public async Task Handle_AddOperatorToEstateCommand_ReturnsFailure_WhenApiClient var command = new EstateCommands.AddOperatorToEstateCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.AddEstateOperator(command, It.IsAny())) + .AddEstateOperator(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -101,7 +101,7 @@ public async Task Handle_AddOperatorToEstateCommand_ReturnsFailure_WhenApiClient // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddEstateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.AddEstateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -111,7 +111,7 @@ public async Task Handle_RemoveOperatorFromEstateCommand_ReturnsSuccess_WhenApiC var command = new EstateCommands.RemoveOperatorFromEstateCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.RemoveEstateOperator(command, It.IsAny())) + .RemoveEstateOperator(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -120,7 +120,7 @@ public async Task Handle_RemoveOperatorFromEstateCommand_ReturnsSuccess_WhenApiC // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveEstateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveEstateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -130,7 +130,7 @@ public async Task Handle_RemoveOperatorFromEstateCommand_ReturnsFailure_WhenApiC var command = new EstateCommands.RemoveOperatorFromEstateCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.RemoveEstateOperator(command, It.IsAny())) + .RemoveEstateOperator(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -139,7 +139,7 @@ public async Task Handle_RemoveOperatorFromEstateCommand_ReturnsFailure_WhenApiC // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveEstateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveEstateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -155,7 +155,7 @@ public async Task Handle_GetAssignedOperatorsQuery_ReturnsSuccess_WhenApiClientS }; _mockApiClient - .Setup(c => c.GetEstateAssignedOperators(query, It.IsAny())) + .GetEstateAssignedOperators(query, Arg.Any()) .ReturnsAsync(Result.Success(operators)); // Act @@ -168,7 +168,7 @@ public async Task Handle_GetAssignedOperatorsQuery_ReturnsSuccess_WhenApiClientS result.Data[0].Name.ShouldBe("Operator 1"); result.Data[1].Name.ShouldBe("Operator 2"); - _mockApiClient.Verify(c => c.GetEstateAssignedOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetEstateAssignedOperators(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -178,7 +178,7 @@ public async Task Handle_GetAssignedOperatorsQuery_ReturnsFailure_WhenApiClientF var query = new EstateQueries.GetAssignedOperatorsQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetEstateAssignedOperators(query, It.IsAny())) + .GetEstateAssignedOperators(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -187,6 +187,6 @@ public async Task Handle_GetAssignedOperatorsQuery_ReturnsFailure_WhenApiClientF // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetEstateAssignedOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetEstateAssignedOperators(query, Arg.Any()).Called(Count.Once()); } } diff --git a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/MerchantRequestHandlerTests.cs b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/MerchantRequestHandlerTests.cs index 12b2d93f..b9278a4d 100644 --- a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/MerchantRequestHandlerTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/MerchantRequestHandlerTests.cs @@ -2,7 +2,7 @@ using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.RequestHandlers; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -10,13 +10,13 @@ namespace EstateManagementUI.BlazorServer.Tests.RequestHandlers; public class MerchantRequestHandlerTests { - private readonly Mock _mockApiClient; + private readonly IApiClientImposter _mockApiClient; private readonly MerchantRequestHandler _handler; public MerchantRequestHandlerTests() { - _mockApiClient = new Mock(); - _handler = new MerchantRequestHandler(_mockApiClient.Object); + _mockApiClient = new IApiClientImposter(); + _handler = new MerchantRequestHandler(_mockApiClient.Instance()); } #region GetMerchantsQuery @@ -31,7 +31,7 @@ public async Task Handle_GetMerchantsQuery_ReturnsSuccess_WhenApiClientSucceeds( new() { MerchantId = Guid.NewGuid(), MerchantName = "Merchant1" } }; - _mockApiClient.Setup(c => c.GetMerchants(query, It.IsAny())) + _mockApiClient.GetMerchants(query, Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var result = await _handler.Handle(query, CancellationToken.None); @@ -39,7 +39,7 @@ public async Task Handle_GetMerchantsQuery_ReturnsSuccess_WhenApiClientSucceeds( result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(1); - _mockApiClient.Verify(c => c.GetMerchants(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchants(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -47,13 +47,13 @@ public async Task Handle_GetMerchantsQuery_ReturnsFailure_WhenApiClientFails() { var query = new MerchantQueries.GetMerchantsQuery(CorrelationIdHelper.New(), Guid.NewGuid(), null, null, null, null, null); - _mockApiClient.Setup(c => c.GetMerchants(query, It.IsAny())) + _mockApiClient.GetMerchants(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchants(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchants(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -68,7 +68,7 @@ public async Task Handle_GetMerchantQuery_ReturnsSuccess_WhenApiClientSucceeds() var query = new MerchantQueries.GetMerchantQuery(CorrelationIdHelper.New(), estateId, merchantId); var merchant = new MerchantModels.MerchantModel { MerchantId = merchantId, MerchantName = "Merchant1" }; - _mockApiClient.Setup(c => c.GetMerchant(query, It.IsAny())) + _mockApiClient.GetMerchant(query, Arg.Any()) .ReturnsAsync(Result.Success(merchant)); var result = await _handler.Handle(query, CancellationToken.None); @@ -76,7 +76,7 @@ public async Task Handle_GetMerchantQuery_ReturnsSuccess_WhenApiClientSucceeds() result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.MerchantId.ShouldBe(merchantId); - _mockApiClient.Verify(c => c.GetMerchant(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchant(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -84,13 +84,13 @@ public async Task Handle_GetMerchantQuery_ReturnsFailure_WhenApiClientFails() { var query = new MerchantQueries.GetMerchantQuery(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.GetMerchant(query, It.IsAny())) + _mockApiClient.GetMerchant(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchant(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchant(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -107,7 +107,7 @@ public async Task Handle_GetRecentMerchantsQuery_ReturnsSuccess_WhenApiClientSuc new() { MerchantId = Guid.NewGuid(), Name = "Merchant1", Reference = "REF1" } }; - _mockApiClient.Setup(c => c.GetRecentMerchants(query, It.IsAny())) + _mockApiClient.GetRecentMerchants(query, Arg.Any()) .ReturnsAsync(Result.Success(recentMerchants)); var result = await _handler.Handle(query, CancellationToken.None); @@ -115,7 +115,7 @@ public async Task Handle_GetRecentMerchantsQuery_ReturnsSuccess_WhenApiClientSuc result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(1); - _mockApiClient.Verify(c => c.GetRecentMerchants(query, It.IsAny()), Times.Once); + _mockApiClient.GetRecentMerchants(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -123,13 +123,13 @@ public async Task Handle_GetRecentMerchantsQuery_ReturnsFailure_WhenApiClientFai { var query = new MerchantQueries.GetRecentMerchantsQuery(CorrelationIdHelper.New(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.GetRecentMerchants(query, It.IsAny())) + _mockApiClient.GetRecentMerchants(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetRecentMerchants(query, It.IsAny()), Times.Once); + _mockApiClient.GetRecentMerchants(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -148,7 +148,7 @@ public async Task Handle_GetMerchantKpiQuery_ReturnsSuccess_WhenApiClientSucceed MerchantsWithSaleInLastHour = 10 }; - _mockApiClient.Setup(c => c.GetMerchantKpi(query, It.IsAny())) + _mockApiClient.GetMerchantKpi(query, Arg.Any()) .ReturnsAsync(Result.Success(kpi)); var result = await _handler.Handle(query, CancellationToken.None); @@ -156,7 +156,7 @@ public async Task Handle_GetMerchantKpiQuery_ReturnsSuccess_WhenApiClientSucceed result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.MerchantsWithSaleInLastHour.ShouldBe(10); - _mockApiClient.Verify(c => c.GetMerchantKpi(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantKpi(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -164,13 +164,13 @@ public async Task Handle_GetMerchantKpiQuery_ReturnsFailure_WhenApiClientFails() { var query = new MerchantQueries.GetMerchantKpiQuery(CorrelationIdHelper.New(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.GetMerchantKpi(query, It.IsAny())) + _mockApiClient.GetMerchantKpi(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchantKpi(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantKpi(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -187,7 +187,7 @@ public async Task Handle_GetMerchantsForDropDownQuery_ReturnsSuccess_WhenApiClie new() { MerchantId = Guid.NewGuid(), MerchantName = "Merchant1" } }; - _mockApiClient.Setup(c => c.GetMerchants(query, It.IsAny())) + _mockApiClient.GetMerchants(query, Arg.Any()) .ReturnsAsync(Result.Success(merchants)); var result = await _handler.Handle(query, CancellationToken.None); @@ -195,7 +195,7 @@ public async Task Handle_GetMerchantsForDropDownQuery_ReturnsSuccess_WhenApiClie result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(1); - _mockApiClient.Verify(c => c.GetMerchants(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchants(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -203,13 +203,13 @@ public async Task Handle_GetMerchantsForDropDownQuery_ReturnsFailure_WhenApiClie { var query = new MerchantQueries.GetMerchantsForDropDownQuery(CorrelationIdHelper.New(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.GetMerchants(query, It.IsAny())) + _mockApiClient.GetMerchants(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchants(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchants(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -227,7 +227,7 @@ public async Task Handle_GetMerchantContractsQuery_ReturnsSuccess_WhenApiClientS new() { MerchantId = merchantId, ContractId = Guid.NewGuid(), ContractName = "Contract1" } }; - _mockApiClient.Setup(c => c.GetMerchantContracts(query, It.IsAny())) + _mockApiClient.GetMerchantContracts(query, Arg.Any()) .ReturnsAsync(Result.Success(contracts)); var result = await _handler.Handle(query, CancellationToken.None); @@ -235,7 +235,7 @@ public async Task Handle_GetMerchantContractsQuery_ReturnsSuccess_WhenApiClientS result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(1); - _mockApiClient.Verify(c => c.GetMerchantContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantContracts(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -243,13 +243,13 @@ public async Task Handle_GetMerchantContractsQuery_ReturnsFailure_WhenApiClientF { var query = new MerchantQueries.GetMerchantContractsQuery(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.GetMerchantContracts(query, It.IsAny())) + _mockApiClient.GetMerchantContracts(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchantContracts(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantContracts(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -267,7 +267,7 @@ public async Task Handle_GetMerchantOperatorsQuery_ReturnsSuccess_WhenApiClientS new() { MerchantId = merchantId, OperatorId = Guid.NewGuid(), OperatorName = "Operator1" } }; - _mockApiClient.Setup(c => c.GetMerchantOperators(query, It.IsAny())) + _mockApiClient.GetMerchantOperators(query, Arg.Any()) .ReturnsAsync(Result.Success(operators)); var result = await _handler.Handle(query, CancellationToken.None); @@ -275,7 +275,7 @@ public async Task Handle_GetMerchantOperatorsQuery_ReturnsSuccess_WhenApiClientS result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(1); - _mockApiClient.Verify(c => c.GetMerchantOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantOperators(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -283,13 +283,13 @@ public async Task Handle_GetMerchantOperatorsQuery_ReturnsFailure_WhenApiClientF { var query = new MerchantQueries.GetMerchantOperatorsQuery(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.GetMerchantOperators(query, It.IsAny())) + _mockApiClient.GetMerchantOperators(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchantOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantOperators(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -307,7 +307,7 @@ public async Task Handle_GetMerchantDevicesQuery_ReturnsSuccess_WhenApiClientSuc new() { MerchantId = merchantId, DeviceId = Guid.NewGuid(), DeviceIdentifier = "DEVICE001" } }; - _mockApiClient.Setup(c => c.GetMerchantDevices(query, It.IsAny())) + _mockApiClient.GetMerchantDevices(query, Arg.Any()) .ReturnsAsync(Result.Success(devices)); var result = await _handler.Handle(query, CancellationToken.None); @@ -315,7 +315,7 @@ public async Task Handle_GetMerchantDevicesQuery_ReturnsSuccess_WhenApiClientSuc result.IsSuccess.ShouldBeTrue(); result.Data.ShouldNotBeNull(); result.Data!.Count.ShouldBe(1); - _mockApiClient.Verify(c => c.GetMerchantDevices(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantDevices(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -323,13 +323,13 @@ public async Task Handle_GetMerchantDevicesQuery_ReturnsFailure_WhenApiClientFai { var query = new MerchantQueries.GetMerchantDevicesQuery(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.GetMerchantDevices(query, It.IsAny())) + _mockApiClient.GetMerchantDevices(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(query, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchantDevices(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantDevices(query, Arg.Any()).Called(Count.Once()); } #endregion @@ -341,13 +341,13 @@ public async Task Handle_AddMerchantDeviceCommand_ReturnsSuccess_WhenApiClientSu { var command = new MerchantCommands.AddMerchantDeviceCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "DEVICE001"); - _mockApiClient.Setup(c => c.AddDeviceToMerchant(command, It.IsAny())) + _mockApiClient.AddDeviceToMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddDeviceToMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.AddDeviceToMerchant(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -355,13 +355,13 @@ public async Task Handle_AddMerchantDeviceCommand_ReturnsFailure_WhenApiClientFa { var command = new MerchantCommands.AddMerchantDeviceCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "DEVICE001"); - _mockApiClient.Setup(c => c.AddDeviceToMerchant(command, It.IsAny())) + _mockApiClient.AddDeviceToMerchant(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddDeviceToMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.AddDeviceToMerchant(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -373,13 +373,13 @@ public async Task Handle_AddOperatorToMerchantCommand_ReturnsSuccess_WhenApiClie { var command = new MerchantCommands.AddOperatorToMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "M001", "T001"); - _mockApiClient.Setup(c => c.AddOperatorToMerchant(command, It.IsAny())) + _mockApiClient.AddOperatorToMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddOperatorToMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.AddOperatorToMerchant(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -387,13 +387,13 @@ public async Task Handle_AddOperatorToMerchantCommand_ReturnsFailure_WhenApiClie { var command = new MerchantCommands.AddOperatorToMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "M001", "T001"); - _mockApiClient.Setup(c => c.AddOperatorToMerchant(command, It.IsAny())) + _mockApiClient.AddOperatorToMerchant(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddOperatorToMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.AddOperatorToMerchant(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -407,13 +407,13 @@ public async Task Handle_CreateMerchantCommand_ReturnsSuccess_WhenApiClientSucce var contact = new MerchantCommands.MerchantContact(Guid.NewGuid(), "John Doe", "john@example.com", "01234567890"); var command = new MerchantCommands.CreateMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Merchant1", "Immediate", address, contact); - _mockApiClient.Setup(c => c.CreateMerchant(command, It.IsAny())) + _mockApiClient.CreateMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.CreateMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.CreateMerchant(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -423,13 +423,13 @@ public async Task Handle_CreateMerchantCommand_ReturnsFailure_WhenApiClientFails var contact = new MerchantCommands.MerchantContact(Guid.NewGuid(), "John Doe", "john@example.com", "01234567890"); var command = new MerchantCommands.CreateMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Merchant1", "Immediate", address, contact); - _mockApiClient.Setup(c => c.CreateMerchant(command, It.IsAny())) + _mockApiClient.CreateMerchant(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.CreateMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.CreateMerchant(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -441,13 +441,13 @@ public async Task Handle_MakeMerchantDepositCommand_ReturnsSuccess_WhenApiClient { var command = new MerchantCommands.MakeMerchantDepositCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), 100.00m, DateTime.UtcNow, "REF001"); - _mockApiClient.Setup(c => c.MakeMerchantDeposit(command, It.IsAny())) + _mockApiClient.MakeMerchantDeposit(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.MakeMerchantDeposit(command, It.IsAny()), Times.Once); + _mockApiClient.MakeMerchantDeposit(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -455,13 +455,13 @@ public async Task Handle_MakeMerchantDepositCommand_ReturnsFailure_WhenApiClient { var command = new MerchantCommands.MakeMerchantDepositCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), 100.00m, DateTime.UtcNow, "REF001"); - _mockApiClient.Setup(c => c.MakeMerchantDeposit(command, It.IsAny())) + _mockApiClient.MakeMerchantDeposit(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.MakeMerchantDeposit(command, It.IsAny()), Times.Once); + _mockApiClient.MakeMerchantDeposit(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -475,18 +475,18 @@ public async Task Handle_UpdateMerchantOpeningHoursCommand_ReturnsSuccess_WhenAp CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), - new(new MerchantCommands.OpeningHours("0800","1700"), new MerchantCommands.OpeningHours("0800", "1700"), + new(new MerchantCommands.OpeningHours("0800","1700"), new MerchantCommands.OpeningHours("0800", "1700"), new MerchantCommands.OpeningHours("0800", "1700"), new MerchantCommands.OpeningHours("0800", "1700"), new MerchantCommands.OpeningHours("0800", "1700"), new MerchantCommands.OpeningHours("0800", "1700"), new MerchantCommands.OpeningHours("0800", "1700"))); - _mockApiClient.Setup(c => c.UpdateMerchantOpeningHours(command, It.IsAny())) + _mockApiClient.UpdateMerchantOpeningHours(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateMerchantOpeningHours(command, It.IsAny()), Times.Once); + _mockApiClient.UpdateMerchantOpeningHours(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -501,13 +501,13 @@ public async Task Handle_UpdateMerchantOpeningHoursCommand_ReturnsFailure_WhenAp new MerchantCommands.OpeningHours("0800", "1700"), new MerchantCommands.OpeningHours("0800", "1700"), new MerchantCommands.OpeningHours("0800", "1700"))); - _mockApiClient.Setup(c => c.UpdateMerchantOpeningHours(command, It.IsAny())) + _mockApiClient.UpdateMerchantOpeningHours(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateMerchantOpeningHours(command, It.IsAny()), Times.Once); + _mockApiClient.UpdateMerchantOpeningHours(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -519,13 +519,13 @@ public async Task Handle_RemoveContractFromMerchantCommand_ReturnsSuccess_WhenAp { var command = new MerchantCommands.RemoveContractFromMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.RemoveContractFromMerchant(command, It.IsAny())) + _mockApiClient.RemoveContractFromMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveContractFromMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveContractFromMerchant(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -533,13 +533,13 @@ public async Task Handle_RemoveContractFromMerchantCommand_ReturnsFailure_WhenAp { var command = new MerchantCommands.RemoveContractFromMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.RemoveContractFromMerchant(command, It.IsAny())) + _mockApiClient.RemoveContractFromMerchant(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveContractFromMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveContractFromMerchant(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -551,13 +551,13 @@ public async Task Handle_RemoveOperatorFromMerchantCommand_ReturnsSuccess_WhenAp { var command = new MerchantCommands.RemoveOperatorFromMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.RemoveOperatorFromMerchant(command, It.IsAny())) + _mockApiClient.RemoveOperatorFromMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveOperatorFromMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveOperatorFromMerchant(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -565,13 +565,13 @@ public async Task Handle_RemoveOperatorFromMerchantCommand_ReturnsFailure_WhenAp { var command = new MerchantCommands.RemoveOperatorFromMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.RemoveOperatorFromMerchant(command, It.IsAny())) + _mockApiClient.RemoveOperatorFromMerchant(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.RemoveOperatorFromMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.RemoveOperatorFromMerchant(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -583,13 +583,13 @@ public async Task Handle_SwapMerchantDeviceCommand_ReturnsSuccess_WhenApiClientS { var command = new MerchantCommands.SwapMerchantDeviceCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "OLD001", "NEW001"); - _mockApiClient.Setup(c => c.SwapMerchantDevice(command, It.IsAny())) + _mockApiClient.SwapMerchantDevice(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.SwapMerchantDevice(command, It.IsAny()), Times.Once); + _mockApiClient.SwapMerchantDevice(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -597,13 +597,13 @@ public async Task Handle_SwapMerchantDeviceCommand_ReturnsFailure_WhenApiClientF { var command = new MerchantCommands.SwapMerchantDeviceCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "OLD001", "NEW001"); - _mockApiClient.Setup(c => c.SwapMerchantDevice(command, It.IsAny())) + _mockApiClient.SwapMerchantDevice(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.SwapMerchantDevice(command, It.IsAny()), Times.Once); + _mockApiClient.SwapMerchantDevice(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -615,13 +615,13 @@ public async Task Handle_AssignContractToMerchantCommand_ReturnsSuccess_WhenApiC { var command = new MerchantCommands.AssignContractToMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.AddContractToMerchant(command, It.IsAny())) + _mockApiClient.AddContractToMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddContractToMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.AddContractToMerchant(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -629,13 +629,13 @@ public async Task Handle_AssignContractToMerchantCommand_ReturnsFailure_WhenApiC { var command = new MerchantCommands.AssignContractToMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); - _mockApiClient.Setup(c => c.AddContractToMerchant(command, It.IsAny())) + _mockApiClient.AddContractToMerchant(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.AddContractToMerchant(command, It.IsAny()), Times.Once); + _mockApiClient.AddContractToMerchant(command, Arg.Any()).Called(Count.Once()); } #endregion @@ -649,19 +649,19 @@ public async Task Handle_UpdateMerchantCommand_ReturnsSuccess_WhenAllApiCallsSuc var contact = new MerchantCommands.MerchantContact(Guid.NewGuid(), "John Doe", "john@example.com", "01234567890"); var command = new MerchantCommands.UpdateMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Merchant1", "Immediate", address, contact); - _mockApiClient.Setup(c => c.UpdateMerchant(command, It.IsAny())) + _mockApiClient.UpdateMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); - _mockApiClient.Setup(c => c.UpdateMerchantAddress(command, It.IsAny())) + _mockApiClient.UpdateMerchantAddress(command, Arg.Any()) .ReturnsAsync(Result.Success()); - _mockApiClient.Setup(c => c.UpdateMerchantContact(command, It.IsAny())) + _mockApiClient.UpdateMerchantContact(command, Arg.Any()) .ReturnsAsync(Result.Success()); var result = await _handler.Handle(command, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateMerchant(command, It.IsAny()), Times.Once); - _mockApiClient.Verify(c => c.UpdateMerchantAddress(command, It.IsAny()), Times.Once); - _mockApiClient.Verify(c => c.UpdateMerchantContact(command, It.IsAny()), Times.Once); + _mockApiClient.UpdateMerchant(command, Arg.Any()).Called(Count.Once()); + _mockApiClient.UpdateMerchantAddress(command, Arg.Any()).Called(Count.Once()); + _mockApiClient.UpdateMerchantContact(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -671,15 +671,15 @@ public async Task Handle_UpdateMerchantCommand_ReturnsFailure_WhenUpdateMerchant var contact = new MerchantCommands.MerchantContact(Guid.NewGuid(), "John Doe", "john@example.com", "01234567890"); var command = new MerchantCommands.UpdateMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Merchant1", "Immediate", address, contact); - _mockApiClient.Setup(c => c.UpdateMerchant(command, It.IsAny())) + _mockApiClient.UpdateMerchant(command, Arg.Any()) .ReturnsAsync(Result.Failure("update merchant failed")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateMerchant(command, It.IsAny()), Times.Once); - _mockApiClient.Verify(c => c.UpdateMerchantAddress(command, It.IsAny()), Times.Never); - _mockApiClient.Verify(c => c.UpdateMerchantContact(command, It.IsAny()), Times.Never); + _mockApiClient.UpdateMerchant(command, Arg.Any()).Called(Count.Once()); + _mockApiClient.UpdateMerchantAddress(command, Arg.Any()).Called(Count.Never()); + _mockApiClient.UpdateMerchantContact(command, Arg.Any()).Called(Count.Never()); } [Fact] @@ -689,17 +689,17 @@ public async Task Handle_UpdateMerchantCommand_ReturnsFailure_WhenUpdateMerchant var contact = new MerchantCommands.MerchantContact(Guid.NewGuid(), "John Doe", "john@example.com", "01234567890"); var command = new MerchantCommands.UpdateMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Merchant1", "Immediate", address, contact); - _mockApiClient.Setup(c => c.UpdateMerchant(command, It.IsAny())) + _mockApiClient.UpdateMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); - _mockApiClient.Setup(c => c.UpdateMerchantAddress(command, It.IsAny())) + _mockApiClient.UpdateMerchantAddress(command, Arg.Any()) .ReturnsAsync(Result.Failure("update address failed")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateMerchant(command, It.IsAny()), Times.Once); - _mockApiClient.Verify(c => c.UpdateMerchantAddress(command, It.IsAny()), Times.Once); - _mockApiClient.Verify(c => c.UpdateMerchantContact(command, It.IsAny()), Times.Never); + _mockApiClient.UpdateMerchant(command, Arg.Any()).Called(Count.Once()); + _mockApiClient.UpdateMerchantAddress(command, Arg.Any()).Called(Count.Once()); + _mockApiClient.UpdateMerchantContact(command, Arg.Any()).Called(Count.Never()); } [Fact] @@ -709,19 +709,19 @@ public async Task Handle_UpdateMerchantCommand_ReturnsFailure_WhenUpdateMerchant var contact = new MerchantCommands.MerchantContact(Guid.NewGuid(), "John Doe", "john@example.com", "01234567890"); var command = new MerchantCommands.UpdateMerchantCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "Merchant1", "Immediate", address, contact); - _mockApiClient.Setup(c => c.UpdateMerchant(command, It.IsAny())) + _mockApiClient.UpdateMerchant(command, Arg.Any()) .ReturnsAsync(Result.Success()); - _mockApiClient.Setup(c => c.UpdateMerchantAddress(command, It.IsAny())) + _mockApiClient.UpdateMerchantAddress(command, Arg.Any()) .ReturnsAsync(Result.Success()); - _mockApiClient.Setup(c => c.UpdateMerchantContact(command, It.IsAny())) + _mockApiClient.UpdateMerchantContact(command, Arg.Any()) .ReturnsAsync(Result.Failure("update contact failed")); var result = await _handler.Handle(command, CancellationToken.None); result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateMerchant(command, It.IsAny()), Times.Once); - _mockApiClient.Verify(c => c.UpdateMerchantAddress(command, It.IsAny()), Times.Once); - _mockApiClient.Verify(c => c.UpdateMerchantContact(command, It.IsAny()), Times.Once); + _mockApiClient.UpdateMerchant(command, Arg.Any()).Called(Count.Once()); + _mockApiClient.UpdateMerchantAddress(command, Arg.Any()).Called(Count.Once()); + _mockApiClient.UpdateMerchantContact(command, Arg.Any()).Called(Count.Once()); } #endregion diff --git a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/OperatorRequestHandlerTests.cs b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/OperatorRequestHandlerTests.cs index d7111c12..6aa40838 100644 --- a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/OperatorRequestHandlerTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/OperatorRequestHandlerTests.cs @@ -2,7 +2,7 @@ using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.RequestHandlers; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -10,13 +10,13 @@ namespace EstateManagementUI.BlazorServer.Tests.RequestHandlers; public class OperatorRequestHandlerTests { - private readonly Mock _mockApiClient; + private readonly IApiClientImposter _mockApiClient; private readonly OperatorRequestHandler _handler; public OperatorRequestHandlerTests() { - _mockApiClient = new Mock(); - _handler = new OperatorRequestHandler(_mockApiClient.Object); + _mockApiClient = new IApiClientImposter(); + _handler = new OperatorRequestHandler(_mockApiClient.Instance()); } [Fact] @@ -31,7 +31,7 @@ public async Task Handle_GetOperatorsQuery_ReturnsSuccess_WhenApiClientSucceeds( }; _mockApiClient - .Setup(c => c.GetOperators(query, It.IsAny())) + .GetOperators(query, Arg.Any()) .ReturnsAsync(Result.Success(operators)); // Act @@ -44,7 +44,7 @@ public async Task Handle_GetOperatorsQuery_ReturnsSuccess_WhenApiClientSucceeds( result.Data[0].Name.ShouldBe("Operator1"); result.Data[1].Name.ShouldBe("Operator2"); - _mockApiClient.Verify(c => c.GetOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperators(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -54,7 +54,7 @@ public async Task Handle_GetOperatorsQuery_ReturnsFailure_WhenApiClientFails() var query = new OperatorQueries.GetOperatorsQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetOperators(query, It.IsAny())) + .GetOperators(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -63,7 +63,7 @@ public async Task Handle_GetOperatorsQuery_ReturnsFailure_WhenApiClientFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperators(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -81,7 +81,7 @@ public async Task Handle_GetOperatorQuery_ReturnsSuccess_WhenApiClientSucceeds() }; _mockApiClient - .Setup(c => c.GetOperator(query, It.IsAny())) + .GetOperator(query, Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); // Act @@ -93,7 +93,7 @@ public async Task Handle_GetOperatorQuery_ReturnsSuccess_WhenApiClientSucceeds() result.Data!.OperatorId.ShouldBe(operatorId); result.Data.Name.ShouldBe("Operator1"); - _mockApiClient.Verify(c => c.GetOperator(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperator(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -103,7 +103,7 @@ public async Task Handle_GetOperatorQuery_ReturnsFailure_WhenApiClientFails() var query = new OperatorQueries.GetOperatorQuery(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetOperator(query, It.IsAny())) + .GetOperator(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -112,7 +112,7 @@ public async Task Handle_GetOperatorQuery_ReturnsFailure_WhenApiClientFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetOperator(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperator(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -122,7 +122,7 @@ public async Task Handle_CreateOperatorCommand_ReturnsSuccess_WhenApiClientSucce var command = new OperatorCommands.CreateOperatorCommand(CorrelationIdHelper.New(), Guid.NewGuid(), "NewOperator", true, false); _mockApiClient - .Setup(c => c.CreateOperator(command, It.IsAny())) + .CreateOperator(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -131,7 +131,7 @@ public async Task Handle_CreateOperatorCommand_ReturnsSuccess_WhenApiClientSucce // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.CreateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.CreateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -141,7 +141,7 @@ public async Task Handle_CreateOperatorCommand_ReturnsFailure_WhenApiClientFails var command = new OperatorCommands.CreateOperatorCommand(CorrelationIdHelper.New(), Guid.NewGuid(), "NewOperator", true, false); _mockApiClient - .Setup(c => c.CreateOperator(command, It.IsAny())) + .CreateOperator(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -150,7 +150,7 @@ public async Task Handle_CreateOperatorCommand_ReturnsFailure_WhenApiClientFails // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.CreateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.CreateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -160,7 +160,7 @@ public async Task Handle_UpdateOperatorCommand_ReturnsSuccess_WhenApiClientSucce var command = new OperatorCommands.UpdateOperatorCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "UpdatedOperator", false, true); _mockApiClient - .Setup(c => c.UpdateOperator(command, It.IsAny())) + .UpdateOperator(command, Arg.Any()) .ReturnsAsync(Result.Success()); // Act @@ -169,7 +169,7 @@ public async Task Handle_UpdateOperatorCommand_ReturnsSuccess_WhenApiClientSucce // Assert result.IsSuccess.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.UpdateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -179,7 +179,7 @@ public async Task Handle_UpdateOperatorCommand_ReturnsFailure_WhenApiClientFails var command = new OperatorCommands.UpdateOperatorCommand(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), "UpdatedOperator", false, true); _mockApiClient - .Setup(c => c.UpdateOperator(command, It.IsAny())) + .UpdateOperator(command, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -188,7 +188,7 @@ public async Task Handle_UpdateOperatorCommand_ReturnsFailure_WhenApiClientFails // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.UpdateOperator(command, It.IsAny()), Times.Once); + _mockApiClient.UpdateOperator(command, Arg.Any()).Called(Count.Once()); } [Fact] @@ -203,7 +203,7 @@ public async Task Handle_GetOperatorsForDropDownQuery_ReturnsSuccess_WhenApiClie }; _mockApiClient - .Setup(c => c.GetOperators(query, It.IsAny())) + .GetOperators(query, Arg.Any()) .ReturnsAsync(Result.Success(dropDownModels)); // Act @@ -216,7 +216,7 @@ public async Task Handle_GetOperatorsForDropDownQuery_ReturnsSuccess_WhenApiClie result.Data[0].OperatorName.ShouldBe("Operator1"); result.Data[1].OperatorName.ShouldBe("Operator2"); - _mockApiClient.Verify(c => c.GetOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperators(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -226,7 +226,7 @@ public async Task Handle_GetOperatorsForDropDownQuery_ReturnsFailure_WhenApiClie var query = new OperatorQueries.GetOperatorsForDropDownQuery(CorrelationIdHelper.New(), Guid.NewGuid()); _mockApiClient - .Setup(c => c.GetOperators(query, It.IsAny())) + .GetOperators(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -235,6 +235,6 @@ public async Task Handle_GetOperatorsForDropDownQuery_ReturnsFailure_WhenApiClie // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetOperators(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperators(query, Arg.Any()).Called(Count.Once()); } } diff --git a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/TransactionRequestHandlerTests.cs b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/TransactionRequestHandlerTests.cs index 2e7bc472..633399ad 100644 --- a/EstateManagementUI.BlazorServer.Tests/RequestHandlers/TransactionRequestHandlerTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/RequestHandlers/TransactionRequestHandlerTests.cs @@ -2,7 +2,7 @@ using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.RequestHandlers; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -10,15 +10,15 @@ namespace EstateManagementUI.BlazorServer.Tests.RequestHandlers; public class TransactionRequestHandlerTests { - private readonly Mock _mockApiClient; + private readonly IApiClientImposter _mockApiClient; private readonly TransactionRequestHandler _handler; private readonly SettlementRequestHandler _settlementHandler; public TransactionRequestHandlerTests() { - _mockApiClient = new Mock(); - _handler = new TransactionRequestHandler(_mockApiClient.Object); - _settlementHandler = new SettlementRequestHandler(_mockApiClient.Object); + _mockApiClient = new IApiClientImposter(); + _handler = new TransactionRequestHandler(_mockApiClient.Instance()); + _settlementHandler = new SettlementRequestHandler(_mockApiClient.Instance()); } [Fact] @@ -31,7 +31,7 @@ public async Task Handle_GetTodaysSalesQuery_ReturnsSuccess_WhenApiClientSucceed var model = new TodaysSalesModel { TodaysSalesCount = 5, TodaysSalesValue = 100m }; _mockApiClient - .Setup(c => c.GetTodaysSales(query, It.IsAny())) + .GetTodaysSales(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -43,7 +43,7 @@ public async Task Handle_GetTodaysSalesQuery_ReturnsSuccess_WhenApiClientSucceed result.Data!.TodaysSalesCount.ShouldBe(5); result.Data.TodaysSalesValue.ShouldBe(100m); - _mockApiClient.Verify(c => c.GetTodaysSales(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysSales(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -53,7 +53,7 @@ public async Task Handle_GetTodaysSalesQuery_ReturnsFailure_WhenApiClientFails() var query = new TransactionQueries.GetTodaysSalesQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.Date); _mockApiClient - .Setup(c => c.GetTodaysSales(query, It.IsAny())) + .GetTodaysSales(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -62,7 +62,7 @@ public async Task Handle_GetTodaysSalesQuery_ReturnsFailure_WhenApiClientFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetTodaysSales(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysSales(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -75,7 +75,7 @@ public async Task Handle_GetTodaysFailedSalesQuery_ReturnsSuccess_WhenApiClientS var model = new TodaysSalesModel { TodaysSalesCount = 3, TodaysSalesValue = 30m }; _mockApiClient - .Setup(c => c.GetTodaysFailedSales(query, It.IsAny())) + .GetTodaysFailedSales(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -86,7 +86,7 @@ public async Task Handle_GetTodaysFailedSalesQuery_ReturnsSuccess_WhenApiClientS result.Data.ShouldNotBeNull(); result.Data!.TodaysSalesCount.ShouldBe(3); - _mockApiClient.Verify(c => c.GetTodaysFailedSales(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysFailedSales(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -96,7 +96,7 @@ public async Task Handle_GetTodaysFailedSalesQuery_ReturnsFailure_WhenApiClientF var query = new TransactionQueries.GetTodaysFailedSalesQuery(CorrelationIdHelper.New(), Guid.NewGuid(), "RC1", DateTime.UtcNow.Date); _mockApiClient - .Setup(c => c.GetTodaysFailedSales(query, It.IsAny())) + .GetTodaysFailedSales(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -105,7 +105,7 @@ public async Task Handle_GetTodaysFailedSalesQuery_ReturnsFailure_WhenApiClientF // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetTodaysFailedSales(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysFailedSales(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -123,7 +123,7 @@ public async Task Handle_GetTransactionDetailQuery_ReturnsSuccess_WhenApiClientS }; _mockApiClient - .Setup(c => c.GetTransactionDetailReport(query, It.IsAny())) + .GetTransactionDetailReport(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -134,7 +134,7 @@ public async Task Handle_GetTransactionDetailQuery_ReturnsSuccess_WhenApiClientS result.Data.ShouldNotBeNull(); result.Data!.Summary.TransactionCount.ShouldBe(10); - _mockApiClient.Verify(c => c.GetTransactionDetailReport(query, It.IsAny()), Times.Once); + _mockApiClient.GetTransactionDetailReport(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -144,7 +144,7 @@ public async Task Handle_GetTransactionDetailQuery_ReturnsFailure_WhenApiClientF var query = new TransactionQueries.GetTransactionDetailQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow); _mockApiClient - .Setup(c => c.GetTransactionDetailReport(query, It.IsAny())) + .GetTransactionDetailReport(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -153,7 +153,7 @@ public async Task Handle_GetTransactionDetailQuery_ReturnsFailure_WhenApiClientF // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetTransactionDetailReport(query, It.IsAny()), Times.Once); + _mockApiClient.GetTransactionDetailReport(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -171,7 +171,7 @@ public async Task Handle_GetMerchantTransactionSummaryQuery_ReturnsSuccess_WhenA }; _mockApiClient - .Setup(c => c.GetMerchantTransactionSummary(query, It.IsAny())) + .GetMerchantTransactionSummary(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -182,7 +182,7 @@ public async Task Handle_GetMerchantTransactionSummaryQuery_ReturnsSuccess_WhenA result.Data.ShouldNotBeNull(); result.Data!.Summary.TotalMerchants.ShouldBe(2); - _mockApiClient.Verify(c => c.GetMerchantTransactionSummary(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantTransactionSummary(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -192,7 +192,7 @@ public async Task Handle_GetMerchantTransactionSummaryQuery_ReturnsFailure_WhenA var query = new TransactionQueries.GetMerchantTransactionSummaryQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow); _mockApiClient - .Setup(c => c.GetMerchantTransactionSummary(query, It.IsAny())) + .GetMerchantTransactionSummary(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -201,7 +201,7 @@ public async Task Handle_GetMerchantTransactionSummaryQuery_ReturnsFailure_WhenA // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetMerchantTransactionSummary(query, It.IsAny()), Times.Once); + _mockApiClient.GetMerchantTransactionSummary(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -219,7 +219,7 @@ public async Task Handle_GetOperatorTransactionSummaryQuery_ReturnsSuccess_WhenA }; _mockApiClient - .Setup(c => c.GetOperatorTransactionSummary(query, It.IsAny())) + .GetOperatorTransactionSummary(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -230,7 +230,7 @@ public async Task Handle_GetOperatorTransactionSummaryQuery_ReturnsSuccess_WhenA result.Data.ShouldNotBeNull(); result.Data!.Summary.TotalOperators.ShouldBe(3); - _mockApiClient.Verify(c => c.GetOperatorTransactionSummary(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperatorTransactionSummary(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -240,7 +240,7 @@ public async Task Handle_GetOperatorTransactionSummaryQuery_ReturnsFailure_WhenA var query = new TransactionQueries.GetOperatorTransactionSummaryQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow); _mockApiClient - .Setup(c => c.GetOperatorTransactionSummary(query, It.IsAny())) + .GetOperatorTransactionSummary(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -249,7 +249,7 @@ public async Task Handle_GetOperatorTransactionSummaryQuery_ReturnsFailure_WhenA // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetOperatorTransactionSummary(query, It.IsAny()), Times.Once); + _mockApiClient.GetOperatorTransactionSummary(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -267,7 +267,7 @@ public async Task Handle_GetProductPerformanceQuery_ReturnsSuccess_WhenApiClient }; _mockApiClient - .Setup(c => c.GetProductPerformance(query, It.IsAny())) + .GetProductPerformance(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -278,7 +278,7 @@ public async Task Handle_GetProductPerformanceQuery_ReturnsSuccess_WhenApiClient result.Data.ShouldNotBeNull(); result.Data!.Summary.TotalProducts.ShouldBe(4); - _mockApiClient.Verify(c => c.GetProductPerformance(query, It.IsAny()), Times.Once); + _mockApiClient.GetProductPerformance(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -288,7 +288,7 @@ public async Task Handle_GetProductPerformanceQuery_ReturnsFailure_WhenApiClient var query = new TransactionQueries.GetProductPerformanceQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow); _mockApiClient - .Setup(c => c.GetProductPerformance(query, It.IsAny())) + .GetProductPerformance(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -297,7 +297,7 @@ public async Task Handle_GetProductPerformanceQuery_ReturnsFailure_WhenApiClient // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetProductPerformance(query, It.IsAny()), Times.Once); + _mockApiClient.GetProductPerformance(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -313,7 +313,7 @@ public async Task Handle_GetTodaysSalesByHourQuery_ReturnsSuccess_WhenApiClientS }; _mockApiClient - .Setup(c => c.GetTodaysSalesByHour(query, It.IsAny())) + .GetTodaysSalesByHour(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -325,7 +325,7 @@ public async Task Handle_GetTodaysSalesByHourQuery_ReturnsSuccess_WhenApiClientS result.Data!.Count.ShouldBe(1); result.Data[0].Hour.ShouldBe(9); - _mockApiClient.Verify(c => c.GetTodaysSalesByHour(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysSalesByHour(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -335,7 +335,7 @@ public async Task Handle_GetTodaysSalesByHourQuery_ReturnsFailure_WhenApiClientF var query = new TransactionQueries.GetTodaysSalesByHourQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.Date); _mockApiClient - .Setup(c => c.GetTodaysSalesByHour(query, It.IsAny())) + .GetTodaysSalesByHour(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -344,7 +344,7 @@ public async Task Handle_GetTodaysSalesByHourQuery_ReturnsFailure_WhenApiClientF // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetTodaysSalesByHour(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysSalesByHour(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -357,7 +357,7 @@ public async Task Handle_GetTodaysSettlementQuery_ReturnsSuccess_WhenApiClientSu var model = new TodaysSettlementModel { TodaysSettlementValue = 500m }; _mockApiClient - .Setup(c => c.GetTodaysSettlement(query, It.IsAny())) + .GetTodaysSettlement(query, Arg.Any()) .ReturnsAsync(Result.Success(model)); // Act @@ -368,7 +368,7 @@ public async Task Handle_GetTodaysSettlementQuery_ReturnsSuccess_WhenApiClientSu result.Data.ShouldNotBeNull(); result.Data!.TodaysSettlementValue.ShouldBe(500m); - _mockApiClient.Verify(c => c.GetTodaysSettlement(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysSettlement(query, Arg.Any()).Called(Count.Once()); } [Fact] @@ -378,7 +378,7 @@ public async Task Handle_GetTodaysSettlementQuery_ReturnsFailure_WhenApiClientFa var query = new SettlementQueries.GetTodaysSettlementQuery(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.Date); _mockApiClient - .Setup(c => c.GetTodaysSettlement(query, It.IsAny())) + .GetTodaysSettlement(query, Arg.Any()) .ReturnsAsync(Result.Failure("api error")); // Act @@ -387,6 +387,6 @@ public async Task Handle_GetTodaysSettlementQuery_ReturnsFailure_WhenApiClientFa // Assert result.IsFailed.ShouldBeTrue(); - _mockApiClient.Verify(c => c.GetTodaysSettlement(query, It.IsAny()), Times.Once); + _mockApiClient.GetTodaysSettlement(query, Arg.Any()).Called(Count.Once()); } } diff --git a/EstateManagementUI.BlazorServer.Tests/Services/TestDataStoreTests.cs b/EstateManagementUI.BlazorServer.Tests/Services/TestDataStoreTests.cs index 95d837b8..7327960c 100644 --- a/EstateManagementUI.BlazorServer.Tests/Services/TestDataStoreTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Services/TestDataStoreTests.cs @@ -16,28 +16,28 @@ public void Constructor_InitializesWithDefaultData() var dataStore = new TestDataStore(); var testEstateId = new Guid("11111111-1111-1111-1111-111111111111"); var estate = dataStore.GetEstate(testEstateId); - + // Assert estate.ShouldNotBeNull(); estate.EstateName.ShouldBe("Test Estate"); } - + [Fact] public void GetEstate_WithNonExistentId_ReturnsUnknownEstate() { // Arrange var dataStore = new TestDataStore(); var nonExistentId = Guid.NewGuid(); - + // Act var estate = dataStore.GetEstate(nonExistentId); - + // Assert estate.ShouldNotBeNull(); estate.EstateName.ShouldBe("Unknown Estate"); estate.Reference.ShouldBe("Unknown"); } - + [Fact] public void SetEstate_AddsNewEstate() { @@ -50,47 +50,47 @@ public void SetEstate_AddsNewEstate() EstateName = "New Estate", Reference = "NEW001" }; - + // Act dataStore.SetEstate(estate); var result = dataStore.GetEstate(estateId); - + // Assert result.ShouldNotBeNull(); result.EstateName.ShouldBe("New Estate"); result.Reference.ShouldBe("NEW001"); } - + [Fact] public void GetMerchants_WithExistingEstate_ReturnsMerchantList() { // Arrange var dataStore = new TestDataStore(); var testEstateId = new Guid("11111111-1111-1111-1111-111111111111"); - + // Act var merchants = dataStore.GetMerchants(testEstateId); - + // Assert merchants.ShouldNotBeNull(); merchants.ShouldNotBeEmpty(); } - + [Fact] public void GetMerchants_WithNonExistentEstate_ReturnsEmptyList() { // Arrange var dataStore = new TestDataStore(); var nonExistentId = Guid.NewGuid(); - + // Act var merchants = dataStore.GetMerchants(nonExistentId); - + // Assert merchants.ShouldNotBeNull(); merchants.ShouldBeEmpty(); } - + [Fact] public void AddMerchant_AddsNewMerchant() { @@ -104,17 +104,17 @@ public void AddMerchant_AddsNewMerchant() MerchantName = "Test Merchant", MerchantReference = "MERCH001" }; - + // Act dataStore.AddMerchant(estateId, merchant); var result = dataStore.GetMerchant(estateId, merchantId); - + // Assert result.ShouldNotBeNull(); result.MerchantName.ShouldBe("Test Merchant"); result.MerchantReference.ShouldBe("MERCH001"); } - + [Fact] public void UpdateMerchant_UpdatesExistingMerchant() { @@ -129,17 +129,17 @@ public void UpdateMerchant_UpdatesExistingMerchant() MerchantReference = "ORIG001" }; dataStore.AddMerchant(estateId, merchant); - + // Act merchant.MerchantName = "Updated Name"; dataStore.UpdateMerchant(estateId, merchant); var result = dataStore.GetMerchant(estateId, merchantId); - + // Assert result.ShouldNotBeNull(); result.MerchantName.ShouldBe("Updated Name"); } - + [Fact] public void RemoveMerchant_RemovesExistingMerchant() { @@ -154,30 +154,30 @@ public void RemoveMerchant_RemovesExistingMerchant() MerchantReference = "MERCH001" }; dataStore.AddMerchant(estateId, merchant); - + // Act dataStore.RemoveMerchant(estateId, merchantId); var result = dataStore.GetMerchant(estateId, merchantId); - + // Assert result.ShouldBeNull(); } - + [Fact] public void GetOperators_WithExistingEstate_ReturnsOperatorList() { // Arrange var dataStore = new TestDataStore(); var testEstateId = new Guid("11111111-1111-1111-1111-111111111111"); - + // Act var operators = dataStore.GetOperators(testEstateId); - + // Assert operators.ShouldNotBeNull(); operators.ShouldNotBeEmpty(); } - + [Fact] public void AddOperator_AddsNewOperator() { @@ -192,17 +192,17 @@ public void AddOperator_AddsNewOperator() RequireCustomMerchantNumber = true, RequireCustomTerminalNumber = false }; - + // Act dataStore.AddOperator(estateId, operatorModel); var result = dataStore.GetOperator(estateId, operatorId); - + // Assert result.ShouldNotBeNull(); result.Name.ShouldBe("Test Operator"); result.RequireCustomMerchantNumber.ShouldBeTrue(); } - + [Fact] public void UpdateOperator_UpdatesExistingOperator() { @@ -217,19 +217,19 @@ public void UpdateOperator_UpdatesExistingOperator() RequireCustomMerchantNumber = false }; dataStore.AddOperator(estateId, operatorModel); - + // Act operatorModel.Name = "Updated Operator"; operatorModel.RequireCustomMerchantNumber = true; dataStore.UpdateOperator(estateId, operatorModel); var result = dataStore.GetOperator(estateId, operatorId); - + // Assert result.ShouldNotBeNull(); result.Name.ShouldBe("Updated Operator"); result.RequireCustomMerchantNumber.ShouldBeTrue(); } - + [Fact] public void RemoveOperator_RemovesExistingOperator() { @@ -243,30 +243,30 @@ public void RemoveOperator_RemovesExistingOperator() Name = "Test Operator" }; dataStore.AddOperator(estateId, operatorModel); - + // Act dataStore.RemoveOperator(estateId, operatorId); var result = dataStore.GetOperator(estateId, operatorId); - + // Assert result.ShouldBeNull(); } - + [Fact] public void GetContracts_WithExistingEstate_ReturnsContractList() { // Arrange var dataStore = new TestDataStore(); var testEstateId = new Guid("11111111-1111-1111-1111-111111111111"); - + // Act var contracts = dataStore.GetContracts(testEstateId); - + // Assert contracts.ShouldNotBeNull(); contracts.ShouldNotBeEmpty(); } - + [Fact] public void Reset_ClearsAllDataAndReinitializes() { @@ -279,13 +279,13 @@ public void Reset_ClearsAllDataAndReinitializes() MerchantName = "Test Merchant" }; dataStore.AddMerchant(estateId, merchant); - + // Act dataStore.Reset(); var merchants = dataStore.GetMerchants(estateId); var testEstateId = new Guid("11111111-1111-1111-1111-111111111111"); var defaultEstate = dataStore.GetEstate(testEstateId); - + // Assert merchants.ShouldBeEmpty(); defaultEstate.ShouldNotBeNull(); diff --git a/EstateManagementUI.BlazorServer.Tests/UIServices/CalendarUIServiceTests.cs b/EstateManagementUI.BlazorServer.Tests/UIServices/CalendarUIServiceTests.cs index 95fe0f58..3a985727 100644 --- a/EstateManagementUI.BlazorServer.Tests/UIServices/CalendarUIServiceTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/UIServices/CalendarUIServiceTests.cs @@ -6,7 +6,7 @@ using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.Requests; using MediatR; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using Xunit; @@ -15,13 +15,13 @@ namespace EstateManagementUI.BlazorServer.Tests.UIServices { public class CalendarUIServiceTests { - private readonly Mock _mockMediator; + private readonly IMediatorImposter _mockMediator; private readonly CalendarUIService _service; public CalendarUIServiceTests() { - _mockMediator = new Mock(); - _service = new CalendarUIService(_mockMediator.Object); + _mockMediator = new IMediatorImposter(); + _service = new CalendarUIService(_mockMediator.Instance()); } [Fact] @@ -36,7 +36,7 @@ public async Task GetComparisonDates_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); // Act @@ -49,7 +49,7 @@ public async Task GetComparisonDates_ReturnsMappedList_WhenMediatorSucceeds() result.Data[0].Description.ShouldBe("Last Week"); result.Data[1].Description.ShouldBe("Last Month"); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -57,7 +57,7 @@ public async Task GetComparisonDates_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("backend error")); // Act @@ -65,7 +65,7 @@ public async Task GetComparisonDates_ReturnsFailure_WhenMediatorFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()).Called(Count.Once()); } } -} \ No newline at end of file +} diff --git a/EstateManagementUI.BlazorServer.Tests/UIServices/ContractUIServiceTests.cs b/EstateManagementUI.BlazorServer.Tests/UIServices/ContractUIServiceTests.cs index 7eeec6e7..8f660f6b 100644 --- a/EstateManagementUI.BlazorServer.Tests/UIServices/ContractUIServiceTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/UIServices/ContractUIServiceTests.cs @@ -1,8 +1,8 @@ -using EstateManagementUI.BlazorServer.Models; +using EstateManagementUI.BlazorServer.Models; using EstateManagementUI.BlazorServer.UIServices; using EstateManagementUI.BusinessLogic.Requests; using MediatR; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using System; @@ -16,13 +16,13 @@ namespace EstateManagementUI.BlazorServer.Tests.UIServices { public class ContractUIServiceTests { - private readonly Mock _mockMediator; + private readonly IMediatorImposter _mockMediator; private readonly ContractUIService _service; public ContractUIServiceTests() { - _mockMediator = new Mock(); - _service = new ContractUIService(_mockMediator.Object); + _mockMediator = new IMediatorImposter(); + _service = new ContractUIService(_mockMediator.Instance()); } [Fact] @@ -57,7 +57,7 @@ public async Task GetContracts_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizContracts)); // Act @@ -81,7 +81,7 @@ public async Task GetContracts_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); // Act @@ -107,7 +107,7 @@ public async Task GetContract_ReturnsMappedModel_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizContract)); // Act @@ -126,7 +126,7 @@ public async Task GetContract_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("nf")); // Act @@ -152,21 +152,21 @@ public async Task AddProductToContract_SendsCommand_WithValue_WhenNotVariable() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.AddProductToContract(CorrelationIdHelper.New(), estateId, contractId, productModel); // Assert result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.ContractId == contractId && - c.ProductName == productModel.ProductName && - c.DisplayText == productModel.DisplayText && - c.Value.HasValue && c.Value.Value == productModel.Value - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).ContractId == contractId && + ((dynamic)c).ProductName == productModel.ProductName && + ((dynamic)c).DisplayText == productModel.DisplayText && + ((dynamic)c).Value == productModel.Value + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -185,21 +185,21 @@ public async Task AddProductToContract_SendsCommand_NullValue_WhenVariable() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.AddProductToContract(CorrelationIdHelper.New(), estateId, contractId, productModel); // Assert result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.ContractId == contractId && - c.ProductName == productModel.ProductName && - c.DisplayText == productModel.DisplayText && - c.Value == null - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).ContractId == contractId && + ((dynamic)c).ProductName == productModel.ProductName && + ((dynamic)c).DisplayText == productModel.DisplayText && + ((dynamic)c).Value == null + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -207,8 +207,8 @@ public async Task AddProductToContract_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); // Act var result = await _service.AddProductToContract(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), new ContractModels.AddProductModel { ProductName = "x", DisplayText = "y", IsVariableValue = false, Value = 1m }); @@ -234,23 +234,23 @@ public async Task AddTransactionFeeToProduct_SendsCorrectCommand() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.AddTransactionFeeToProduct(CorrelationIdHelper.New(), estateId, contractId, contractProductId, feeModel); // Assert result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.ContractId == contractId && - c.ProductId == contractProductId && - c.Description == feeModel.Description && - c.Value == feeModel.FeeValue.Value && - c.CalculationType == feeModel.CalculationType && - c.FeeType == feeModel.FeeType - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).ContractId == contractId && + ((dynamic)c).ProductId == contractProductId && + ((dynamic)c).Description == feeModel.Description && + ((dynamic)c).Value == feeModel.FeeValue.Value && + ((dynamic)c).CalculationType == feeModel.CalculationType && + ((dynamic)c).FeeType == feeModel.FeeType + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -258,8 +258,8 @@ public async Task AddTransactionFeeToProduct_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); // Act var result = await _service.AddTransactionFeeToProduct(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), new ContractModels.AddTransactionFeeModel { Description = "d", FeeValue = 1m, CalculationType = "c", FeeType = "f" }); @@ -278,8 +278,8 @@ public async Task RemoveTransactionFeeFromProduct_SendsCorrectCommand() var transactionFeeId = Guid.NewGuid(); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.RemoveTransactionFeeFromProduct(CorrelationIdHelper.New(), estateId, contractId, contractProductId, transactionFeeId); @@ -293,8 +293,8 @@ public async Task RemoveTransactionFeeFromProduct_ReturnsFailure_WhenMediatorFai { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); // Act var result = await _service.RemoveTransactionFeeFromProduct(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()); @@ -316,19 +316,19 @@ public async Task CreateContract_SendsCreateCommand_WithParsedOperatorId() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); - + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); + // Act var result = await _service.CreateContract(CorrelationIdHelper.New(), estateId, createModel); // Assert result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.Description == createModel.Description && - c.OperatorId == operatorId - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).Description == createModel.Description && + ((dynamic)c).OperatorId == operatorId + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -336,8 +336,8 @@ public async Task CreateContract_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); // Act var result = await _service.CreateContract(CorrelationIdHelper.New(), Guid.NewGuid(), new ContractModels.CreateContractFormModel { Description = "x", OperatorId = Guid.NewGuid().ToString() }); @@ -360,7 +360,7 @@ public async Task GetContractsForDropDown_ReturnsMappedList_WhenMediatorSucceeds }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); // Act @@ -374,9 +374,7 @@ public async Task GetContractsForDropDown_ReturnsMappedList_WhenMediatorSucceeds result.Data[0].Description.ShouldBe("Contract A"); result.Data[0].OperatorName.ShouldBe("Op A"); - _mockMediator.Verify(m => - m.Send(It.Is(q => q.EstateId == estateId), It.IsAny()), - Times.Once); + _mockMediator.Send>>(Arg>>>.Is(q => ((dynamic)q).EstateId == estateId), Arg.Any()).Called(Count.Once()); } [Fact] @@ -384,7 +382,7 @@ public async Task GetContractsForDropDown_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("backend error")); // Act @@ -392,7 +390,7 @@ public async Task GetContractsForDropDown_ReturnsFailure_WhenMediatorFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()).Called(Count.Once()); } } -} \ No newline at end of file +} diff --git a/EstateManagementUI.BlazorServer.Tests/UIServices/EstateUIServiceTests.cs b/EstateManagementUI.BlazorServer.Tests/UIServices/EstateUIServiceTests.cs index 69ae6e3b..d63d027d 100644 --- a/EstateManagementUI.BlazorServer.Tests/UIServices/EstateUIServiceTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/UIServices/EstateUIServiceTests.cs @@ -6,7 +6,7 @@ using EstateManagementUI.BlazorServer.UIServices; using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using Xunit; @@ -16,13 +16,13 @@ namespace EstateManagementUI.BlazorServer.Tests.UIServices { public class EstateUIServiceTests { - private readonly Mock _mockMediator; + private readonly IMediatorImposter _mockMediator; private readonly EstateUIService _service; public EstateUIServiceTests() { - _mockMediator = new Mock(); - _service = new EstateUIService(_mockMediator.Object); + _mockMediator = new IMediatorImposter(); + _service = new EstateUIService(_mockMediator.Instance()); } [Fact] @@ -64,15 +64,15 @@ public async Task LoadEstate_ReturnsMappedModel_WhenAllQueriesSucceed() new() { OperatorId = assignedOperators[0].OperatorId, OperatorName = "OpAssigned" } }; - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizEstate)); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(recentMerchants)); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(recentContracts)); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(assignedOperators)); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(allOperators)); // Act @@ -101,17 +101,17 @@ public async Task LoadEstate_ReturnsFailure_WhenEstateQueryFails() var estateId = Guid.NewGuid(); var correlationId = CorrelationIdHelper.New(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("estate fail")); // Provide success for other queries so the service behaviour is isolated - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); // Act @@ -128,15 +128,15 @@ public async Task LoadEstate_ReturnsFailure_WhenRecentMerchantQueryFails() var estateId = Guid.NewGuid(); var correlationId = CorrelationIdHelper.New(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); // Act @@ -153,15 +153,15 @@ public async Task LoadEstate_ReturnsFailure_WhenRecentContractsQueryFails() var estateId = Guid.NewGuid(); var correlationId = CorrelationIdHelper.New(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new EstateModels.EstateModel())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); // Act @@ -178,15 +178,15 @@ public async Task LoadEstate_ReturnsFailure_WhenGetAssignedOperatorsQueryFails() var estateId = Guid.NewGuid(); var correlationId = CorrelationIdHelper.New(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new EstateModels.EstateModel())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); // Act @@ -203,15 +203,15 @@ public async Task LoadEstate_ReturnsFailure_WhenGetOperatorsForDropDownQueryFail var estateId = Guid.NewGuid(); var correlationId = CorrelationIdHelper.New(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new EstateModels.EstateModel())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); // Act @@ -230,16 +230,16 @@ public async Task AddOperatorToEstate_CallsMediatorWithAddCommand_OnSuccess() var operatorId = Guid.NewGuid(); var operatorIdString = operatorId.ToString(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + _mockMediator.Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.AddOperatorToEstate(correlationId, estateId, operatorIdString); // Assert result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && c.OperatorId == operatorId), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && ((dynamic)c).OperatorId == operatorId), Arg.Any()).Called(Count.Once()); } [Fact] @@ -250,8 +250,8 @@ public async Task AddOperatorToEstate_ReturnsFailure_WhenMediatorFails() var correlationId = CorrelationIdHelper.New(); var operatorId = Guid.NewGuid(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + _mockMediator.Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); // Act var result = await _service.AddOperatorToEstate(correlationId, estateId, operatorId.ToString()); @@ -268,16 +268,16 @@ public async Task RemoveOperatorFromEstate_ShouldCallRemoveCommand() var correlationId = CorrelationIdHelper.New(); var operatorId = Guid.NewGuid(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + _mockMediator.Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.RemoveOperatorFromEstate(correlationId, estateId, operatorId); // Assert - the service should send a RemoveOperatorFromEstateCommand result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && c.OperatorId == operatorId), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && ((dynamic)c).OperatorId == operatorId), Arg.Any()).Called(Count.Once()); } @@ -289,8 +289,8 @@ public async Task RemoveOperatorFromEstate_ReturnsFailure_WhenMediatorFails() var correlationId = CorrelationIdHelper.New(); var operatorId = Guid.NewGuid(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + _mockMediator.Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); // Act var result = await _service.RemoveOperatorFromEstate(correlationId, estateId, operatorId); @@ -299,4 +299,4 @@ public async Task RemoveOperatorFromEstate_ReturnsFailure_WhenMediatorFails() result.IsFailed.ShouldBeTrue(); } } -} \ No newline at end of file +} diff --git a/EstateManagementUI.BlazorServer.Tests/UIServices/MerchantUIServiceTests.cs b/EstateManagementUI.BlazorServer.Tests/UIServices/MerchantUIServiceTests.cs index efa4eda2..1c3f0d98 100644 --- a/EstateManagementUI.BlazorServer.Tests/UIServices/MerchantUIServiceTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/UIServices/MerchantUIServiceTests.cs @@ -1,11 +1,11 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using EstateManagementUI.BlazorServer.UIServices; using EstateManagementUI.BusinessLogic.Requests; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; using Xunit; @@ -15,13 +15,13 @@ namespace EstateManagementUI.BlazorServer.Tests.UIServices { public class MerchantUIServiceTests { - private readonly Mock _mockMediator; + private readonly IMediatorImposter _mockMediator; private readonly MerchantUIService _service; public MerchantUIServiceTests() { - _mockMediator = new Mock(); - _service = new MerchantUIService(_mockMediator.Object); + _mockMediator = new IMediatorImposter(); + _service = new MerchantUIService(_mockMediator.Instance()); } [Fact] @@ -50,7 +50,7 @@ public async Task GetMerchant_ReturnsMappedModel_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(biz)); // Act @@ -73,7 +73,7 @@ public async Task GetMerchant_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); // Act @@ -94,7 +94,7 @@ public async Task GetMerchants_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); // Act @@ -111,7 +111,7 @@ public async Task GetMerchants_ReturnsMappedList_WhenMediatorSucceeds() public async Task GetMerchants_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchants(CorrelationIdHelper.New(), Guid.NewGuid(), "", "", null, "", ""); @@ -130,7 +130,7 @@ public async Task GetMerchantOperators_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); var result = await _service.GetMerchantOperators(CorrelationIdHelper.New(), estateId, merchantId); @@ -144,7 +144,7 @@ public async Task GetMerchantOperators_ReturnsMappedList_WhenMediatorSucceeds() public async Task GetMerchantOperators_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchantOperators(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); @@ -164,7 +164,7 @@ public async Task GetMerchantContracts_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); var result = await _service.GetMerchantContracts(CorrelationIdHelper.New(), estateId, merchantId); @@ -178,7 +178,7 @@ public async Task GetMerchantContracts_ReturnsMappedList_WhenMediatorSucceeds() public async Task GetMerchantContracts_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchantContracts(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); @@ -197,7 +197,7 @@ public async Task GetMerchantDevices_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); var result = await _service.GetMerchantDevices(CorrelationIdHelper.New(), estateId, merchantId); @@ -211,7 +211,7 @@ public async Task GetMerchantDevices_ReturnsMappedList_WhenMediatorSucceeds() public async Task GetMerchantDevices_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchantDevices(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid()); @@ -238,33 +238,33 @@ public async Task CreateMerchant_SendsCreateCommand_AndReturnsSuccess() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); var result = await _service.CreateMerchant(CorrelationIdHelper.New(), estateId, Guid.NewGuid(), createModel); result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.Name == createModel.MerchantName && - c.SettlementSchedule == createModel.SettlementSchedule && - c.MerchantAddress.AddressLine1 == createModel.AddressLine1 && - c.MerchantAddress.Town == createModel.Town && - c.MerchantAddress.Region == createModel.Region && - c.MerchantAddress.PostalCode == createModel.PostCode && - c.MerchantAddress.Country == createModel.Country && - c.MerchantContact.ContactName == createModel.ContactName && - c.MerchantContact.ContactEmail == createModel.EmailAddress && - c.MerchantContact.ContactPhone == createModel.PhoneNumber - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).Name == createModel.MerchantName && + ((dynamic)c).SettlementSchedule == createModel.SettlementSchedule && + ((dynamic)c).MerchantAddress.AddressLine1 == createModel.AddressLine1 && + ((dynamic)c).MerchantAddress.Town == createModel.Town && + ((dynamic)c).MerchantAddress.Region == createModel.Region && + ((dynamic)c).MerchantAddress.PostalCode == createModel.PostCode && + ((dynamic)c).MerchantAddress.Country == createModel.Country && + ((dynamic)c).MerchantContact.ContactName == createModel.ContactName && + ((dynamic)c).MerchantContact.ContactEmail == createModel.EmailAddress && + ((dynamic)c).MerchantContact.ContactPhone == createModel.PhoneNumber + ), Arg.Any()).Called(Count.Once()); } [Fact] public async Task CreateMerchant_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); var result = await _service.CreateMerchant(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), new BlazorServer.Models.MerchantModels.CreateMerchantModel { MerchantName = "x", SettlementSchedule = "s" }); @@ -296,30 +296,30 @@ public async Task UpdateMerchant_SendsUpdateCommand_AndReturnsSuccess() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); var result = await _service.UpdateMerchant(CorrelationIdHelper.New(), estateId, merchantId, editModel); result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.MerchantId == merchantId && - c.Name == editModel.MerchantName && - c.SettlementSchedule == editModel.SettlementSchedule && - c.MerchantAddress.AddressId == addressId && - c.MerchantAddress.AddressLine1 == editModel.AddressLine1 && - c.MerchantContact.ContactId == contactId && - c.MerchantContact.ContactName == editModel.ContactName - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).MerchantId == merchantId && + ((dynamic)c).Name == editModel.MerchantName && + ((dynamic)c).SettlementSchedule == editModel.SettlementSchedule && + ((dynamic)c).MerchantAddress.AddressId == addressId && + ((dynamic)c).MerchantAddress.AddressLine1 == editModel.AddressLine1 && + ((dynamic)c).MerchantContact.ContactId == contactId && + ((dynamic)c).MerchantContact.ContactName == editModel.ContactName + ), Arg.Any()).Called(Count.Once()); } [Fact] public async Task UpdateMerchant_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); var result = await _service.UpdateMerchant(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), new BlazorServer.Models.MerchantModels.MerchantEditModel { MerchantName = "x", SettlementSchedule = "s" }); @@ -343,28 +343,28 @@ public async Task UpdateMerchantOpeningHours_SendsUpdateCommand_AndReturnsSucces }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); var result = await _service.UpdateMerchantOpeningHours(CorrelationIdHelper.New(), estateId, merchantId, openingHours); result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.MerchantId == merchantId && - c.OpeningHours.Sunday.Opening == "0800" && - c.OpeningHours.Sunday.Closing == "1800" && - c.OpeningHours.Saturday.Opening == "0900" && - c.OpeningHours.Saturday.Closing == "1600" - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).MerchantId == merchantId && + ((dynamic)c).OpeningHours.Sunday.Opening == "0800" && + ((dynamic)c).OpeningHours.Sunday.Closing == "1800" && + ((dynamic)c).OpeningHours.Saturday.Opening == "0900" && + ((dynamic)c).OpeningHours.Saturday.Closing == "1600" + ), Arg.Any()).Called(Count.Once()); } [Fact] public async Task UpdateMerchantOpeningHours_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); var result = await _service.UpdateMerchantOpeningHours(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), new BlazorServer.Models.MerchantModels.MerchantOpeningHoursModel()); @@ -378,8 +378,8 @@ public async Task AddAndRemoveOperatorToMerchant_SendCorrectCommands() var merchantId = Guid.NewGuid(); var operatorId = Guid.NewGuid(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); + _mockMediator.Send(Arg>.Any(), Arg.Any()).ReturnsAsync(Result.Success()); + _mockMediator.Send(Arg>.Any(), Arg.Any()).ReturnsAsync(Result.Success()); var addResult = await _service.AddOperatorToMerchant(CorrelationIdHelper.New(), estateId, merchantId, operatorId, "MN", "TN"); var removeResult = await _service.RemoveOperatorFromMerchant(CorrelationIdHelper.New(), estateId, merchantId, operatorId); @@ -387,19 +387,21 @@ public async Task AddAndRemoveOperatorToMerchant_SendCorrectCommands() addResult.IsSuccess.ShouldBeTrue(); removeResult.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.MerchantId == merchantId && - c.OperatorId == operatorId && - c.MerchantNumber == "MN" && - c.TerminalNumber == "TN" - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + c is MerchantCommands.AddOperatorToMerchantCommand addOperatorCommand && + addOperatorCommand.EstateId == estateId && + addOperatorCommand.MerchantId == merchantId && + addOperatorCommand.OperatorId == operatorId && + addOperatorCommand.MerchantNumber == "MN" && + addOperatorCommand.TerminalNumber == "TN" + ), Arg.Any()).Called(Count.Once()); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.MerchantId == merchantId && - c.OperatorId == operatorId - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + c is MerchantCommands.RemoveOperatorFromMerchantCommand removeOperatorCommand && + removeOperatorCommand.EstateId == estateId && + removeOperatorCommand.MerchantId == merchantId && + removeOperatorCommand.OperatorId == operatorId + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -409,8 +411,8 @@ public async Task AssignAndRemoveContractFromMerchant_SendCorrectCommands() var merchantId = Guid.NewGuid(); var contractId = Guid.NewGuid(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); + _mockMediator.Send(Arg>.Any(), Arg.Any()).ReturnsAsync(Result.Success()); + _mockMediator.Send(Arg>.Any(), Arg.Any()).ReturnsAsync(Result.Success()); var assign = await _service.AssignContractToMerchant(CorrelationIdHelper.New(), estateId, merchantId, contractId); var remove = await _service.RemoveContractFromMerchant(CorrelationIdHelper.New(), estateId, merchantId, contractId); @@ -418,13 +420,15 @@ public async Task AssignAndRemoveContractFromMerchant_SendCorrectCommands() assign.IsSuccess.ShouldBeTrue(); remove.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && c.MerchantId == merchantId && c.ContractId == contractId - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + c is MerchantCommands.AssignContractToMerchantCommand assignCommand && + assignCommand.EstateId == estateId && assignCommand.MerchantId == merchantId && assignCommand.ContractId == contractId + ), Arg.Any()).Called(Count.Once()); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && c.MerchantId == merchantId && c.ContractId == contractId - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + c is MerchantCommands.RemoveContractFromMerchantCommand removeCommand && + removeCommand.EstateId == estateId && removeCommand.MerchantId == merchantId && removeCommand.ContractId == contractId + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -433,9 +437,9 @@ public async Task AddSwapDeviceAndMakeDeposit_SendCorrectCommands() var estateId = Guid.NewGuid(); var merchantId = Guid.NewGuid(); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); - _mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success); + _mockMediator.Send(Arg>.Any(), Arg.Any()).ReturnsAsync(Result.Success()); + _mockMediator.Send(Arg>.Any(), Arg.Any()).ReturnsAsync(Result.Success()); + _mockMediator.Send(Arg>.Any(), Arg.Any()).ReturnsAsync(Result.Success()); var addDevice = await _service.AddMerchantDevice(CorrelationIdHelper.New(), estateId, merchantId, "dev1"); var swapDevice = await _service.SwapMerchantDevice(CorrelationIdHelper.New(), estateId, merchantId, "old", "new"); @@ -446,17 +450,20 @@ public async Task AddSwapDeviceAndMakeDeposit_SendCorrectCommands() swapDevice.IsSuccess.ShouldBeTrue(); deposit.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && c.MerchantId == merchantId && c.DeviceIdentifier == "dev1" - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + c is MerchantCommands.AddMerchantDeviceCommand addDeviceCommand && + addDeviceCommand.EstateId == estateId && addDeviceCommand.MerchantId == merchantId && addDeviceCommand.DeviceIdentifier == "dev1" + ), Arg.Any()).Called(Count.Once()); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && c.MerchantId == merchantId && c.OldDevice == "old" && c.NewDevice == "new" - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + c is MerchantCommands.SwapMerchantDeviceCommand swapDeviceCommand && + swapDeviceCommand.EstateId == estateId && swapDeviceCommand.MerchantId == merchantId && swapDeviceCommand.OldDevice == "old" && swapDeviceCommand.NewDevice == "new" + ), Arg.Any()).Called(Count.Once()); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && c.MerchantId == merchantId && c.Amount == depositModel.Amount && c.Reference == depositModel.Reference - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + c is MerchantCommands.MakeMerchantDepositCommand depositCommand && + depositCommand.EstateId == estateId && depositCommand.MerchantId == merchantId && depositCommand.Amount == depositModel.Amount && depositCommand.Reference == depositModel.Reference + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -469,7 +476,7 @@ public async Task GetRecentMerchants_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); var result = await _service.GetRecentMerchants(CorrelationIdHelper.New(), estateId); @@ -485,7 +492,7 @@ public async Task GetRecentMerchants_ReturnsMappedList_WhenMediatorSucceeds() public async Task GetRecentMerchants_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetRecentMerchants(CorrelationIdHelper.New(), Guid.NewGuid()); @@ -505,7 +512,7 @@ public async Task GetMerchantKpis_ReturnsMappedModel_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizKpi)); var result = await _service.GetMerchantKpis(CorrelationIdHelper.New(), estateId); @@ -520,7 +527,7 @@ public async Task GetMerchantKpis_ReturnsMappedModel_WhenMediatorSucceeds() public async Task GetMerchantKpis_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchantKpis(CorrelationIdHelper.New(), Guid.NewGuid()); @@ -538,7 +545,7 @@ public async Task GetMerchantsForDropDown_ReturnsMappedList_WhenMediatorSucceeds }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); var result = await _service.GetMerchantsForDropDown(CorrelationIdHelper.New(), estateId); @@ -553,7 +560,7 @@ public async Task GetMerchantsForDropDown_ReturnsMappedList_WhenMediatorSucceeds public async Task GetMerchantsForDropDown_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchantsForDropDown(CorrelationIdHelper.New(), Guid.NewGuid()); @@ -577,7 +584,7 @@ public async Task GetMerchantSchedule_ReturnsMappedModel_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(businessLogicSchedule)); var result = await _service.GetMerchantSchedule(CorrelationIdHelper.New(), estateId, merchantId, year); @@ -594,7 +601,7 @@ public async Task GetMerchantSchedule_ReturnsMappedModel_WhenMediatorSucceeds() public async Task GetMerchantSchedule_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchantSchedule(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), DateTime.Today.Year); @@ -617,16 +624,16 @@ public async Task SaveMerchantSchedule_NewSchedule_SendsCreateCommand_AndReturns } }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound()); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); var result = await _service.SaveMerchantSchedule(CorrelationIdHelper.New(), estateId, merchantId, schedule); result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -655,16 +662,16 @@ public async Task SaveMerchantSchedule_ExistingSchedule_SendsUpdateCommand_AndRe }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(businessLogicSchedule)); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); var result = await _service.SaveMerchantSchedule(CorrelationIdHelper.New(), estateId, merchantId, schedule); result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -672,10 +679,10 @@ public async Task SaveMerchantSchedule_NewSchedule_ReturnsFailure_WhenMediatorFa { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.NotFound()); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.SaveMerchantSchedule(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), new BlazorServer.Models.MerchantModels.MerchantScheduleModel @@ -701,10 +708,10 @@ public async Task SaveMerchantSchedule_ExistingSchedule_ReturnsFailure_WhenMedia }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(businessLogicSchedule)); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.SaveMerchantSchedule(CorrelationIdHelper.New(), Guid.NewGuid(), Guid.NewGuid(), new BlazorServer.Models.MerchantModels.MerchantScheduleModel @@ -724,13 +731,13 @@ public async Task AddOperatorToMerchant_ReturnsFailure_WhenMediatorFails() var operatorId = Guid.NewGuid(); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.AddOperatorToMerchant(CorrelationIdHelper.New(), estateId, merchantId, operatorId, "MN", "TN"); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -741,13 +748,13 @@ public async Task RemoveOperatorFromMerchant_ReturnsFailure_WhenMediatorFails() var operatorId = Guid.NewGuid(); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.RemoveOperatorFromMerchant(CorrelationIdHelper.New(), estateId, merchantId, operatorId); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -758,13 +765,13 @@ public async Task AssignContractToMerchant_ReturnsFailure_WhenMediatorFails() var contractId = Guid.NewGuid(); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.AssignContractToMerchant(CorrelationIdHelper.New(), estateId, merchantId, contractId); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -775,13 +782,13 @@ public async Task RemoveContractFromMerchant_ReturnsFailure_WhenMediatorFails() var contractId = Guid.NewGuid(); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.RemoveContractFromMerchant(CorrelationIdHelper.New(), estateId, merchantId, contractId); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -792,13 +799,13 @@ public async Task AddMerchantDevice_ReturnsFailure_WhenMediatorFails() var deviceId = "device-123"; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.AddMerchantDevice(CorrelationIdHelper.New(), estateId, merchantId, deviceId); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -808,13 +815,13 @@ public async Task SwapMerchantDevice_ReturnsFailure_WhenMediatorFails() var merchantId = Guid.NewGuid(); _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.SwapMerchantDevice(CorrelationIdHelper.New(), estateId, merchantId, "old", "new"); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] @@ -825,13 +832,13 @@ public async Task MakeMerchantDeposit_ReturnsFailure_WhenMediatorFails() var deposit = new BlazorServer.Models.MerchantModels.DepositModel { Amount = 10, Date = DateTime.UtcNow, Reference = "ref" }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send(Arg>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.MakeMerchantDeposit(CorrelationIdHelper.New(), estateId, merchantId, deposit); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Any(), Arg.Any()).Called(Count.Once()); } } } diff --git a/EstateManagementUI.BlazorServer.Tests/UIServices/OperatorUIServiceTests.cs b/EstateManagementUI.BlazorServer.Tests/UIServices/OperatorUIServiceTests.cs index 88692105..1d098c40 100644 --- a/EstateManagementUI.BlazorServer.Tests/UIServices/OperatorUIServiceTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/UIServices/OperatorUIServiceTests.cs @@ -1,21 +1,21 @@ - using EstateManagementUI.BlazorServer.UIServices; + using EstateManagementUI.BlazorServer.UIServices; using EstateManagementUI.BusinessLogic.Requests; using MediatR; - using Moq; + using Imposter.Abstractions; using Shouldly; using SimpleResults; - + namespace EstateManagementUI.BlazorServer.Tests.UIServices; public class OperatorUIServiceTests { - private readonly Mock _mockMediator; + private readonly IMediatorImposter _mockMediator; private readonly OperatorUIService _service; public OperatorUIServiceTests() { - _mockMediator = new Mock(); - _service = new OperatorUIService(_mockMediator.Object); + _mockMediator = new IMediatorImposter(); + _service = new OperatorUIService(_mockMediator.Instance()); } [Fact] @@ -31,7 +31,7 @@ public async Task GetOperators_ReturnsMappedList_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizOperators)); // Act @@ -53,7 +53,7 @@ public async Task GetOperators_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("failure")); // Act @@ -80,7 +80,7 @@ public async Task GetOperator_ReturnsMappedModel_WhenMediatorSucceeds() }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizOperator)); // Act @@ -100,7 +100,7 @@ public async Task GetOperator_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("not found")); // Act @@ -126,21 +126,21 @@ public async Task UpdateOperator_CallsMediatorWithCorrectCommand_AndReturnsResul }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.UpdateOperator(correlationId, estateId, operatorId, editModel); // Assert result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.OperatorId == operatorId && - c.Name == editModel.OperatorName && - c.RequireCustomMerchantNumber == editModel.RequireCustomMerchantNumber && - c.RequireCustomTerminalNumber == editModel.RequireCustomTerminalNumber - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).OperatorId == operatorId && + ((dynamic)c).Name == editModel.OperatorName && + ((dynamic)c).RequireCustomMerchantNumber == editModel.RequireCustomMerchantNumber && + ((dynamic)c).RequireCustomTerminalNumber == editModel.RequireCustomTerminalNumber + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -158,20 +158,20 @@ public async Task CreateOperator_CallsMediatorWithCorrectCommand_AndReturnsResul }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Success()); // Act var result = await _service.CreateOperator(correlationId, estateId, createModel); // Assert result.IsSuccess.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.Is(c => - c.EstateId == estateId && - c.Name == createModel.OperatorName && - c.RequireCustomMerchantNumber == createModel.RequireCustomMerchantNumber && - c.RequireCustomTerminalNumber == createModel.RequireCustomTerminalNumber - ), It.IsAny()), Times.Once); + _mockMediator.Send(Arg>.Is(c => + ((dynamic)c).EstateId == estateId && + ((dynamic)c).Name == createModel.OperatorName && + ((dynamic)c).RequireCustomMerchantNumber == createModel.RequireCustomMerchantNumber && + ((dynamic)c).RequireCustomTerminalNumber == createModel.RequireCustomTerminalNumber + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -179,8 +179,8 @@ public async Task CreateOperator_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Failure); + .Send(Arg>.Any(), Arg.Any()) + .ReturnsAsync(Result.Failure()); // Act var result = await _service.CreateOperator(CorrelationIdHelper.New(), Guid.NewGuid(), new EstateManagementUI.BlazorServer.Models.OperatorModels.CreateOperatorModel { OperatorName = "x" }); @@ -200,7 +200,7 @@ public async Task GetOperatorsForDropDown_ReturnsMappedList_WhenMediatorSucceeds }; _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); // Act @@ -212,9 +212,8 @@ public async Task GetOperatorsForDropDown_ReturnsMappedList_WhenMediatorSucceeds result.Data!.Count.ShouldBe(1); result.Data[0].OperatorName.ShouldBe("Op1"); - _mockMediator.Verify(m => - m.Send(It.Is(q => q.EstateId == estateId), - It.IsAny()), Times.Once); + _mockMediator.Send>>(Arg>>>.Is(q => ((dynamic)q).EstateId == estateId), + Arg.Any()).Called(Count.Once()); } [Fact] @@ -222,7 +221,7 @@ public async Task GetOperatorsForDropDown_ReturnsFailure_WhenMediatorFails() { // Arrange _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("backend error")); // Act @@ -230,6 +229,6 @@ public async Task GetOperatorsForDropDown_ReturnsFailure_WhenMediatorFails() // Assert result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()).Called(Count.Once()); } -} \ No newline at end of file +} diff --git a/EstateManagementUI.BlazorServer.Tests/UIServices/TransactionUIServiceTests.cs b/EstateManagementUI.BlazorServer.Tests/UIServices/TransactionUIServiceTests.cs index 4e99c0c7..3e628a83 100644 --- a/EstateManagementUI.BlazorServer.Tests/UIServices/TransactionUIServiceTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/UIServices/TransactionUIServiceTests.cs @@ -1,8 +1,8 @@ -using EstateManagementUI.BlazorServer.UIServices; +using EstateManagementUI.BlazorServer.UIServices; using EstateManagementUI.BusinessLogic.Models; using EstateManagementUI.BusinessLogic.Requests; using MediatR; -using Moq; +using Imposter.Abstractions; using Shouldly; using SimpleResults; @@ -10,13 +10,13 @@ namespace EstateManagementUI.BlazorServer.Tests.UIServices; public class TransactionUIServiceTests { - private readonly Mock _mockMediator; + private readonly IMediatorImposter _mockMediator; private readonly TransactionUIService _service; public TransactionUIServiceTests() { - this._mockMediator = new Mock(); - this._service = new TransactionUIService(this._mockMediator.Object); + this._mockMediator = new IMediatorImposter(); + this._service = new TransactionUIService(this._mockMediator.Instance()); } [Fact] @@ -32,7 +32,10 @@ public async Task GetTodaysSales_CallsMediatorWithCorrectQuery_AndReturnsSuccess }; this._mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Is(query => + query is TransactionQueries.GetTodaysSalesQuery todaysSalesQuery && + todaysSalesQuery.EstateId == estateId && todaysSalesQuery.ComparisonDate.Date == comparisonDate.Date + ), Arg.Any()) .ReturnsAsync(Result.Success(biz)); var result = await this._service.GetTodaysSales(CorrelationIdHelper.New(), estateId, comparisonDate); @@ -40,17 +43,17 @@ public async Task GetTodaysSales_CallsMediatorWithCorrectQuery_AndReturnsSuccess result.IsSuccess.ShouldBeTrue(); result.Data!.TodaysSalesCount.ShouldBe(10); - this._mockMediator.Verify(m => - m.Send(It.Is(q => - q.EstateId == estateId && q.ComparisonDate.Date == comparisonDate.Date - ), It.IsAny()), Times.Once); + this._mockMediator.Send>(Arg>>.Is(query => + query is TransactionQueries.GetTodaysSalesQuery todaysSalesQuery && + todaysSalesQuery.EstateId == estateId && todaysSalesQuery.ComparisonDate.Date == comparisonDate.Date + ), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetTodaysSales_ReturnsFailure_WhenMediatorFails() { this._mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await this._service.GetTodaysSales(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow); @@ -72,16 +75,15 @@ public async Task GetTodaysFailedSales_PassesResponseCodeAndReturnsSuccess() }; this._mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(biz)); var result = await this._service.GetTodaysFailedSales(CorrelationIdHelper.New(), estateId, responseCode, comparisonDate); result.IsSuccess.ShouldBeTrue(); - this._mockMediator.Verify(m => - m.Send(It.Is(q => - q.EstateId == estateId && q.ResponseCode == responseCode && q.ComparisonDate.Date == comparisonDate.Date - ), It.IsAny()), Times.Once); + this._mockMediator.Send>(Arg>>.Is(q => + ((dynamic)q).EstateId == estateId && ((dynamic)q).ResponseCode == responseCode && ((dynamic)q).ComparisonDate.Date == comparisonDate.Date + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -96,7 +98,7 @@ public async Task GetTodaysSalesByHour_ReturnsListAndVerifiesQuery() }; this._mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizList)); var result = await this._service.GetTodaysSalesByHour(CorrelationIdHelper.New(), estateId, comparisonDate); @@ -104,10 +106,9 @@ public async Task GetTodaysSalesByHour_ReturnsListAndVerifiesQuery() result.IsSuccess.ShouldBeTrue(); result.Data!.Count.ShouldBe(1); - this._mockMediator.Verify(m => - m.Send(It.Is(q => - q.EstateId == estateId && q.ComparisonDate.Date == comparisonDate.Date - ), It.IsAny()), Times.Once); + this._mockMediator.Send>>(Arg>>>.Is(q => + ((dynamic)q).EstateId == estateId && ((dynamic)q).ComparisonDate.Date == comparisonDate.Date + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -122,7 +123,7 @@ public async Task GetTodaysSettlement_ReturnsMappedModel() }; this._mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(biz)); var result = await this._service.GetTodaysSettlement(CorrelationIdHelper.New(), estateId, comparisonDate); @@ -145,16 +146,15 @@ public async Task GetProductPerformance_PassesDateRange_AndReturnsSuccess() }; this._mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(biz)); var result = await this._service.GetProductPerformance(CorrelationIdHelper.New(), estateId, start, end); result.IsSuccess.ShouldBeTrue(); - this._mockMediator.Verify(m => - m.Send(It.Is(q => - q.EstateId == estateId && q.StartDate == start && q.EndDate == end - ), It.IsAny()), Times.Once); + this._mockMediator.Send>(Arg>>.Is(q => + ((dynamic)q).EstateId == estateId && ((dynamic)q).StartDate == start && ((dynamic)q).EndDate == end + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -171,7 +171,7 @@ public async Task GetTransactionDetail_AllowsNullAndNonNullFilters() }; this._mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(biz)); // Null filters @@ -186,10 +186,9 @@ public async Task GetTransactionDetail_AllowsNullAndNonNullFilters() var result = await this._service.GetTransactionDetail(CorrelationIdHelper.New(), estateId, start, end, merchantIds, operatorIds, productIds); result.IsSuccess.ShouldBeTrue(); - this._mockMediator.Verify(m => - m.Send(It.Is(q => - q.EstateId == estateId && q.MerchantIds == merchantIds && q.OperatorIds == operatorIds && q.ProductIds == productIds - ), It.IsAny()), Times.Once); + this._mockMediator.Send>(Arg>>.Is(q => + ((dynamic)q).EstateId == estateId && ((dynamic)q).MerchantIds == merchantIds && ((dynamic)q).OperatorIds == operatorIds && ((dynamic)q).ProductIds == productIds + ), Arg.Any()).Called(Count.Once()); } [Fact] @@ -211,10 +210,10 @@ public async Task GetMerchantTransactionSummary_And_GetOperatorTransactionSummar Operators = new() }; - this._mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + this._mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizMerchant)); - this._mockMediator.Setup(m => m.Send(It.IsAny(), It.IsAny())) + this._mockMediator.Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Success(bizOperator)); var merchantResult = await this._service.GetMerchantTransactionSummary(CorrelationIdHelper.New(), estateId, start, end, 5, 6); @@ -223,103 +222,103 @@ public async Task GetMerchantTransactionSummary_And_GetOperatorTransactionSummar var operatorResult = await this._service.GetOperatorTransactionSummary(CorrelationIdHelper.New(), estateId, start, end, 7, 8); operatorResult.IsSuccess.ShouldBeTrue(); - this._mockMediator.Verify(m => m.Send(It.Is(q => - q.EstateId == estateId && q.MerchantId == 5 && q.OperatorId == 6 - ), It.IsAny()), Times.Once); + this._mockMediator.Send>(Arg>>.Is(q => + ((dynamic)q).EstateId == estateId && ((dynamic)q).MerchantId == 5 && ((dynamic)q).OperatorId == 6 + ), Arg.Any()).Called(Count.Once()); - this._mockMediator.Verify(m => m.Send(It.Is(q => - q.EstateId == estateId && q.MerchantId == 7 && q.OperatorId == 8 - ), It.IsAny()), Times.Once); + this._mockMediator.Send>(Arg>>.Is(q => + ((dynamic)q).EstateId == estateId && ((dynamic)q).MerchantId == 7 && ((dynamic)q).OperatorId == 8 + ), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetTodaysFailedSales_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetTodaysFailedSales(CorrelationIdHelper.New(), Guid.NewGuid(), "RC", DateTime.UtcNow); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>(Arg>>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetTodaysSalesByHour_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>>(Arg>>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetTodaysSalesByHour(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>>(Arg>>>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetTodaysSettlement_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetTodaysSettlement(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>(Arg>>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetProductPerformance_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetProductPerformance(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>(Arg>>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetTransactionDetail_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetTransactionDetail(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow, null, null, null); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>(Arg>>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetMerchantTransactionSummary_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetMerchantTransactionSummary(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow, null, null); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>(Arg>>.Any(), Arg.Any()).Called(Count.Once()); } [Fact] public async Task GetOperatorTransactionSummary_ReturnsFailure_WhenMediatorFails() { _mockMediator - .Setup(m => m.Send(It.IsAny(), It.IsAny())) + .Send>(Arg>>.Any(), Arg.Any()) .ReturnsAsync(Result.Failure("err")); var result = await _service.GetOperatorTransactionSummary(CorrelationIdHelper.New(), Guid.NewGuid(), DateTime.UtcNow.AddDays(-7), DateTime.UtcNow, null, null); result.IsFailed.ShouldBeTrue(); - _mockMediator.Verify(m => m.Send(It.IsAny(), It.IsAny()), Times.Once); + _mockMediator.Send>(Arg>>.Any(), Arg.Any()).Called(Count.Once()); } -} \ No newline at end of file +} diff --git a/EstateManagementUI.BlazorServer/UIServices/TransactionUIService.cs b/EstateManagementUI.BlazorServer/UIServices/TransactionUIService.cs index 2637fddf..ebe58fb7 100644 --- a/EstateManagementUI.BlazorServer/UIServices/TransactionUIService.cs +++ b/EstateManagementUI.BlazorServer/UIServices/TransactionUIService.cs @@ -22,14 +22,14 @@ public interface ITransactionUIService { DateTime startDate, DateTime endDate, Int32? merchant, - Int32? @operator); + Int32? operatorId); Task> GetOperatorTransactionSummary(CorrelationId correlationId, Guid estateId, DateTime startDate, DateTime endDate, Int32? merchant, - Int32? @operator); + Int32? operatorId); } public class TransactionUIService : ITransactionUIService @@ -113,8 +113,8 @@ public TransactionUIService(IMediator mediator) { DateTime startDate, DateTime endDate, Int32? merchant, - Int32? @operator) { - var query = new TransactionQueries.GetMerchantTransactionSummaryQuery(correlationId, estateId, startDate, endDate, merchant, @operator); + Int32? operatorId) { + var query = new TransactionQueries.GetMerchantTransactionSummaryQuery(correlationId, estateId, startDate, endDate, merchant, operatorId); var result = await this.Mediator.Send(query); if (result.IsFailed) return ResultHelpers.CreateFailure(result); @@ -127,12 +127,12 @@ public TransactionUIService(IMediator mediator) { DateTime startDate, DateTime endDate, Int32? merchant, - Int32? @operator) { - var query = new TransactionQueries.GetOperatorTransactionSummaryQuery(correlationId, estateId, startDate, endDate, merchant, @operator); + Int32? operatorId) { + var query = new TransactionQueries.GetOperatorTransactionSummaryQuery(correlationId, estateId, startDate, endDate, merchant, operatorId); var result = await this.Mediator.Send(query); if (result.IsFailed) return ResultHelpers.CreateFailure(result); var operatorTransactionSummary = ModelFactory.ConvertFrom(result.Data); return Result.Success(operatorTransactionSummary); } -} \ No newline at end of file +}