diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs index 0f5ce3a2..b3834de1 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Operators/OperatorsViewPageTests.cs @@ -1,3 +1,4 @@ +using AngleSharp.Dom; using Bunit; using EstateManagementUI.BlazorServer.Components.Pages.Operators; using EstateManagementUI.BlazorServer.Models; @@ -75,4 +76,189 @@ public void OperatorsView_HasCorrectPageTitle() var pageTitle = cut.FindComponent(); pageTitle.Instance.ChildContent.ShouldNotBeNull(); } + + [Fact] + public void OperatorsView_BackToListButton_NavigatesToOperatorsIndex() + { + // Arrange + var operatorId = Guid.NewGuid(); + var operatorModel = new OperatorModels.OperatorModel + { + OperatorId = operatorId, + Name = "Test Operator" + }; + + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(operatorModel)); + + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); + + // Act - Find and click "Back to List" button + IRefreshableElementCollection buttons = cut.FindAll("button"); + IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); + backButton?.Click(); + + // Assert + _fakeNavigationManager.Uri.ShouldContain("/operators"); + } + + [Fact] + public void OperatorsView_DisplaysRequireCustomMerchantNumber_WhenRequired() + { + // Arrange + var operatorId = Guid.NewGuid(); + var operatorModel = new OperatorModels.OperatorModel + { + OperatorId = operatorId, + Name = "Test Operator", + RequireCustomMerchantNumber = true, + RequireCustomTerminalNumber = false + }; + + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(operatorModel)); + + // Act + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); + + // Assert + cut.Markup.ShouldContain("Required"); + cut.Markup.ShouldContain("Require Custom Merchant Number"); + } + + [Fact] + public void OperatorsView_DisplaysRequireCustomMerchantNumber_WhenNotRequired() + { + // Arrange + var operatorId = Guid.NewGuid(); + var operatorModel = new OperatorModels.OperatorModel + { + OperatorId = operatorId, + Name = "Test Operator", + RequireCustomMerchantNumber = false, + RequireCustomTerminalNumber = false + }; + + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(operatorModel)); + + // Act + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); + + // Assert + cut.Markup.ShouldContain("Not Required"); + cut.Markup.ShouldContain("Require Custom Merchant Number"); + } + + [Fact] + public void OperatorsView_DisplaysRequireCustomTerminalNumber_WhenRequired() + { + // Arrange + var operatorId = Guid.NewGuid(); + var operatorModel = new OperatorModels.OperatorModel + { + OperatorId = operatorId, + Name = "Test Operator", + RequireCustomMerchantNumber = false, + RequireCustomTerminalNumber = true + }; + + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(operatorModel)); + + // Act + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); + + // Assert + cut.Markup.ShouldContain("Required"); + cut.Markup.ShouldContain("Require Custom Terminal Number"); + } + + [Fact] + public void OperatorsView_DisplaysRequireCustomTerminalNumber_WhenNotRequired() + { + // Arrange + var operatorId = Guid.NewGuid(); + var operatorModel = new OperatorModels.OperatorModel + { + OperatorId = operatorId, + Name = "Test Operator", + RequireCustomMerchantNumber = false, + RequireCustomTerminalNumber = false + }; + + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(operatorModel)); + + // Act + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); + + // Assert + cut.Markup.ShouldContain("Not Required"); + cut.Markup.ShouldContain("Require Custom Terminal Number"); + } + + [Fact] + public void OperatorsView_LoadOperator_LoadFails_NavigatesToError() + { + // Arrange + var operatorId = Guid.NewGuid(); + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Failure()); + + // Act + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + + // Assert + _fakeNavigationManager.Uri.ShouldContain("error"); + } + + [Fact] + public void OperatorsView_DisplaysOperatorNotFound_WhenOperatorIsNull() + { + // Arrange + var operatorId = Guid.NewGuid(); + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(null)); + + // Act + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); + + // Assert + cut.Markup.ShouldContain("Operator not found"); + } + + [Fact] + public void OperatorsView_OperatorNotFoundBackButton_NavigatesToOperatorsIndex() + { + // Arrange + var operatorId = Guid.NewGuid(); + this.OperatorUIService.Setup(o => o.GetOperator(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(null)); + + var cut = RenderComponent(parameters => parameters + .Add(p => p.OperatorId, operatorId)); + cut.WaitForState(() => !cut.Markup.Contains("animate-spin"), TimeSpan.FromSeconds(5)); + + // Act - Find and click "Back to List" button + IRefreshableElementCollection buttons = cut.FindAll("button"); + IElement? backButton = buttons.FirstOrDefault(b => b.TextContent.Contains("Back to List")); + backButton?.Click(); + + // Assert + _fakeNavigationManager.Uri.ShouldContain("/operators"); + } }