Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,29 @@ public async Task LoginRequestHandler_Handle_LoginRequest_IsHandled()

LoginRequest request = LoginRequest.Create(TestData.UserName,TestData.Password);

String accessToken = await handler.Handle(request, CancellationToken.None);
TokenResponseModel accessToken = await handler.Handle(request, CancellationToken.None);

accessToken.ShouldBe(TestData.AccessToken);
accessToken.AccessToken.ShouldBe(TestData.Token);
accessToken.ExpiryInMinutes.ShouldBe(TestData.TokenExpiryInMinutes);
accessToken.RefreshToken.ShouldBe(TestData.RefreshToken);
}

[Fact]
public async Task LoginRequestHandler_Handle_RefreshTokenRequest_IsHandled()
{
Mock<IAuthenticationService> authenticationService = new Mock<IAuthenticationService>();
authenticationService.Setup(a => a.RefreshAccessToken(It.IsAny<String>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.AccessToken);
Mock<IConfigurationService> configurationService = new Mock<IConfigurationService>();
configurationService.Setup(c => c.GetConfiguration(It.IsAny<String>(), It.IsAny<CancellationToken>())).ReturnsAsync(new Configuration());
LoginRequestHandler handler = new LoginRequestHandler(authenticationService.Object, configurationService.Object);

RefreshTokenRequest request = RefreshTokenRequest.Create(TestData.RefreshToken);

TokenResponseModel accessToken = await handler.Handle(request, CancellationToken.None);

accessToken.AccessToken.ShouldBe(TestData.Token);
accessToken.ExpiryInMinutes.ShouldBe(TestData.TokenExpiryInMinutes);
accessToken.RefreshToken.ShouldBe(TestData.RefreshToken);
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public async Task MerchantRequestHandler_GetContractProductsRequest_Handle_IsHan
.ReturnsAsync(TestData.ContractProductList);
MerchantRequestHandler handler = new MerchantRequestHandler(merchantService.Object);

GetContractProductsRequest request = GetContractProductsRequest.Create(TestData.AccessToken,
GetContractProductsRequest request = GetContractProductsRequest.Create(TestData.Token,
TestData.EstateId,
TestData.MerchantId,
null);
Expand All @@ -40,7 +40,7 @@ public async Task MerchantRequestHandler_GetMerchantBalanceRequest_Handle_IsHand
.ReturnsAsync(TestData.MerchantBalance);
MerchantRequestHandler handler = new MerchantRequestHandler(merchantService.Object);

GetMerchantBalanceRequest request = GetMerchantBalanceRequest.Create(TestData.AccessToken,
GetMerchantBalanceRequest request = GetMerchantBalanceRequest.Create(TestData.Token,
TestData.EstateId,
TestData.MerchantId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,17 @@ public class TransactionRequestHandlerTests
public async Task TransactionRequestHandler_LogonTransactionRequest_Handle_IsHandled()
{
Mock<ITransactionService> transactionService = new Mock<ITransactionService>();
transactionService.Setup(t => t.PerformLogon(It.IsAny<PerformLogonRequestModel>(), It.IsAny<CancellationToken>())).ReturnsAsync(true);
transactionService.Setup(t => t.PerformLogon(It.IsAny<PerformLogonRequestModel>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.PerformLogonResponseModel);
TransactionRequestHandler handler = new TransactionRequestHandler(transactionService.Object);

LogonTransactionRequest request = LogonTransactionRequest.Create(TestData.TransactionDateTime,
TestData.TransactionNumber,
TestData.DeviceIdentifier,
TestData.ApplicationVersion);

Boolean response = await handler.Handle(request, CancellationToken.None);
PerformLogonResponseModel? response = await handler.Handle(request, CancellationToken.None);

response.ShouldBeTrue();
response.IsSuccessful.ShouldBeTrue();
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,26 @@ public class RequestTests
[Fact]
public void GetContractProductsRequest_Create_IsCreated()
{
GetContractProductsRequest request = GetContractProductsRequest.Create(TestData.AccessToken,
GetContractProductsRequest request = GetContractProductsRequest.Create(TestData.Token,
TestData.EstateId,
TestData.MerchantId,
null);

request.ShouldNotBeNull();
request.AccessToken.ShouldBe(TestData.AccessToken);
request.AccessToken.ShouldBe(TestData.Token);
request.EstateId.ShouldBe(TestData.EstateId);
request.MerchantId.ShouldBe(TestData.MerchantId);
}

[Fact]
public void GetMerchantBalanceRequest_Create_IsCreated()
{
GetMerchantBalanceRequest request = GetMerchantBalanceRequest.Create(TestData.AccessToken,
GetMerchantBalanceRequest request = GetMerchantBalanceRequest.Create(TestData.Token,
TestData.EstateId,
TestData.MerchantId);

request.ShouldNotBeNull();
request.AccessToken.ShouldBe(TestData.AccessToken);
request.AccessToken.ShouldBe(TestData.Token);
request.EstateId.ShouldBe(TestData.EstateId);
request.MerchantId.ShouldBe(TestData.MerchantId);
}
Expand All @@ -50,6 +50,15 @@ public void LoginRequest_Create_IsCreated()
request.Password.ShouldBe(TestData.Password);
}

[Fact]
public void RefreshTokenRequest_Create_IsCreated()
{
RefreshTokenRequest request = RefreshTokenRequest.Create(TestData.RefreshToken);

request.ShouldNotBeNull();
request.RefreshToken.ShouldBe(TestData.RefreshToken);
}

[Fact]
public void LogonTransactionRequest_Create_IsCreated()
{
Expand Down
24 changes: 23 additions & 1 deletion TransactionMobile.Maui.BusinessLogic.Tests/TestData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,23 @@

namespace TransactionMobile.Maui.BusinessLogic.Tests
{
using Microsoft.Win32.SafeHandles;
using Models;

public static class TestData
{
public static String AccessToken = "Token";
public static TokenResponseModel AccessToken =>
new TokenResponseModel
{
ExpiryInMinutes = TestData.TokenExpiryInMinutes,
AccessToken = TestData.Token,
RefreshToken = TestData.RefreshToken
};

public static String Token = "Token";

public static String RefreshToken = "RefreshToken";
public static Int32 TokenExpiryInMinutes = 5;
public static Guid EstateId = Guid.Parse("21D339F4-C97F-4C30-A212-11CA01E2D508");
public static Guid MerchantId = Guid.Parse("E8B4B839-434A-43A2-B373-D8813F63F615");

Expand Down Expand Up @@ -128,6 +140,16 @@ public static class TestData
public static String RecipientEmailAddress = "1@2.com";

public static Decimal MerchantBalance = 199.99m;

public static PerformLogonResponseModel PerformLogonResponseModel =>
new PerformLogonResponseModel
{
EstateId = TestData.EstateId,
MerchantId = TestData.MerchantId,
IsSuccessful = true,
RequireApplicationUpdate = false,
ResponseMessage = "SUCCESS"
};
}
}

Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
namespace TransactionMobile.Maui.BusinessLogic.Tests.ViewModelTests;

using System;
using System.Threading;
using Maui.UIServices;
using MediatR;
using Microsoft.Extensions.Caching.Memory;
using Models;
using Moq;
using Requests;
using UIServices;
Expand All @@ -16,9 +19,19 @@ public void LoginPageViewModel_LoginCommand_Execute_IsExecuted()
{
Mock<IMediator> mediator = new Mock<IMediator>();
Mock<INavigationService> navigationService = new Mock<INavigationService>();
LoginPageViewModel viewModel = new LoginPageViewModel(mediator.Object, navigationService.Object);
MemoryCache userDetailsCache = new MemoryCache(new MemoryCacheOptions());
IMemoryCache configurationCache = new MemoryCache(new MemoryCacheOptions());
Mock<IDeviceService> deviceService = new Mock<IDeviceService>();
Mock<IApplicationInfoService> applicationInfoService = new Mock<IApplicationInfoService>();
LoginPageViewModel viewModel = new LoginPageViewModel(mediator.Object, navigationService.Object,userDetailsCache,configurationCache,
deviceService.Object,applicationInfoService.Object);

mediator.Setup(m => m.Send(It.IsAny<GetConfigurationRequest>(), It.IsAny<CancellationToken>())).ReturnsAsync(new Configuration());
mediator.Setup(m => m.Send(It.IsAny<LoginRequest>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.AccessToken);
mediator.Setup(m => m.Send(It.IsAny<LogonTransactionRequest>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.PerformLogonResponseModel);

viewModel.LoginCommand.Execute(null);

mediator.Verify(x => x.Send(It.IsAny<LoginRequest>(), It.IsAny<CancellationToken>()), Times.Once);
mediator.Verify(x => x.Send(It.IsAny<LogonTransactionRequest>(), It.IsAny<CancellationToken>()), Times.Once);
mediator.Verify(x => x.Send(It.IsAny<GetContractProductsRequest>(), It.IsAny<CancellationToken>()), Times.Once);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
namespace TransactionMobile.Maui.BusinessLogic.Models;

public class PerformLogonResponseModel
{
#region Properties

public Boolean IsSuccessful { get; set; }

public String ResponseMessage { get; set; }

public Guid EstateId { get; set; }

public Guid MerchantId { get; set; }

public Boolean RequireApplicationUpdate { get; set; }

#endregion
}
14 changes: 14 additions & 0 deletions TransactionMobile.Maui.BusinessLogic/Models/TokenResponseModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TransactionMobile.Maui.BusinessLogic.Models;

public class TokenResponseModel
{
public String AccessToken { get; set; }
public String RefreshToken { get; set; }
public Int32 ExpiryInMinutes { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
using Requests;
using Services;

public class LoginRequestHandler : IRequestHandler<LoginRequest, String>,
public class LoginRequestHandler : IRequestHandler<LoginRequest, TokenResponseModel>,
IRequestHandler<RefreshTokenRequest, TokenResponseModel>,
IRequestHandler<GetConfigurationRequest, Configuration>
{
private readonly IConfigurationService ConfigurationService;
Expand All @@ -29,10 +30,10 @@ public LoginRequestHandler(IAuthenticationService authenticationService,

#region Methods

public async Task<String> Handle(LoginRequest request,
CancellationToken cancellationToken)
public async Task<TokenResponseModel> Handle(LoginRequest request,
CancellationToken cancellationToken)
{
var token = await this.AuthenticationService.GetToken(request.UserName, request.Password, cancellationToken);
TokenResponseModel token = await this.AuthenticationService.GetToken(request.UserName, request.Password, cancellationToken);

return token;
}
Expand All @@ -44,5 +45,13 @@ public async Task<Configuration> Handle(GetConfigurationRequest request,
}

#endregion

public async Task<TokenResponseModel> Handle(RefreshTokenRequest request,
CancellationToken cancellationToken)
{
TokenResponseModel token = await this.AuthenticationService.RefreshAccessToken(request.RefreshToken, cancellationToken);

return token;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
using Services;

public class TransactionRequestHandler : IRequestHandler<PerformMobileTopupRequest, Boolean>,
IRequestHandler<LogonTransactionRequest, Boolean>,
IRequestHandler<LogonTransactionRequest, PerformLogonResponseModel>,
IRequestHandler<PerformVoucherIssueRequest, Boolean>
{
#region Fields
Expand Down Expand Up @@ -49,8 +49,8 @@ public async Task<Boolean> Handle(PerformMobileTopupRequest request,
return result;
}

public async Task<Boolean> Handle(LogonTransactionRequest request,
CancellationToken cancellationToken)
public async Task<PerformLogonResponseModel> Handle(LogonTransactionRequest request,
CancellationToken cancellationToken)
{
// TODO: Factory
PerformLogonRequestModel model = new PerformLogonRequestModel
Expand All @@ -61,7 +61,7 @@ public async Task<Boolean> Handle(LogonTransactionRequest request,
TransactionNumber = request.TransactionNumber
};

Boolean result = await this.TransactionService.PerformLogon(model, cancellationToken);
PerformLogonResponseModel result = await this.TransactionService.PerformLogon(model, cancellationToken);

return result;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
namespace TransactionMobile.Maui.BusinessLogic.Requests
{
using MediatR;
using Models;

public class LoginRequest : IRequest<String>
public class LoginRequest : IRequest<TokenResponseModel>
{
#region Constructors

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
namespace TransactionMobile.Maui.BusinessLogic.Requests;

using MediatR;
using Models;

public class LogonTransactionRequest : IRequest<Boolean>
public class LogonTransactionRequest : IRequest<PerformLogonResponseModel>
{
public String DeviceIdentifier { get; private set; }
public DateTime TransactionDateTime { get; private set; }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace TransactionMobile.Maui.BusinessLogic.Requests;

using MediatR;
using Models;

public class RefreshTokenRequest : IRequest<TokenResponseModel>
{
#region Constructors

private RefreshTokenRequest(String refreshToken)
{
this.RefreshToken = refreshToken;
}

#endregion

#region Properties

public String RefreshToken { get; }

#endregion

#region Methods

public static RefreshTokenRequest Create(String refreshToken)
{
return new RefreshTokenRequest(refreshToken);
}

#endregion
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,32 @@
namespace TransactionMobile.Maui.BusinessLogic.Services.DummyServices;

using Models;

public class DummyAuthenticationService : IAuthenticationService
{
#region Methods

public async Task<String> GetToken(String username,
String password,
CancellationToken cancellationToken)
public async Task<TokenResponseModel> GetToken(String username,
String password,
CancellationToken cancellationToken)
{
return new TokenResponseModel
{
AccessToken = "Token",
RefreshToken = "RefreshToken",
ExpiryInMinutes = 1
};
}

public async Task<TokenResponseModel> RefreshAccessToken(String refreshToken,
CancellationToken cancellationToken)
{
return "MyToken";
return new TokenResponseModel
{
AccessToken = "Token",
RefreshToken = "RefreshToken",
ExpiryInMinutes = 1
};
}

#endregion
Expand Down
Loading