using FluentAssertions; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Localization; using Moq; using NUnit.Framework; using Radzen; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using WotBlitzStatisticsPro.Blazor.GraphQl; using WotBlitzStatisticsPro.Blazor.Messages; using WotBlitzStatisticsPro.Blazor.Model; using WotBlitzStatisticsPro.Blazor.Services; namespace WotBlitzStatisticsPro.Blazor.Tests.Services { public class WargamingLoginServiceTests: TestContextBase { private Mock _graphQlBackendMock; private Mock _localStorageMock; private WargamingLoginService _service; [SetUp] public void Setup() { _graphQlBackendMock = new(); _localStorageMock = new(); _service = new WargamingLoginService( _graphQlBackendMock.Object, TestContext.Services.GetService(), TestContext.Services.GetService>(), NavigationManagerMock, _localStorageMock.Object, MediatorMock.Object ); } [Test] public async Task ShouldRequestRedirectUrlFromBackendWhenRedirectToWgLoginMessageArrives() { var realm = RealmType.Eu; string url = "/fakeUrl"; _graphQlBackendMock.Setup(b => b.GetWgLoginUrl(realm)).ReturnsAsync(url); await _service.Handle(new RedirectToWgLoginMessage(realm), CancellationToken.None); _graphQlBackendMock.Verify(b => b.GetWgLoginUrl(realm), Times.Once); } [Test] public async Task ShouldNavigateToAppropriateUrlWhenRedirectToWgLoginMessageArrives() { var realm = RealmType.Eu; string url = "/fakeUrl"; _graphQlBackendMock.Setup(b => b.GetWgLoginUrl(It.IsAny())).ReturnsAsync(url); await _service.Handle(new RedirectToWgLoginMessage(realm), CancellationToken.None); NavigationManagerMock.NavigationCount.Should().Be(1); NavigationManagerMock.Uri.Should().Be($"https://unit-test.example{url}&redirect_uri=https://unit-test.example/login/{realm}"); } [Test] public async Task ShouldStoreAppropriateDataToLocalStorageWhenRedirectFromWgLoginMessageArrives() { var realm = RealmType.Asia; string nick = "fakeNick"; string token = "fakeToken"; long accountId = 123456789; long expiration = 987654321; await _service.Handle(new RedirectFromWgLoginMessage(realm, nick, accountId, token, expiration), CancellationToken.None); _localStorageMock.Verify(s => s.SetItemAsync( Constants.LoginInfoLocalStorageKey, It.Is(l => l.Realm == realm && l.NickName == nick && l.AccountId == accountId && l.AccessToken == token && l.ExpiresAt == expiration)) , Times.Once); } [Test] public async Task ShouldFireOnPlayerInfoMessageWhenRedirectFromWgLoginMessageArrives() { var realm = RealmType.Asia; string nick = "fakeNick"; string token = "fakeToken"; long accountId = 123456789; long expiration = 987654321; await _service.Handle(new RedirectFromWgLoginMessage(realm, nick, accountId, token, expiration), CancellationToken.None); MediatorMock.Verify(m => m.Publish( It.Is(m => m.AccountId == accountId && m.IsLoggedIn), It.IsAny()), Times.Once); } } }