diff --git a/Directory.Packages.props b/Directory.Packages.props index 83170358..a45c8616 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,7 +6,7 @@ - + diff --git a/EstateManagementUI.BlazorFastIntegrationTests/Common/DockerHelper.cs b/EstateManagementUI.BlazorFastIntegrationTests/Common/DockerHelper.cs index dac985f4..7ae5b5cb 100644 --- a/EstateManagementUI.BlazorFastIntegrationTests/Common/DockerHelper.cs +++ b/EstateManagementUI.BlazorFastIntegrationTests/Common/DockerHelper.cs @@ -27,7 +27,7 @@ public DockerHelper(LocalAppHost appHost) public HttpClient TestHostHttpClient { get; } public LocalTransactionProcessorClient TransactionProcessorClient { get; } - public int GetHostPort(ContainerType containerType) => 5004; + public int GetHostPort(ContainerType containerType) => 8004; public sealed class LocalTransactionProcessorClient { diff --git a/EstateManagementUI.BlazorFastIntegrationTests/Common/LocalAppHost.cs b/EstateManagementUI.BlazorFastIntegrationTests/Common/LocalAppHost.cs index c350e63c..8afc45ba 100644 --- a/EstateManagementUI.BlazorFastIntegrationTests/Common/LocalAppHost.cs +++ b/EstateManagementUI.BlazorFastIntegrationTests/Common/LocalAppHost.cs @@ -17,7 +17,7 @@ public LocalAppHost(string projectPath) _httpClient = new HttpClient(); } - public Uri BaseUri { get; } = new("http://127.0.0.1:5004"); + public Uri BaseUri { get; } = new("http://127.0.0.1:8004"); public async Task StartAsync() { @@ -38,10 +38,11 @@ public async Task StartAsync() startInfo.ArgumentList.Add("run"); startInfo.ArgumentList.Add("--no-build"); + startInfo.ArgumentList.Add("--no-launch-profile"); startInfo.ArgumentList.Add("--project"); startInfo.ArgumentList.Add(_projectPath); - startInfo.Environment["ASPNETCORE_ENVIRONMENT"] = "Test"; + startInfo.Environment["ASPNETCORE_ENVIRONMENT"] = "Development"; startInfo.Environment["AppSettings__TestMode"] = "BackedByTestDataStore"; startInfo.Environment["ASPNETCORE_URLS"] = BaseUri.ToString(); diff --git a/EstateManagementUI.BlazorFastIntegrationTests/Common/ReportingPageHelper.cs b/EstateManagementUI.BlazorFastIntegrationTests/Common/ReportingPageHelper.cs index f8e03cf6..2c82f265 100644 --- a/EstateManagementUI.BlazorFastIntegrationTests/Common/ReportingPageHelper.cs +++ b/EstateManagementUI.BlazorFastIntegrationTests/Common/ReportingPageHelper.cs @@ -360,7 +360,7 @@ private async Task AssertHeadingVisibleAsync(string heading) private string ResolveBaseUrl() { - return "http://127.0.0.1:5004"; + return "http://127.0.0.1:8004"; } private static bool IsMoneyLabel(string label) diff --git a/EstateManagementUI.BlazorFastIntegrationTests/appsettings.json b/EstateManagementUI.BlazorFastIntegrationTests/appsettings.json index df1a82f9..7b9069cf 100644 --- a/EstateManagementUI.BlazorFastIntegrationTests/appsettings.json +++ b/EstateManagementUI.BlazorFastIntegrationTests/appsettings.json @@ -1,6 +1,6 @@ { "TestSettings": { - "BaseUrl": "http://127.0.0.1:5004", + "BaseUrl": "http://127.0.0.1:8004", "Browser": "Chrome", "Headless": false, "DefaultTimeout": 30000 diff --git a/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj b/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj index f3084d9d..e03d1aac 100644 --- a/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj +++ b/EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj @@ -15,7 +15,7 @@ - + diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs b/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs index 917ead3a..97eaa553 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/BaseTest.cs @@ -12,7 +12,7 @@ using Microsoft.Extensions.DependencyInjection; using Imposter.Abstractions; using SimpleResults; -using TestContext = Bunit.TestContext; +using TestContext = Bunit.BunitContext; namespace EstateManagementUI.BlazorServer.Tests.Pages; @@ -87,7 +87,7 @@ protected BaseTest() { parameters => parameters.Get(p => p.ChildContent)); 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") }; - this.AddTestAuthorization().SetClaims(claims); + this.AddAuthorization().SetClaims(claims); } protected readonly IMediatorImposter _mockMediator; diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs index ba7c3485..7162b865 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsEditPageTests.cs @@ -34,7 +34,7 @@ public void ContractsEdit_RendersCorrectly() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); // Assert @@ -58,7 +58,7 @@ public void ContractsEdit_DisplaysContractDetails() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -84,7 +84,7 @@ public void ContractsEdit_HasCorrectPageTitle() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); // Assert @@ -109,12 +109,12 @@ public void ContractsEdit_UpdateContractButton_CanBeFound() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Contract")); // Assert @@ -138,12 +138,12 @@ public void ContractsEdit_AddProductButton_CanBeFound() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product")); // Assert @@ -167,12 +167,12 @@ public void ContractsEdit_AddProductButton_OpensModal() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product")); addProductButton.ShouldNotBeNull(); addProductButton.Click(); @@ -210,7 +210,7 @@ public void ContractsEdit_WithProducts_DisplaysProductList() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -249,12 +249,12 @@ public void ContractsEdit_WithProducts_HasRemoveProductButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); var removeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Product"); @@ -302,12 +302,12 @@ public void ContractsEdit_WithProductHavingFees_HasAddFeeButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); // Assert @@ -345,12 +345,12 @@ public void ContractsEdit_AddFeeButton_OpensModal() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton.ShouldNotBeNull(); addFeeButton.Click(); @@ -376,7 +376,7 @@ public void ContractsEdit_WithNoProducts_ShowsEmptyState() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -400,12 +400,12 @@ public void ContractsEdit_BackToListButton_NavigatesToContractsIndex() { .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton.ShouldNotBeNull(); backButton.Click(); @@ -431,19 +431,19 @@ public void ContractsEdit_ProductModal_HasCancelButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList 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"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? cancelButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); @@ -482,19 +482,19 @@ public void ContractsEdit_FeeModal_HasCancelButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList 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"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? cancelButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); @@ -544,12 +544,12 @@ public void ContractsEdit_WithTransactionFees_HasRemoveFeeButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); var removeFeeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Fee"); @@ -574,7 +574,7 @@ public void ContractsEdit_DisplaysOperatorNameAsReadOnly() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -600,12 +600,12 @@ public void ContractsEdit_UpdateContractButton_Exists() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Contract")); updateButton.ShouldNotBeNull(); } @@ -627,12 +627,12 @@ public void ContractsEdit_AddProductModal_HasRequiredFields() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Open modal - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") != "submit"); addProductButton.ShouldNotBeNull(); addProductButton.Click(); @@ -646,7 +646,7 @@ public void ContractsEdit_AddProductModal_HasRequiredFields() cut.Markup.ShouldContain("Value"); // Check submit button exists - IRefreshableElementCollection modalButtons = cut.FindAll("button"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); @@ -669,12 +669,12 @@ public void ContractsEdit_AddProductModal_HasSubmitButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Open modal - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") != "submit"); addProductButton.ShouldNotBeNull(); addProductButton.Click(); @@ -682,7 +682,7 @@ public void ContractsEdit_AddProductModal_HasSubmitButton() cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add New Product"), timeout: TimeSpan.FromSeconds(5)); // Assert - Check submit button exists - IRefreshableElementCollection modalButtons = cut.FindAll("button"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); @@ -705,12 +705,12 @@ public void ContractsEdit_AddProductModal_HasVariableValueCheckbox() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Open modal - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addProductButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Product") && b.GetAttribute("type") != "submit"); addProductButton.ShouldNotBeNull(); addProductButton.Click(); @@ -753,12 +753,12 @@ public void ContractsEdit_AddFeeModal_HasRequiredFields() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Open modal - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton.ShouldNotBeNull(); addFeeButton.Click(); @@ -772,7 +772,7 @@ public void ContractsEdit_AddFeeModal_HasRequiredFields() cut.Markup.ShouldContain("Fee Value"); // Check submit button exists - IRefreshableElementCollection modalButtons = cut.FindAll("button"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Fee") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); @@ -808,12 +808,12 @@ public void ContractsEdit_AddFeeModal_HasSubmitButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Open modal - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addFeeButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Add Fee")); addFeeButton.ShouldNotBeNull(); addFeeButton.Click(); @@ -821,7 +821,7 @@ public void ContractsEdit_AddFeeModal_HasSubmitButton() cut.WaitForAssertion(() => cut.Markup.ShouldContain("Add Transaction Fee"), timeout: TimeSpan.FromSeconds(5)); // Assert - Check submit button exists - IRefreshableElementCollection modalButtons = cut.FindAll("button"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? submitButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Add Fee") && b.GetAttribute("type") == "submit"); submitButton.ShouldNotBeNull(); @@ -857,12 +857,12 @@ public void ContractsEdit_RemoveProduct_HasRemoveButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); var removeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Product"); removeButton.ShouldNotBeNull(); @@ -909,12 +909,12 @@ public void ContractsEdit_RemoveFee_HasRemoveButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); var removeFeeButton = buttons.FirstOrDefault(b => b.GetAttribute("title") == "Remove Fee"); removeFeeButton.ShouldNotBeNull(); @@ -937,19 +937,19 @@ public void ContractsEdit_ProductModal_HasCancelButtonWithCorrectType() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList 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"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? cancelButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); @@ -986,19 +986,19 @@ public void ContractsEdit_FeeModal_HasCancelButtonWithCorrectType() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList 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"); + IReadOnlyList modalButtons = cut.FindAll("button"); IElement? cancelButton = modalButtons.FirstOrDefault(b => b.TextContent.Contains("Cancel") && b.GetAttribute("type") == "button"); @@ -1044,7 +1044,7 @@ public void ContractsEdit_WithMultipleProducts_DisplaysAllProducts() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -1103,7 +1103,7 @@ public void ContractsEdit_WithMultipleFees_DisplaysAllFees() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -1164,7 +1164,7 @@ public async Task ContractsEdit_AddProduct_CallsServiceAndReloadsContract() }); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render @@ -1290,7 +1290,7 @@ public async Task ContractsEdit_AddFee_CallsServiceAndReloadsContract() }); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render @@ -1379,7 +1379,7 @@ public async Task ContractsEdit_RemoveProduct_ShowsNotSupportedMessage() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -1472,7 +1472,7 @@ public async Task ContractsEdit_RemoveFee_CallsServiceAndReloadsContract() }); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs index 1c105074..02c5deae 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsIndexPageTests.cs @@ -40,7 +40,7 @@ public void ContractsIndex_RendersCorrectly() .ReturnsAsync(Result.Success(contracts)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.Markup.ShouldContain("Contract Management"); @@ -55,7 +55,7 @@ public void ContractsIndex_WithNoContracts_ShowsEmptyState() .ReturnsAsync(Result.Success(emptyList)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No contracts found"), timeout: TimeSpan.FromSeconds(5)); @@ -89,7 +89,7 @@ public void ContractsIndex_WithContracts_DisplaysContractList() .ReturnsAsync(Result.Success(contracts)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Contract 1"), timeout: TimeSpan.FromSeconds(5)); @@ -121,7 +121,7 @@ public void ContractsIndex_DisplaysProductCount() .ReturnsAsync(Result.Success(contracts)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Product(s)"), timeout: TimeSpan.FromSeconds(5)); @@ -135,7 +135,7 @@ public void ContractsIndex_HasCorrectPageTitle() .ReturnsAsync(Result.Success(new List())); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert IRenderedComponent pageTitle = cut.FindComponent(); @@ -150,7 +150,7 @@ public void ContractsIndex_LoadContractFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert _fakeNavigationManager.Uri.ShouldContain("error"); @@ -163,7 +163,7 @@ public void ContractsIndex_AddNewContractButton_NavigatesToNewContractPage() this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(new List())); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Contract Management"), timeout: TimeSpan.FromSeconds(5)); // Act - Find and click the "Add New Contract" button @@ -194,11 +194,11 @@ public void ContractsIndex_ViewButton_NavigatesToContractDetails() this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts)); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Contract"), timeout: TimeSpan.FromSeconds(5)); // Act - Find and click the "View" button - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? viewButton = buttons.FirstOrDefault(b => b.TextContent.Contains("View")); viewButton.ShouldNotBeNull(); viewButton.Click(); @@ -227,11 +227,11 @@ public void ContractsIndex_EditButton_NavigatesToEditContractPage() this.ContractUIService.GetContracts(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(contracts)); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Contract"), timeout: TimeSpan.FromSeconds(5)); // Act - Find and click the "Edit" button - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? editButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Edit")); editButton.ShouldNotBeNull(); editButton.Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs index af4a2e75..429c8977 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsNewPageTests.cs @@ -18,7 +18,7 @@ public void ContractsNew_RendersCorrectly() this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.Markup.ShouldContain("Create New Contract"); @@ -31,7 +31,7 @@ public void ContractsNew_HasCorrectPageTitle() this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert IRenderedComponent pageTitle = cut.FindComponent(); @@ -44,11 +44,11 @@ public void ContractsNew_CancelButton_NavigatesToContractsIndex() // Arrange this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Contract"), timeout: TimeSpan.FromSeconds(5)); // Act - Find and click the Cancel button - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? cancelButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Cancel")); cancelButton.ShouldNotBeNull(); cancelButton.Click(); @@ -63,7 +63,7 @@ public void ContractsNew_CreateContractButton_IsPresent() // Arrange this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Contract"), timeout: TimeSpan.FromSeconds(5)); // Act & Assert @@ -91,7 +91,7 @@ public void ContractsNew_LoadsOperatorsSuccessfully() this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert - Verify both operators are loaded and displayed in the dropdown cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator 1"), timeout: TimeSpan.FromSeconds(5)); @@ -105,7 +105,7 @@ public void ContractsNew_LoadsOperatorsFailed_NavigateToError() this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure()); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); _fakeNavigationManager.Uri.ShouldContain("error"); } @@ -117,7 +117,7 @@ public void ContractsNew_WithNoOperators_ShowsNoOperatorsMessage() this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new List())); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("No operators available"), timeout: TimeSpan.FromSeconds(5)); @@ -141,7 +141,7 @@ public void ContractsNew_SuccessfulCreation_NavigatesToContractsIndex() this.ContractUIService.CreateContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Fill in the form @@ -179,7 +179,7 @@ public void ContractsNew_FailedCreation_ShowsErrorMessage() this.ContractUIService.CreateContract(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Fill in the form @@ -215,7 +215,7 @@ public void ContractsNew_FormValidation_RequiresDescription() this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Submit form without description @@ -247,7 +247,7 @@ public void ContractsNew_FormValidation_RequiresOperator() this.OperatorUIService.GetOperatorsForDropDown(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(operators)); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Submit form without selecting operator diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs index 9f19ed12..c847772d 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Contracts/ContractsViewPageTests.cs @@ -28,7 +28,7 @@ public void ContractsView_RendersCorrectly() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); // Assert @@ -51,7 +51,7 @@ public void ContractsView_DisplaysContractDetails() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -74,7 +74,7 @@ public void ContractsView_HasCorrectPageTitle() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); // Assert @@ -98,7 +98,7 @@ public void ContractsView_HasBackButton() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -122,12 +122,12 @@ public void ContractsView_BackButton_NavigatesToContractsList() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton.ShouldNotBeNull(); backButton.Click(); @@ -164,7 +164,7 @@ public void ContractsView_DisplaysProducts_WhenPresent() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -191,7 +191,7 @@ public void ContractsView_DisplaysNoProducts_WhenEmpty() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -238,7 +238,7 @@ public void ContractsView_DisplaysTransactionFees_WhenPresent() .ReturnsAsync(Result.Success(contract)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -257,7 +257,7 @@ public void ContractsView_LoadContract_QueryFails_ShowsNotFoundMessage() .ReturnsAsync(Result.Failure()); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.ContractId, contractId)); //cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs index 8a5b72e4..76df71bb 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/EntryScreenPageTests.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Shouldly; -using TestContext = Bunit.TestContext; +using TestContext = Bunit.BunitContext; namespace EstateManagementUI.BlazorServer.Tests.Pages; @@ -23,7 +23,7 @@ public EntryScreenPageTests() public void EntryScreen_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Estate Management"); @@ -35,7 +35,7 @@ public void EntryScreen_RendersCorrectly() public void EntryScreen_HasEstateManagementCard() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Manage estate details"); @@ -47,7 +47,7 @@ public void EntryScreen_HasEstateManagementCard() public void EntryScreen_HasMerchantManagementCard() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Manage Merchant Details"); @@ -58,7 +58,7 @@ public void EntryScreen_HasMerchantManagementCard() public void EntryScreen_HasFileProcessingCard() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Transaction Files"); @@ -69,7 +69,7 @@ public void EntryScreen_HasFileProcessingCard() public void EntryScreen_HasViewMoreLinks() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.FindAll("a[href='/estate-info']").Count.ShouldBeGreaterThan(0); @@ -81,7 +81,7 @@ public void EntryScreen_HasViewMoreLinks() public void EntryScreen_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); @@ -91,7 +91,7 @@ public void EntryScreen_HasCorrectPageTitle() [Fact] public void EntryScreen_live_mode_sign_in_link_goes_directly_to_authentication() { - var cut = RenderComponent(); + var cut = Render(); cut.Find("#loginButton").GetAttribute("href").ShouldBe("/authentication/login"); } @@ -106,7 +106,7 @@ public void EntryScreen_test_mode_sign_in_link_goes_to_login_page() }) .Build()); - var cut = RenderComponent(); + var cut = Render(); cut.Find("#loginButton").GetAttribute("href").ShouldBe("/login"); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs index f1e19ed9..b4d51e03 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/ErrorPageTests.cs @@ -35,7 +35,7 @@ public ErrorPageTests() :base() { public void Error_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Find("h1").TextContent.ShouldContain("Oops! Something went wrong"); @@ -46,7 +46,7 @@ public void Error_RendersCorrectly() public void Error_WithoutRequestId_DoesNotShowRequestId() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldNotContain("Reference ID for support:"); @@ -56,7 +56,7 @@ public void Error_WithoutRequestId_DoesNotShowRequestId() public void Error_ShowsDevelopmentModeInformation() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Development Mode Information"); @@ -67,7 +67,7 @@ public void Error_ShowsDevelopmentModeInformation() public void Error_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); @@ -78,7 +78,7 @@ public void Error_HasCorrectPageTitle() public void Error_HasHomePageLink() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var homeLink = cut.Find("a[href='/']"); @@ -89,7 +89,7 @@ public void Error_HasHomePageLink() public void Error_HasBackButton() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var backButton = cut.Find("button[onclick='window.history.back()']"); @@ -100,7 +100,7 @@ public void Error_HasBackButton() public void Error_HasSupportEmail() { // Act - var cut = RenderComponent(); + var cut = Render(); // 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 3faea1fb..2aeb188c 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs @@ -33,7 +33,7 @@ public void EstateIndex_RendersCorrectly() this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(estate)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.Markup.ShouldContain("Estate Management"); @@ -58,7 +58,7 @@ public void EstateIndex_DisplaysEstateDetails() this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(estate)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.WaitForAssertion(() => cut.Markup.ShouldContain("Test Estate"), timeout: TimeSpan.FromSeconds(5)); @@ -83,7 +83,7 @@ public void EstateIndex_HasCorrectPageTitle() this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(estate)); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert IRenderedComponent pageTitle = cut.FindComponent(); @@ -95,11 +95,11 @@ public void EstateIndex_TabSwitch_ToOperators_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find operators button and click it - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); @@ -112,11 +112,11 @@ public void EstateIndex_TabSwitch_BackToOverview_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Switch to operators first - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); @@ -149,14 +149,14 @@ public void EstateIndex_AddOperator_Success_UpdatesAssignedOperators() this.EstateUIService.AddOperatorToEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); 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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); @@ -190,11 +190,11 @@ public void EstateIndex_AddOperator_Failure_ShowsErrorMessage() this.EstateUIService.AddOperatorToEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Switch to operators tab - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); @@ -229,18 +229,18 @@ public void EstateIndex_RemoveOperator_Success_RemovesFromList() this.EstateUIService.RemoveOperatorFromEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); 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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); // Act - Remove operator - IRefreshableElementCollection removeButtons = cut.FindAll("button"); + IReadOnlyList removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); @@ -264,16 +264,16 @@ public void EstateIndex_RemoveOperator_Failure_ShowsErrorMessage() this.EstateUIService.RemoveOperatorFromEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure(String.Empty)); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Switch to operators tab - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); // Act - Remove operator - IRefreshableElementCollection removeButtons = cut.FindAll("button"); + IReadOnlyList removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); @@ -298,7 +298,7 @@ public void EstateIndex_DisplaysMerchants_WhenPresent() SetupSuccessfulDataLoadWithMerchants(merchants); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -313,7 +313,7 @@ public void EstateIndex_DisplaysNoMerchants_WhenEmpty() SetupSuccessfulDataLoad(); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -336,7 +336,7 @@ public void EstateIndex_DisplaysContracts_WhenPresent() SetupSuccessfulDataLoadWithContracts(contracts); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -350,7 +350,7 @@ public void EstateIndex_DisplaysNoContracts_WhenEmpty() SetupSuccessfulDataLoad(); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -364,7 +364,7 @@ public void EstateIndex_LoadEstateData_LoadFails_NavigatesToError() this.EstateUIService.LoadEstate(Arg.Any(), Arg.Any()).ReturnsAsync(Result.Failure()); // Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert _fakeNavigationManager.Uri.ShouldContain("error"); @@ -384,11 +384,11 @@ public void EstateIndex_DisplaysOperatorRequirements_WhenPresent() SetupSuccessfulDataLoadWithAssignedOperators(new List { assignedOperator }); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Switch to operators tab - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); @@ -405,11 +405,11 @@ public void EstateIndex_DisplaysNoOperators_WhenNoneAssigned() // Arrange SetupSuccessfulDataLoad(); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Switch to operators tab - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Operators")); operatorsButton?.Click(); @@ -433,23 +433,23 @@ public void EstateIndex_SuccessMessage_ClearsWhenSwitchingTabs() this.EstateUIService.RemoveOperatorFromEstate(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Switch to operators tab - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList 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"); + IReadOnlyList 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"); + IReadOnlyList overviewButtons = cut.FindAll("button"); IElement? overviewButton = overviewButtons.FirstOrDefault(b => b.TextContent.Contains("Overview")); overviewButton?.Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs index 6f9450ae..43275416 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/EstateInfoPageTests.cs @@ -1,7 +1,7 @@ using Bunit; using EstateManagementUI.BlazorServer.Components.Pages; using Shouldly; -using TestContext = Bunit.TestContext; +using TestContext = Bunit.BunitContext; namespace EstateManagementUI.BlazorServer.Tests.Pages; @@ -11,7 +11,7 @@ public class EstateInfoPageTests : TestContext public void EstateInfo_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Estate Management"); @@ -22,7 +22,7 @@ public void EstateInfo_RendersCorrectly() public void EstateInfo_HasFeatureSections() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Manage Estate Details"); @@ -34,7 +34,7 @@ public void EstateInfo_HasFeatureSections() public void EstateInfo_HasSignInButton() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var loginButton = cut.Find("a#loginButton"); @@ -46,7 +46,7 @@ public void EstateInfo_HasSignInButton() public void EstateInfo_HasBackButton() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.FindAll("a[href='/entry']").Count.ShouldBeGreaterThan(0); @@ -56,7 +56,7 @@ public void EstateInfo_HasBackButton() public void EstateInfo_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs index 7bf97318..9e8278d7 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/FileInfoPageTests.cs @@ -1,7 +1,7 @@ using Bunit; using Shouldly; using FileInfoPage = EstateManagementUI.BlazorServer.Components.Pages.FileInfo; -using TestContext = Bunit.TestContext; +using TestContext = Bunit.BunitContext; namespace EstateManagementUI.BlazorServer.Tests.Pages; @@ -11,7 +11,7 @@ public class FileInfoPageTests : TestContext public void FileInfo_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("File Processing"); @@ -22,7 +22,7 @@ public void FileInfo_RendersCorrectly() public void FileInfo_HasFeatureSections() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Transaction Files"); @@ -34,7 +34,7 @@ public void FileInfo_HasFeatureSections() public void FileInfo_HasSignInButton() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var loginButton = cut.Find("a#loginButton"); @@ -46,7 +46,7 @@ public void FileInfo_HasSignInButton() public void FileInfo_HasBackButton() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.FindAll("a[href='/entry']").Count.ShouldBeGreaterThan(0); @@ -56,7 +56,7 @@ public void FileInfo_HasBackButton() public void FileInfo_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs index 6dc974d0..dc27f65f 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingDetailsPageTests.cs @@ -41,7 +41,7 @@ public void FileProcessingDetails_RendersFilesAndLines() var log = FileProcessingSeedData.ImportLogs[0]; - var cut = RenderComponent(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); + var cut = Render(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); cut.WaitForAssertion(() => { @@ -89,7 +89,7 @@ public void FileProcessingDetails_PaginatesTheFileList() var log = FileProcessingSeedData.ImportLogs[0]; - var cut = RenderComponent(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); + var cut = Render(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); cut.FindAll("button").Single(button => button.TextContent.Contains("Next")).Click(); @@ -133,7 +133,7 @@ public void FileProcessingDetails_FileNameFilter_FiltersTheVisibleFiles() var log = FileProcessingSeedData.ImportLogs[0]; - var cut = RenderComponent(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); + var cut = Render(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); cut.Find("#file-name-filter").Change(log.FileDetailsList[6].FileName); @@ -162,7 +162,7 @@ public void FileProcessingDetails_BackButton_NavigatesToIndex() var log = FileProcessingSeedData.ImportLogs[0]; - var cut = RenderComponent(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); + var cut = Render(parameters => parameters.Add(p => p.ImportLogId, log.FileImportLogId)); cut.FindAll("button").Single(button => button.TextContent.Contains("Back")).Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs index a94f8ee4..f6e81ed5 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingIndexPageTests.cs @@ -28,7 +28,7 @@ public void FileProcessingIndex_RendersSummaryAndLogs() Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForAssertion(() => { @@ -56,7 +56,7 @@ public void FileProcessingIndex_FilterByDate_UpdatesTheDisplayedLogs() { Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); - var cut = RenderComponent(); + var cut = Render(); var targetDate = FileProcessingSeedData.ImportLogs[1].ImportLogDateTime.Date; // Use InvokeAsync to ensure DOM updates and event handler registration @@ -90,7 +90,7 @@ public void FileProcessingIndex_RowClick_NavigatesToImportLogDetails() Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); - var cut = RenderComponent(); + var cut = Render(); var firstLog = FileProcessingSeedData.ImportLogs[0]; cut.FindAll("button").First(button => button.TextContent.Contains("View details")).Click(); @@ -113,7 +113,7 @@ public void FileProcessingIndex_UploadButton_NavigatesToUploadScreen() Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(filteredLogs)); - var cut = RenderComponent(); + var cut = Render(); cut.FindAll("button").First(button => button.TextContent.Contains("Upload File")).Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingUploadPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingUploadPageTests.cs index 878d1fde..d7c5e5e5 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingUploadPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/FileProcessing/FileProcessingUploadPageTests.cs @@ -9,7 +9,7 @@ public class FileProcessingUploadPageTests : BaseTest [Fact] public void FileProcessingUpload_RendersRequiredInputs() { - var cut = RenderComponent(); + var cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Upload File")); cut.Find("select[name='FileProfile']").ShouldNotBeNull(); @@ -19,7 +19,7 @@ public void FileProcessingUpload_RendersRequiredInputs() [Fact] public void FileProcessingUpload_SubmitWithoutProfileAndFile_ShowsValidationErrors() { - var cut = RenderComponent(); + var cut = Render(); cut.Find("form").Submit(); @@ -34,7 +34,7 @@ public void FileProcessingUpload_SubmitWithoutProfileAndFile_ShowsValidationErro [Fact] public void FileProcessingUpload_SubmitWithProfileButWithoutFile_ShowsFileValidationErrorOnly() { - var cut = RenderComponent(); + var cut = Render(); cut.WaitForAssertion(() => cut.Find("select[name='MerchantId']").Change("33333333-3333-3333-3333-333333333333")); cut.WaitForAssertion(() => cut.Find("select[name='FileProfile']").Change("22222222-2222-2222-2222-222222222222")); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs index 1ec5cdc3..2078f664 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/HomePageTests.cs @@ -115,7 +115,7 @@ public void Home_RendersCorrectly() this._mockTransactionUiService.GetTodaysFailedSales(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(todaysSales)); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Dashboard"); @@ -195,7 +195,7 @@ public void Home_HasCorrectPageTitle() // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs index 89e4a14f..2fc49572 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/MerchantInfoPageTests.cs @@ -1,6 +1,6 @@ using Bunit; using EstateManagementUI.BlazorServer.Components.Pages; -using TestContext = Bunit.TestContext; +using TestContext = Bunit.BunitContext; using Shouldly; namespace EstateManagementUI.BlazorServer.Tests.Pages; @@ -11,7 +11,7 @@ public class MerchantInfoPageTests : TestContext public void MerchantInfo_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Merchant Management"); @@ -21,7 +21,7 @@ public void MerchantInfo_RendersCorrectly() public void MerchantInfo_HasFeatureSections() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Manage Merchant Details"); @@ -32,7 +32,7 @@ public void MerchantInfo_HasFeatureSections() public void MerchantInfo_HasSignInButton() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var loginButtons = cut.FindAll("a#loginButton"); @@ -44,7 +44,7 @@ public void MerchantInfo_HasSignInButton() public void MerchantInfo_HasBackButton() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.FindAll("a[href='/entry']").Count.ShouldBeGreaterThan(0); @@ -54,7 +54,7 @@ public void MerchantInfo_HasBackButton() public void MerchantInfo_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs index 27c86b32..556c89dd 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantSchedulePageTests.cs @@ -35,7 +35,7 @@ public void MerchantSchedule_LoadsMerchantAndSchedule() var currentYear = DateTime.Today.Year; SetupPageData(merchantId, currentYear, new MerchantModels.MerchantScheduleModel { Year = currentYear, Months = [] }); - var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Markup.ShouldContain("Merchant Schedule: Test Merchant"); @@ -50,7 +50,7 @@ public void MerchantSchedule_YearSelector_DisplaysNextTenYears() var currentYear = DateTime.Today.Year; SetupPageData(merchantId, currentYear, new MerchantModels.MerchantScheduleModel { Year = currentYear, Months = [] }); - var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); var options = cut.FindAll("#selectedYear option"); @@ -78,7 +78,7 @@ public void MerchantSchedule_ClonePreviousYear_CopiesEditableMonths() } }); - var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#selectedYear").Change(futureYear.ToString()); @@ -102,7 +102,7 @@ public void MerchantSchedule_SaveSelectedYear_SendsYearPayload() Arg.Any()) .ReturnsAsync(Result.Success()); - var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#selectedYear").Change(futureYear.ToString()); @@ -131,7 +131,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)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#selectedYear").Change(futureYear.ToString()); @@ -157,7 +157,7 @@ public void MerchantSchedule_SaveSelectedYear_LeapYearFebruary_Allows29th() Arg.Any()) .ReturnsAsync(Result.Success()); - var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#selectedYear").Change(leapYear.ToString()); @@ -187,7 +187,7 @@ public async Task MerchantSchedule_SaveSelectedYear_NonLeapYearFebruary_Rejects2 SetupSchedule(nonLeapYear, new MerchantModels.MerchantScheduleModel { Year = nonLeapYear, Months = [] }); 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)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#selectedYear").Change(nonLeapYear.ToString()); @@ -219,7 +219,7 @@ public void MerchantSchedule_PreviousYear_IsReadOnly() SetupPageData(merchantId, currentYear, new MerchantModels.MerchantScheduleModel { Year = currentYear, Months = [] }); SetupSchedule(previousYear, new MerchantModels.MerchantScheduleModel { Year = previousYear, Months = [] }); - var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#selectedYear").Change(previousYear.ToString()); @@ -268,7 +268,7 @@ public void MerchantSchedule_ReadOnlyMode_DisablesEditingControls() _fakeNavigationManager.NavigateTo($"/merchants/{merchantId}/schedule?readOnly=true"); - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs index 0990caab..676ed7ea 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsDepositPageTests.cs @@ -21,7 +21,7 @@ public void Deposit_RendersCorrectly() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); // Assert @@ -35,7 +35,7 @@ public void Deposit_HasCorrectPageTitle() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); // Assert @@ -51,7 +51,7 @@ public void Deposit_DisplaysMerchantName() SetupSuccessfulMerchantLoad("Test Merchant Name"); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -66,7 +66,7 @@ public void Deposit_DisplaysFormFields() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -97,7 +97,7 @@ public void Deposit_MakeDepositButton_SubmitsForm() Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render @@ -114,7 +114,7 @@ public void Deposit_MakeDepositButton_SubmitsForm() depositReferenceInput.Change("TEST-REF-001"); // Find and click the Make Deposit button - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? makeDepositButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Make Deposit") && (b.GetAttribute("id") ?? "") == "makeDepositButton"); @@ -141,7 +141,7 @@ public void Deposit_MakeDepositButton_ShowsErrorOnFailure() Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.Instance.SetDelayOverride(0); cut.Render(); // required to trigger re-render @@ -158,7 +158,7 @@ public void Deposit_MakeDepositButton_ShowsErrorOnFailure() depositReferenceInput.Change("TEST-REF-001"); // Find and click the Make Deposit button - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? makeDepositButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Make Deposit") && (b.GetAttribute("id") ?? "") == "makeDepositButton"); @@ -177,12 +177,12 @@ public void Deposit_HasTwoCancelButtons() SetupSuccessfulMerchantLoad(); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert - there should be exactly 2 Cancel buttons - IRefreshableElementCollection allButtons = cut.FindAll("button"); + IReadOnlyList allButtons = cut.FindAll("button"); List cancelButtonList = allButtons.Where(b => b.TextContent.Trim() == "Cancel").ToList(); cancelButtonList.Count.ShouldBe(2); } @@ -193,12 +193,12 @@ public void Deposit_CancelButton_NavigatesToMerchantsIndex() // Arrange SetupSuccessfulMerchantLoad(); - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the Cancel button - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? cancelButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Cancel")); cancelButton?.Click(); @@ -217,7 +217,7 @@ public void Deposit_LoadMerchant_LoadFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - IRenderedComponent cut = RenderComponent(parameters => + IRenderedComponent cut = Render(parameters => parameters.Add(p => p.MerchantId, _testMerchantId)); // Assert diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs index fabb4cf1..531fa3c2 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsEditPageTests.cs @@ -21,7 +21,7 @@ public void MerchantsEdit_RendersCorrectly() SetupSuccessfulDataLoad(merchantId); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); // Assert @@ -37,7 +37,7 @@ public void MerchantsEdit_HasCorrectPageTitle() SetupSuccessfulDataLoad(merchantId); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); // Assert @@ -54,7 +54,7 @@ public void MerchantsEdit_DisplaysMerchantDetails() SetupSuccessfulDataLoad(merchantId, "Test Merchant", "MERCH001"); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); // Assert @@ -70,12 +70,12 @@ public void MerchantsEdit_BackToListButton_NavigatesToMerchantsList() var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton?.Click(); @@ -89,7 +89,7 @@ public void MerchantsEdit_EditScheduleButton_NavigatesToEditableMerchantSchedule var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -105,12 +105,12 @@ public void MerchantsEdit_TabSwitch_ToAddress_UpdatesActiveTab() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); @@ -124,12 +124,12 @@ public void MerchantsEdit_TabSwitch_ToContact_UpdatesActiveTab() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contactButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Contact Details")); contactButton?.Click(); @@ -142,11 +142,11 @@ public void MerchantsEdit_TabSwitch_ToOpeningHours_UpdatesActiveTab() { var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? openingHoursButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Opening Hours")); openingHoursButton?.Click(); @@ -163,12 +163,12 @@ public void MerchantsEdit_TabSwitch_ToOperators_UpdatesActiveTab() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -182,12 +182,12 @@ public void MerchantsEdit_TabSwitch_ToContracts_UpdatesActiveTab() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -201,12 +201,12 @@ public void MerchantsEdit_TabSwitch_ToDevices_UpdatesActiveTab() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -220,12 +220,12 @@ public void MerchantsEdit_TabSwitch_BackToDetails_UpdatesActiveTab() // Arrange var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); @@ -246,7 +246,7 @@ public void MerchantsEdit_LoadMerchantData_LoadFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); // Assert @@ -261,12 +261,12 @@ public void MerchantsEdit_DisplaysNoOperators_WhenNoneAssigned() var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -281,12 +281,12 @@ public void MerchantsEdit_DisplaysNoContracts_WhenNoneAssigned() var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -301,12 +301,12 @@ public void MerchantsEdit_DisplaysNoDevices_WhenNoneAssigned() var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -321,12 +321,12 @@ public void MerchantsEdit_AddOperatorButton_TogglesAddOperatorForm() var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -345,12 +345,12 @@ public void MerchantsEdit_AddContractButton_TogglesAddContractForm() var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -369,12 +369,12 @@ public void MerchantsEdit_AddDeviceButton_TogglesAddDeviceForm() var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -411,12 +411,12 @@ public void MerchantsEdit_AddOperator_Success_ShowsSuccessMessage() this.MerchantUIService.AddOperatorToMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId, Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -462,12 +462,12 @@ public void MerchantsEdit_AddOperator_Failure_ShowsErrorMessage() this.MerchantUIService.AddOperatorToMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId, Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -504,17 +504,17 @@ public void MerchantsEdit_RemoveOperator_Success_ShowsSuccessMessage() this.MerchantUIService.RemoveOperatorFromMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); // Act - Remove operator - IRefreshableElementCollection removeButtons = cut.FindAll("button"); + IReadOnlyList removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); @@ -538,17 +538,17 @@ public void MerchantsEdit_RemoveOperator_Failure_ShowsErrorMessage() this.MerchantUIService.RemoveOperatorFromMerchant(Arg.Any(), Arg.Any(), merchantId, operatorId) .ReturnsAsync(Result.Failure(String.Empty)); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); // Act - Remove operator - IRefreshableElementCollection removeButtons = cut.FindAll("button"); + IReadOnlyList removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); @@ -573,12 +573,12 @@ public void MerchantsEdit_AssignContract_Success_ShowsSuccessMessage() this.MerchantUIService.AssignContractToMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -614,12 +614,12 @@ public void MerchantsEdit_AssignContract_Failure_ShowsErrorMessage() this.MerchantUIService.AssignContractToMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -655,17 +655,17 @@ public void MerchantsEdit_RemoveContract_Success_ShowsSuccessMessage() this.MerchantUIService.RemoveContractFromMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); // Act - Remove contract - IRefreshableElementCollection removeButtons = cut.FindAll("button"); + IReadOnlyList removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); @@ -690,17 +690,17 @@ public void MerchantsEdit_RemoveContract_Failure_ShowsErrorMessage() this.MerchantUIService.RemoveContractFromMerchant(Arg.Any(), Arg.Any(), merchantId, contractId) .ReturnsAsync(Result.Failure(String.Empty)); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); // Act - Remove contract - IRefreshableElementCollection removeButtons = cut.FindAll("button"); + IReadOnlyList removeButtons = cut.FindAll("button"); IElement? removeButton = removeButtons.FirstOrDefault(b => b.TextContent.Contains("Remove")); removeButton?.Click(); @@ -721,12 +721,12 @@ public void MerchantsEdit_DisplaysAssignedOperators_WhenPresent() SetupSuccessfulDataLoadWithAssignedOperators(merchantId, new List { assignedOperator }); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -748,12 +748,12 @@ public void MerchantsEdit_DisplaysAssignedContracts_WhenPresent() SetupSuccessfulDataLoadWithAssignedContracts(merchantId, new List { assignedContract }); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -769,7 +769,7 @@ public void MerchantsEdit_LoadMerchant_Success_LoadsAllData() SetupSuccessfulDataLoad(merchantId, "Test Merchant", "MERCH001"); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); // Assert @@ -791,12 +791,12 @@ public void MerchantsEdit_AddDeviceToMerchant_Success_ShowsSuccessMessage() this.MerchantUIService.AddMerchantDevice(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -828,12 +828,12 @@ public void MerchantsEdit_AddDeviceToMerchant_Failure_ShowsErrorMessage() this.MerchantUIService.AddMerchantDevice(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -864,12 +864,12 @@ public void MerchantsEdit_SaveAllChanges_Success_ShowsSuccessMessageAndNavigates this.MerchantUIService.UpdateMerchant(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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']"); + IReadOnlyList buttons = cut.FindAll("button[type='submit']"); IElement? saveButton = buttons.FirstOrDefault(); saveButton.ShouldNotBeNull(); saveButton.Click(); @@ -891,12 +891,12 @@ public void MerchantsEdit_SaveAllChanges_Failure_ShowsErrorMessage() this.MerchantUIService.UpdateMerchant(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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']"); + IReadOnlyList buttons = cut.FindAll("button[type='submit']"); IElement? saveButton = buttons.FirstOrDefault(); saveButton.ShouldNotBeNull(); saveButton.Click(); @@ -915,7 +915,7 @@ public void MerchantsEdit_SaveOpeningHours_Success_ShowsSuccessMessageAndCallsSe this.MerchantUIService.UpdateMerchantOpeningHours(Arg.Any(), Arg.Any(), merchantId, Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -957,7 +957,7 @@ public void MerchantsEdit_SaveOpeningHours_InvalidClosingTimeAbove2359_ShowsErro var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -979,7 +979,7 @@ public void MerchantsEdit_SaveOpeningHours_InvalidOpeningTimeBelow0000_ShowsErro var merchantId = Guid.NewGuid(); SetupSuccessfulDataLoad(merchantId); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -1006,12 +1006,12 @@ public void MerchantsEdit_SwapDeviceConfirm_Success_ShowsSuccessMessage() this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), merchantId, "DEV123", "DEV456") .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -1043,12 +1043,12 @@ public void MerchantsEdit_SwapDeviceConfirm_EmptyIdentifier_ShowsError() var existingDevice = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV123" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { existingDevice }); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -1077,12 +1077,12 @@ public void MerchantsEdit_SwapDeviceConfirm_SameIdentifier_ShowsError() var existingDevice = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV123" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { existingDevice }); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -1115,12 +1115,12 @@ public void MerchantsEdit_SwapDeviceConfirm_DuplicateIdentifier_ShowsError() var device2 = new MerchantModels.MerchantDeviceModel { DeviceIdentifier = "DEV456" }; SetupSuccessfulDataLoad(merchantId, assignedDevices: new List { device1, device2 }); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -1155,12 +1155,12 @@ public void MerchantsEdit_SwapDeviceConfirm_Failure_ClearsSwapUI() this.MerchantUIService.SwapMerchantDevice(Arg.Any(), Arg.Any(), merchantId, "DEV123", "DEV456") .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs index 13f07553..a5ed7852 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsIndexPageTests.cs @@ -36,7 +36,7 @@ public void MerchantsIndex_InitialState_ShowsLoadingIndicator() .ReturnsAsync(Result.Success(merchants)); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Merchant Management"); @@ -55,7 +55,7 @@ public void MerchantsIndex_WithNoMerchants_ShowsEmptyState() .ReturnsAsync(Result.Success(merchants)); // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin")); // Assert @@ -91,7 +91,7 @@ public void MerchantsIndex_WithMerchants_DisplaysMerchantList() // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -128,7 +128,7 @@ public void MerchantsIndex_WithMerchants_DisplaysSummaryCards() // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -149,7 +149,7 @@ public void MerchantsIndex_HasCorrectPageTitle() // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); @@ -178,7 +178,7 @@ public void MerchantsIndex_WithMerchants_DisplaysFilters() // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -209,7 +209,7 @@ public void MerchantsIndex_WithManyMerchants_DisplaysPagination() // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -242,7 +242,7 @@ public void MerchantsIndex_WithMerchants_DisplaysRegionAndPostcode() // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -262,7 +262,7 @@ public void MerchantsIndex_AddNewMerchantButton_NavigatesToNewMerchantPage() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the "Add New Merchant" button @@ -294,7 +294,7 @@ public void MerchantsIndex_ApplyFiltersButton_ClickIsHandled() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the "Apply Filters" button @@ -330,7 +330,7 @@ public void MerchantsIndex_ClearFiltersButton_ClickIsHandled() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the "Clear Filters" button @@ -368,7 +368,7 @@ public void MerchantsIndex_ViewButton_NavigatesToMerchantDetailsPage() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the View button @@ -401,7 +401,7 @@ public void MerchantsIndex_EditButton_NavigatesToEditMerchantPage() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the Edit button @@ -441,7 +441,7 @@ public void MerchantsIndex_MakeDepositButton_OpensDepositModal() MerchantName = "Test Merchant" })); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the Make Deposit button @@ -484,7 +484,7 @@ public void MerchantsIndex_DepositModal_HasOneCancelButton() MerchantName = "Test Merchant" })); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Open modal @@ -526,7 +526,7 @@ public void MerchantsIndex_DepositModal_CancelButton_ClosesModal() MerchantName = "Test Merchant" })); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#makeDepositLink").Click(); @@ -577,7 +577,7 @@ public void MerchantsIndex_DepositModal_Submit_ShowsSuccess() Arg.Any()) .ReturnsAsync(Result.Success()); - var cut = RenderComponent(); + var cut = Render(); cut.Instance.SetDelayOverride(500); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -620,7 +620,7 @@ public void MerchantsIndex_DepositModal_OpensWithoutMerchantName_WhenGetMerchant this.MerchantUIService.GetMerchant(Arg.Any(), Arg.Any(), merchantId) .ReturnsAsync(Result.Failure()); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - click Make Deposit when GetMerchant fails @@ -649,7 +649,7 @@ public void MerchantsIndex_PaginationButtons_FirstPage_IsHandled() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Navigate to second page first @@ -683,7 +683,7 @@ public void MerchantsIndex_PaginationButtons_PreviousPage_IsHandled() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Navigate to second page first @@ -717,7 +717,7 @@ public void MerchantsIndex_PaginationButtons_NextPage_IsHandled() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the Next Page button @@ -746,7 +746,7 @@ public void MerchantsIndex_PaginationButtons_LastPage_IsHandled() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the Last Page button @@ -770,7 +770,7 @@ public void MerchantsIndex_LoadMerchants_LoadFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert _fakeNavigationManager.Uri.ShouldContain("error"); @@ -798,7 +798,7 @@ public void MerchantsIndex_RowClick_NavigatesToMerchantDetailsPage() Arg.Any()) .ReturnsAsync(Result.Success(merchants)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click the merchant row diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs index 8a7e125e..7685e5b9 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs @@ -5,7 +5,6 @@ using Shouldly; using SimpleResults; using MerchantsNew = EstateManagementUI.BlazorServer.Components.Pages.Merchants.New; -using AngleSharp.Dom; namespace EstateManagementUI.BlazorServer.Tests.Pages.Merchants; @@ -37,9 +36,9 @@ private System.Reflection.FieldInfo GetErrorMessageField(object instance) public void MerchantsNew_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); - // Assert + // Render cut.Markup.ShouldContain("Create New Merchant"); } @@ -47,9 +46,9 @@ public void MerchantsNew_RendersCorrectly() public void MerchantsNew_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); - // Assert + // Render var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); } @@ -58,14 +57,14 @@ public void MerchantsNew_HasCorrectPageTitle() public void MerchantsNew_CancelButton_NavigatesToMerchantsList() { // Arrange - var cut = RenderComponent(); + var cut = Render(); // Act - Find and click the Cancel button var buttons = cut.FindAll("button"); var cancelButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Cancel")); cancelButton?.Click(); - // Assert + // Render _fakeNavigationManager.Uri.ShouldContain("/merchants"); } @@ -73,12 +72,12 @@ public void MerchantsNew_CancelButton_NavigatesToMerchantsList() public void MerchantsNew_CreateMerchantButton_Exists() { // Arrange - var cut = RenderComponent(); + var cut = Render(); // Act - Find the Create Merchant button by ID var createButton = cut.Find("#createMerchantButton"); - // Assert + // Render createButton.ShouldNotBeNull(); createButton.TextContent.ShouldContain("Create Merchant"); } @@ -94,7 +93,7 @@ public async Task HandleSubmit_SuccessfulCreation_SetsSuccessMessage() Arg.Any()) .ReturnsAsync(Result.Success()); - var cut = RenderComponent(); + var cut = Render(); cut.Instance.SetDelayOverride(0); // Act - Use reflection to call the private HandleSubmit method on the Dispatcher @@ -110,7 +109,7 @@ await cut.InvokeAsync(async () => // Trigger a render to ensure state changes are reflected cut.Render(); - // Assert - Verify success message was set + // Render - Verify success message was set cut.WaitForAssertion(() => cut.Markup.ShouldContain("Merchant created successfully"), timeout: TimeSpan.FromSeconds(5)); } @@ -125,7 +124,7 @@ public async Task HandleSubmit_SuccessfulCreation_NavigatesToMerchantsList() Arg.Any()) .ReturnsAsync(Result.Success()); - var cut = RenderComponent(); + var cut = Render(); cut.Instance.SetDelayOverride(0); // Act - Use reflection to call the private HandleSubmit method on the Dispatcher @@ -138,7 +137,7 @@ await cut.InvokeAsync(async () => await task; }); - // Assert - Should navigate to /merchants + // Render - Should navigate to /merchants _fakeNavigationManager.Uri.ShouldContain("/merchants"); } @@ -153,7 +152,7 @@ public async Task HandleSubmit_FailedCreation_SetsErrorMessage() Arg.Any()) .ReturnsAsync(Result.Failure()); - var cut = RenderComponent(); + var cut = Render(); // Act - Use reflection to call the private HandleSubmit method on the Dispatcher var handleSubmitMethod = GetHandleSubmitMethod(); @@ -168,7 +167,7 @@ await cut.InvokeAsync(async () => // Trigger a render to ensure state changes are reflected cut.Render(); - // Assert - Verify error message was set + // Render - Verify error message was set cut.WaitForAssertion(() => cut.Markup.ShouldContain("Failed to create merchant"), timeout: TimeSpan.FromSeconds(5)); } @@ -183,7 +182,7 @@ public async Task HandleSubmit_FailedCreation_DoesNotNavigate() Arg.Any()) .ReturnsAsync(Result.Failure()); - var cut = RenderComponent(); + var cut = Render(); var initialUri = _fakeNavigationManager.Uri; // Act - Use reflection to call the private HandleSubmit method on the Dispatcher @@ -196,7 +195,7 @@ await cut.InvokeAsync(async () => await task; }); - // Assert - Should not navigate (should remain on the same page, not go to /merchants list) + // Render - Should not navigate (should remain on the same page, not go to /merchants list) _fakeNavigationManager.Uri.ShouldBe(initialUri); } @@ -224,7 +223,7 @@ public async Task HandleSubmit_CallsCreateMerchantWithCorrectParameters() return Task.CompletedTask; }); - var cut = RenderComponent(); + var cut = Render(); cut.Instance.SetDelayOverride(0); // Act - Use reflection to call the private HandleSubmit method on the Dispatcher @@ -237,7 +236,7 @@ await cut.InvokeAsync(async () => await task; }); - // Assert - Verify CreateMerchant was called with proper parameters + // Render - Verify CreateMerchant was called with proper parameters this.MerchantUIService.CreateMerchant( Arg.Any(), Arg.Any(), @@ -261,7 +260,7 @@ public async Task HandleSubmit_ClearsErrorMessageBeforeSubmit() Arg.Any()) .ReturnsAsync(Result.Success()); - var cut = RenderComponent(); + var cut = Render(); cut.Instance.SetDelayOverride(0); // Set an error message first using reflection @@ -286,7 +285,7 @@ await cut.InvokeAsync(async () => // Trigger a render to ensure state changes are reflected cut.Render(); - // Assert - Error message should be cleared and success message shown + // Render - Error message should be cleared and success message shown cut.Markup.ShouldNotContain("Previous error"); cut.Markup.ShouldContain("Merchant created successfully"); } diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs index 2a02af3e..e4a89978 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsViewPageTests.cs @@ -35,7 +35,7 @@ public void MerchantsView_InitialState_ShowsLoadingIndicator() this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); // Assert @@ -62,7 +62,7 @@ public void MerchantsView_WithMerchant_DisplaysMerchantName() this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -91,7 +91,7 @@ public void MerchantsView_HasCorrectPageTitle() this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); // Assert @@ -119,7 +119,7 @@ public void MerchantsView_HasBackButton() this.MerchantUIService.GetMerchantOpeningHours(Arg.Any(), Arg.Any(), Arg.Any()).ReturnsAsync(Result.Success(new MerchantModels.MerchantOpeningHoursModel())); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -132,12 +132,12 @@ public void MerchantsView_TabSwitch_ToAddress_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); @@ -150,12 +150,12 @@ public void MerchantsView_TabSwitch_ToContact_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contactButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Contact Details")); contactButton?.Click(); @@ -168,12 +168,12 @@ public void MerchantsView_TabSwitch_ToOperators_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -186,12 +186,12 @@ public void MerchantsView_TabSwitch_ToContracts_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -204,12 +204,12 @@ public void MerchantsView_TabSwitch_ToDevices_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -222,12 +222,12 @@ public void MerchantsView_TabSwitch_BackToDetails_UpdatesActiveTab() { // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -255,12 +255,12 @@ public void MerchantsView_DisplaysOperators_WhenPresent() SetupSuccessfulDataLoadWithOperators(operators); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -277,12 +277,12 @@ public void MerchantsView_DisplaysNoOperators_WhenNoneAssigned() // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? operatorsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Operators")); operatorsButton?.Click(); @@ -314,12 +314,12 @@ public void MerchantsView_DisplaysContracts_WhenPresent() SetupSuccessfulDataLoadWithContracts(contracts); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -336,12 +336,12 @@ public void MerchantsView_DisplaysNoContracts_WhenEmpty() // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contractsButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Contracts")); contractsButton?.Click(); @@ -363,12 +363,12 @@ public void MerchantsView_DisplaysDevices_WhenPresent() SetupSuccessfulDataLoadWithDevices(devices); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -382,12 +382,12 @@ public void MerchantsView_DisplaysNoDevices_WhenEmpty() // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? devicesButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Assigned Devices")); devicesButton?.Click(); @@ -403,7 +403,7 @@ public void MerchantsView_LoadMerchantData_LoadFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); // Assert @@ -426,7 +426,7 @@ public void MerchantsView_DisplaysMerchantDetails_WhenPresent() SetupSuccessfulDataLoadWithMerchant(merchant); - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, merchant.MerchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -455,12 +455,12 @@ public void MerchantsView_DisplaysAddressDetails_WhenPresent() SetupSuccessfulDataLoadWithMerchant(merchant); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? addressButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Address Details")); addressButton?.Click(); @@ -488,12 +488,12 @@ public void MerchantsView_DisplaysContactDetails_WhenPresent() SetupSuccessfulDataLoadWithMerchant(merchant); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? contactButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Contact Details")); contactButton?.Click(); @@ -510,11 +510,11 @@ public void MerchantsView_DisplaysOpeningHours_WhenPresent() { SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.MerchantId, Guid.NewGuid())); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? openingHoursButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Opening Hours")); openingHoursButton?.Click(); @@ -534,12 +534,12 @@ public void MerchantsView_BackButton_NavigatesToMerchantsList() // Arrange SetupSuccessfulDataLoad(); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton?.Click(); @@ -558,7 +558,7 @@ public void MerchantsView_ViewScheduleButton_NavigatesToReadOnlyMerchantSchedule MerchantReference = "REF001" }); - var cut = RenderComponent(parameters => parameters.Add(p => p.MerchantId, merchantId)); + var cut = Render(parameters => parameters.Add(p => p.MerchantId, merchantId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); cut.Find("#viewScheduleButton").Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs index d2abfd38..f19f4c7b 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/NotFoundPageTests.cs @@ -4,7 +4,7 @@ namespace EstateManagementUI.BlazorServer.Tests.Pages; -using TestContext = Bunit.TestContext; +using TestContext = Bunit.BunitContext; public class NotFoundPageTests : TestContext { @@ -12,7 +12,7 @@ public class NotFoundPageTests : TestContext public void NotFound_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Find("h3").TextContent.ShouldBe("Not Found"); @@ -23,7 +23,7 @@ public void NotFound_RendersCorrectly() public void NotFound_HasCorrectLayout() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldNotBeNullOrEmpty(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs index d8de2df3..9e3851e4 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsEditPageTests.cs @@ -28,7 +28,7 @@ public void OperatorsEdit_RendersCorrectly() .ReturnsAsync(Result.Success(operatorModel)); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -54,7 +54,7 @@ public void OperatorsEdit_HasCorrectPageTitle() .ReturnsAsync(Result.Success(operatorModel)); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); // Assert @@ -79,7 +79,7 @@ public void OperatorsEdit_LoadOperator_DisplaysOperatorDetails() .ReturnsAsync(Result.Success(operatorModel)); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -107,13 +107,13 @@ public void OperatorsEdit_BackToListButton_NavigatesToOperatorsList() this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton.ShouldNotBeNull(); backButton.Click(); @@ -138,13 +138,13 @@ public void OperatorsEdit_CancelButton_NavigatesToOperatorsList() this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? cancelButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Cancel")); cancelButton.ShouldNotBeNull(); cancelButton.Click(); @@ -172,7 +172,7 @@ public void OperatorsEdit_UpdateOperator_Success_ShowsSuccessMessageAndNavigates this.OperatorUIService.UpdateOperator(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -209,13 +209,13 @@ public void OperatorsEdit_UpdateOperator_Failure_ShowsErrorMessage() this.OperatorUIService.UpdateOperator(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Operator")); updateButton.ShouldNotBeNull(); updateButton.Click(); @@ -234,7 +234,7 @@ public void OperatorsEdit_LoadOperator_LoadFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); // Assert @@ -251,7 +251,7 @@ public void OperatorsEdit_OperatorNotFound_DisplaysMessage() .ReturnsAsync(Result.Success(null)); // Act - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -281,13 +281,13 @@ public void OperatorsEdit_SubmitButton_DisplaysSavingState() this.OperatorUIService.UpdateOperator(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) .Returns(tcs.Task); - IRenderedComponent cut = RenderComponent(parameters => parameters + IRenderedComponent cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? updateButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Update Operator")); updateButton.ShouldNotBeNull(); updateButton.Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs index d6693cb0..df0f1252 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsIndexPageTests.cs @@ -35,7 +35,7 @@ public void OperatorsIndex_RendersCorrectly() .ReturnsAsync(Result.Success(operators)); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Operator Management"); @@ -50,7 +50,7 @@ public void OperatorsIndex_WithNoOperators_ShowsEmptyState() .ReturnsAsync(Result.Success(emptyList)); // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin")); // Assert @@ -83,7 +83,7 @@ public void OperatorsIndex_WithOperators_DisplaysOperatorList() .ReturnsAsync(Result.Success(operators)); // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -110,7 +110,7 @@ public void OperatorsIndex_DisplaysCustomNumberRequirements() .ReturnsAsync(Result.Success(operators)); // Act - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Assert @@ -126,7 +126,7 @@ public void OperatorsIndex_HasCorrectPageTitle() .ReturnsAsync(Result.Success(new List())); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); @@ -151,7 +151,7 @@ public void OperatorsIndex_AddNewOperatorButton_NavigatesToNewOperatorPage() this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click "Add New Operator" button @@ -183,7 +183,7 @@ public void OperatorsIndex_ViewButton_NavigatesToOperatorViewPage() this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click View button (button with eye icon/title="View") @@ -215,7 +215,7 @@ public void OperatorsIndex_EditButton_NavigatesToOperatorEditPage() this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click Edit button (button with title="Edit") @@ -247,7 +247,7 @@ public void OperatorsIndex_TableRowClick_NavigatesToOperatorViewPage() this.OperatorUIService.GetOperators(Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operators)); - var cut = RenderComponent(); + var cut = Render(); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); // Act - Find and click table row @@ -268,7 +268,7 @@ public void OperatorsIndex_LoadOperators_LoadFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert _fakeNavigationManager.Uri.ShouldContain("error"); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs index ccc46581..fd0d3fa8 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsNewPageTests.cs @@ -15,7 +15,7 @@ public class OperatorsNewPageTests : BaseTest public void OperatorsNew_RendersCorrectly() { // Arrange & Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert cut.Markup.ShouldContain("Create New Operator"); @@ -25,7 +25,7 @@ public void OperatorsNew_RendersCorrectly() public void OperatorsNew_HasCorrectPageTitle() { // Arrange & Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert IRenderedComponent pageTitle = cut.FindComponent(); @@ -36,11 +36,11 @@ public void OperatorsNew_HasCorrectPageTitle() public void OperatorsNew_CancelButton_NavigatesToOperatorsIndex() { // Arrange - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Find and click the Cancel button - IRefreshableElementCollection buttons = cut.FindAll("button"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? cancelButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Cancel")); cancelButton.ShouldNotBeNull(); cancelButton.Click(); @@ -53,7 +53,7 @@ public void OperatorsNew_CancelButton_NavigatesToOperatorsIndex() public void OperatorsNew_CreateOperatorButton_IsPresent() { // Arrange - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Operator"), timeout: TimeSpan.FromSeconds(5)); // Act & Assert @@ -68,7 +68,7 @@ public void OperatorsNew_SuccessfulCreation_NavigatesToOperatorsIndex() this.OperatorUIService.CreateOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Fill in the form @@ -92,7 +92,7 @@ public void OperatorsNew_FailedCreation_ShowsErrorMessage() this.OperatorUIService.CreateOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Failure()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Fill in the form @@ -113,7 +113,7 @@ public void OperatorsNew_FailedCreation_ShowsErrorMessage() public void OperatorsNew_FormValidation_RequiresOperatorName() { // Arrange - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Submit form without operator name @@ -130,7 +130,7 @@ public void OperatorsNew_FormValidation_RequiresOperatorName() public void OperatorsNew_DisplaysCheckboxOptions() { // Arrange & Act - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); // Assert - Verify checkbox options are displayed cut.Markup.ShouldContain("Require Custom Merchant Number"); @@ -144,7 +144,7 @@ public void OperatorsNew_SuccessfulCreation_ShowsSuccessMessage() this.OperatorUIService.CreateOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success()); - IRenderedComponent cut = RenderComponent(); + IRenderedComponent cut = Render(); cut.WaitForAssertion(() => cut.Markup.ShouldContain("Create New Operator"), timeout: TimeSpan.FromSeconds(5)); // Act - Fill in the form diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs index 1d4dbb61..777bc83f 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs @@ -30,7 +30,7 @@ public void OperatorsView_RendersCorrectly() .ReturnsAsync(Result.Success(operatorModel)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); // Assert @@ -52,7 +52,7 @@ public void OperatorsView_DisplaysOperatorName() .ReturnsAsync(Result.Success(operatorModel)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -69,7 +69,7 @@ public void OperatorsView_HasCorrectPageTitle() .ReturnsAsync(Result.Success(new OperatorModels.OperatorModel { OperatorId = operatorId })); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); // Assert @@ -91,12 +91,12 @@ public void OperatorsView_BackToListButton_NavigatesToOperatorsIndex() this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(operatorModel)); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton?.Click(); @@ -121,7 +121,7 @@ public void OperatorsView_DisplaysRequireCustomMerchantNumber_WhenRequired() .ReturnsAsync(Result.Success(operatorModel)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -147,7 +147,7 @@ public void OperatorsView_DisplaysRequireCustomMerchantNumber_WhenNotRequired() .ReturnsAsync(Result.Success(operatorModel)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -173,7 +173,7 @@ public void OperatorsView_DisplaysRequireCustomTerminalNumber_WhenRequired() .ReturnsAsync(Result.Success(operatorModel)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -199,7 +199,7 @@ public void OperatorsView_DisplaysRequireCustomTerminalNumber_WhenNotRequired() .ReturnsAsync(Result.Success(operatorModel)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -217,7 +217,7 @@ public void OperatorsView_LoadOperator_LoadFails_NavigatesToError() .ReturnsAsync(Result.Failure()); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); // Assert @@ -233,7 +233,7 @@ public void OperatorsView_DisplaysOperatorNotFound_WhenOperatorIsNull() .ReturnsAsync(Result.Success(null)); // Act - var cut = RenderComponent(parameters => parameters + var cut = Render(parameters => parameters .Add(p => p.OperatorId, operatorId)); cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); @@ -249,12 +249,12 @@ public void OperatorsView_OperatorNotFoundBackButton_NavigatesToOperatorsIndex() this.OperatorUIService.GetOperator(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsAsync(Result.Success(null)); - var cut = RenderComponent(parameters => parameters + var cut = Render(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"); + IReadOnlyList buttons = cut.FindAll("button"); IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); backButton?.Click(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs index 84d33ef5..ffe52fa7 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Permissions/PermissionsIndexPageTests.cs @@ -21,7 +21,7 @@ public void PermissionsIndex_RendersCorrectly() .ReturnsAsync(new List()); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Permission Management"); @@ -35,7 +35,7 @@ public void PermissionsIndex_HasCorrectPageTitle() .ReturnsAsync(new List()); // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs index 79a566c1..dd52a413 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs @@ -6,7 +6,7 @@ using Imposter.Abstractions; using Shouldly; using System.Security.Claims; -using TestContext = Bunit.TestContext; +using TestContext = Bunit.BunitContext; namespace EstateManagementUI.BlazorServer.Tests.Pages; @@ -55,7 +55,7 @@ public PermissionsDebugPageTests() public void PermissionsDebug_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldNotBeNullOrEmpty(); @@ -65,7 +65,7 @@ public void PermissionsDebug_RendersCorrectly() public void PermissionsDebug_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs index 875b1f47..78af7730 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Reporting/ReportingIndexPageTests.cs @@ -15,7 +15,7 @@ public class ReportingIndexPageTests : BaseTest public void ReportingIndex_RendersCorrectly() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert cut.Markup.ShouldContain("Reporting"); @@ -25,7 +25,7 @@ public void ReportingIndex_RendersCorrectly() public void ReportingIndex_HasCorrectPageTitle() { // Act - var cut = RenderComponent(); + var cut = Render(); // Assert var pageTitle = cut.FindComponent(); diff --git a/EstateManagementUI.BlazorServer/Common/BoostrapperExtensions.cs b/EstateManagementUI.BlazorServer/Common/BoostrapperExtensions.cs index 6d63ecd2..800667ab 100644 --- a/EstateManagementUI.BlazorServer/Common/BoostrapperExtensions.cs +++ b/EstateManagementUI.BlazorServer/Common/BoostrapperExtensions.cs @@ -18,7 +18,6 @@ using Shared.General; using Shared.Serialisation; using System.Data.SqlTypes; -using System.Net; using System.Reflection; using System.Security.Claims; using System.Security.Cryptography.X509Certificates; @@ -63,14 +62,20 @@ public static WebApplication ConfigureTestLogin(this WebApplication app) { } public static WebApplicationBuilder ConfigureKestrel(this WebApplicationBuilder builder) { - // Configure Kestrel with certificate for HTTPS + // Use the configured URLs (hosting.json by default, ASPNETCORE_URLS for test overrides). + var urls = builder.Configuration["ASPNETCORE_URLS"] ?? builder.Configuration["urls"]; + if (!string.IsNullOrWhiteSpace(urls)) + { + builder.WebHost.UseUrls(urls); + } + + // Configure Kestrel defaults without binding a fixed endpoint. builder.WebHost.UseKestrel(options => { - var port = 5004; var testModeConfig = builder.Configuration.GetValue("AppSettings:TestMode", "Disabled"); var isTestMode = !string.Equals(testModeConfig, "Disabled", StringComparison.OrdinalIgnoreCase); - options.Listen(IPAddress.Any, port, listenOptions => + options.ConfigureEndpointDefaults(listenOptions => { // Enable support for HTTP1 and HTTP2 listenOptions.Protocols = HttpProtocols.Http1AndHttp2; @@ -121,6 +126,7 @@ public static WebApplicationBuilder LoadConfiguration(this WebApplicationBuilder .AddJsonFile($"/home/txnproc/config/appsettings.{builder.Environment.EnvironmentName}.json", optional: true) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true) + .AddJsonFile("hosting.json", optional: true, reloadOnChange: true) .AddJsonFile($"/home/txnproc/config/appsettings.local.json", optional: true) .AddEnvironmentVariables().AddInMemoryCollection(new Dictionary { @@ -257,7 +263,7 @@ public static WebApplicationBuilder RegisterPermissionServices(this WebApplicati return builder; } - public static WebApplicationBuilder RegisterProductionMeriator(this WebApplicationBuilder builder) { + public static WebApplicationBuilder RegisterProductionMediator(this WebApplicationBuilder builder) { builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(EstateRequestHandler).Assembly)); builder.Services.AddScoped(); builder.Services.AddSingleton>(container => (serviceName) => ConfigurationReader.GetBaseServerUri(serviceName).OriginalString); diff --git a/EstateManagementUI.BlazorServer/Program.cs b/EstateManagementUI.BlazorServer/Program.cs index 6f0f16f7..b33ccb91 100644 --- a/EstateManagementUI.BlazorServer/Program.cs +++ b/EstateManagementUI.BlazorServer/Program.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Components.Server; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.FileProviders; using Sentry.Extensibility; using Shared.Extensions; using Shared.General; @@ -90,7 +91,7 @@ } else { - builder.RegisterProductionMeriator().RegisterClients(); + builder.RegisterProductionMediator().RegisterClients(); } builder.RegisterUIServices().RegisterSerialiser(); @@ -153,6 +154,11 @@ Uri ValidateAndCreateUri(string url, string configKey) app.UseHttpsRedirection(); } +app.UseStaticFiles(new StaticFileOptions +{ + FileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "wwwroot")) +}); +app.UseRouting(); app.UseSession(); app.UseAuthentication(); app.UseAuthorization(); @@ -213,4 +219,4 @@ public static HttpClientHandler ApiEndpointHttpHandler(IServiceProvider serviceP } }; } -} \ No newline at end of file +}