using System; using System.Threading; using AngleSharp.Dom; using Bunit; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; using WotBlitzStatisticsPro.Blazor.Messages; using WotBlitzStatisticsPro.Blazor.Model; using WotBlitzStatisticsPro.Blazor.Services; using WotBlitzStatisticsPro.Blazor.Shared; using Index = WotBlitzStatisticsPro.Blazor.Pages.Index; namespace WotBlitzStatisticsPro.Blazor.Tests.Pages { public class NavMenuAndIndexPageTests: TestContextBase { public enum ComponentType { NavMenu, Index } private IRenderedComponent _navMenuComponent; private IRefreshableElementCollection _navMenuElements; private IRenderedComponent _indexComponent; private IRefreshableElementCollection _indexButtons; private LoginInfo _loginInfo; private Mock _localStorageServiceMock; [SetUp] public void Setup() { _loginInfo = new LoginInfo { NickName = "Fake_Nick", AccountId = 123456789 }; _localStorageServiceMock = new(); TestContext?.Services.AddSingleton(_localStorageServiceMock.Object); _navMenuComponent = TestContext?.RenderComponent(); _indexComponent = TestContext?.RenderComponent(); _navMenuElements = _navMenuComponent?.FindAll(".rz-navigation-item"); _navMenuElements.Should().NotBeNull(); _navMenuElements?.Count.Should().Be(4); _indexButtons = _indexComponent?.FindAll(".rz-button"); _indexButtons.Should().NotBeNull(); _indexButtons?.Count.Should().Be(3); } [Test] public void MavMenuShouldNavigateToRootWhenHomePressed() { var homeElement = _navMenuElements[0]; homeElement.Should().NotBeNull(); homeElement.Click(); NavigationManagerMock.Uri.Should().Be(NavigationManagerMock.BaseUri); } [TestCase(ComponentType.NavMenu)] [TestCase(ComponentType.Index)] public void ShouldFireLoginMediatorEventWhenElementClicked(ComponentType componentType) { var targetElement = componentType switch { ComponentType.NavMenu => _navMenuElements[1], ComponentType.Index => _indexButtons[0], _ => throw new ArgumentOutOfRangeException(nameof(componentType), componentType, null) }; targetElement.Click(); MediatorMock.Verify(m => m.Publish(It.IsAny(), It.IsAny()), Times.Once); } [TestCase(ComponentType.NavMenu)] [TestCase(ComponentType.Index)] public void ShouldFireOpenPlayerSearchMediatorEventWhenElementClicked(ComponentType componentType) { var targetElement = componentType switch { ComponentType.NavMenu => _navMenuElements[2], ComponentType.Index => _indexButtons[1], _ => throw new ArgumentOutOfRangeException(nameof(componentType), componentType, null) }; targetElement.Click(); MediatorMock.Verify(m => m.Publish( It.Is(m => m.Type == DialogType.FindPlayer), It.IsAny()), Times.Once); } [TestCase(ComponentType.NavMenu)] [TestCase(ComponentType.Index)] public void ShouldFireOpenClansSearchMediatorEventWhenElementClicked(ComponentType componentType) { var targetElement = componentType switch { ComponentType.NavMenu => _navMenuElements[3], ComponentType.Index => _indexButtons[2], _ => throw new ArgumentOutOfRangeException(nameof(componentType), componentType, null) }; targetElement.Click(); MediatorMock.Verify(m => m.Publish( It.Is(m => m.Type == DialogType.FindClan), It.IsAny()), Times.Once); } [TestCase(ComponentType.NavMenu)] [TestCase(ComponentType.Index)] public void ShouldShowLoginItemAndHideNickIfLoginInfoIsMissing(ComponentType componentType) { switch (componentType) { case ComponentType.NavMenu: _navMenuElements.Should().Contain(e => e.InnerHtml.Contains("Login with WG.net ID")); _navMenuElements.Should().NotContain(e => e.InnerHtml.Contains(_loginInfo.NickName)); _navMenuElements.Should().NotContain(e => e.InnerHtml.Contains("Log out")); break; case ComponentType.Index: _indexButtons.Should().Contain(e => e.InnerHtml.Contains("Login with WG.net ID")); _indexButtons.Should().NotContain(e => e.InnerHtml.Contains(_loginInfo.NickName)); _indexButtons.Should().NotContain(e => e.InnerHtml.Contains("Log out")); break; } } [TestCase(ComponentType.NavMenu)] [TestCase(ComponentType.Index)] public void ShouldShowNickItemAndHideLoginIfLoginInfoIsPresent(ComponentType componentType) { _localStorageServiceMock.Setup(s => s.GetItemAsync(It.IsAny())).ReturnsAsync(_loginInfo); switch (componentType) { case ComponentType.NavMenu: var navMenuComponent = TestContext?.RenderComponent(); var navMenuElements = navMenuComponent?.FindAll(".rz-navigation-item"); navMenuElements.Should().NotBeNull(); navMenuElements.Count.Should().Be(5); navMenuElements.Should().NotContain(e => e.InnerHtml.Contains("Login with WG.net ID")); navMenuElements.Should().Contain(e => e.InnerHtml.Contains(_loginInfo.NickName)); navMenuElements.Should().Contain(e => e.InnerHtml.Contains("Log out")); break; case ComponentType.Index: var indexComponent = TestContext?.RenderComponent(); var indexButtons = indexComponent?.FindAll(".rz-button"); indexButtons.Should().NotBeNull(); indexButtons.Count.Should().Be(4); indexButtons.Should().NotContain(e => e.InnerHtml.Contains("Login with WG.net ID")); indexButtons.Should().Contain(e => e.InnerHtml.Contains(_loginInfo.NickName)); indexButtons.Should().Contain(e => e.InnerHtml.Contains("Log out")); break; } } [TestCase(ComponentType.NavMenu)] [TestCase(ComponentType.Index)] public void ShouldFireOpenPlayerMessageWhenNickItemClicked(ComponentType componentType) { _localStorageServiceMock.Setup(s => s.GetItemAsync(It.IsAny())).ReturnsAsync(_loginInfo); IElement targetElement = null; switch (componentType) { case ComponentType.NavMenu: var navMenuComponent = TestContext?.RenderComponent(); var navMenuElements = navMenuComponent?.FindAll(".rz-navigation-item"); targetElement = navMenuElements[1]; break; case ComponentType.Index: var indexComponent = TestContext?.RenderComponent(); var indexButtons = indexComponent?.FindAll(".rz-button"); targetElement = indexButtons[0]; break; } targetElement?.Click(); MediatorMock.Verify(m => m.Publish( It.Is(m => m.AccountId == _loginInfo.AccountId && m.IsLoggedIn), It.IsAny()), Times.Once); } [TestCase(ComponentType.NavMenu)] [TestCase(ComponentType.Index)] public void ShouldFireLoGoutMessageIfLogOutItemClicked(ComponentType componentType) { _localStorageServiceMock.Setup(s => s.GetItemAsync(It.IsAny())).ReturnsAsync(_loginInfo); IElement targetElement = null; switch (componentType) { case ComponentType.NavMenu: var navMenuComponent = TestContext?.RenderComponent(); var navMenuElements = navMenuComponent?.FindAll(".rz-navigation-item"); targetElement = navMenuElements[2]; break; case ComponentType.Index: var indexComponent = TestContext?.RenderComponent(); var indexButtons = indexComponent?.FindAll(".rz-button"); targetElement = indexButtons[1]; break; } targetElement?.Click(); MediatorMock.Verify(m => m.Publish( It.IsAny(), It.IsAny()), Times.Once); } } }