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
12 changes: 11 additions & 1 deletion .github/workflows/pullrequest_android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ jobs:
- name: Checkout
uses: actions/checkout@v2

- name: Setup MSBuild
uses: microsoft/setup-msbuild@v1.1
with:
vs-prerelease: true
msbuild-architecture: x64

- name: Setup .NET 6
uses: actions/setup-dotnet@v1
with:
Expand All @@ -32,8 +38,12 @@ jobs:

- name: Install MAUI Workloads
run: |
dotnet workload install android --ignore-failed-sources
dotnet workload install maui --ignore-failed-sources
dotnet workload install maui-android --ignore-failed-sources
dotnet workload install maui-desktop --ignore-failed-sources
dotnet workload install maui-ios --ignore-failed-sources
dotnet workload install maui-mobile --ignore-failed-sources
dotnet workload install maui-windows --ignore-failed-sources

- name: Restore Dependencies
run: dotnet restore TransactionMobile.Maui.sln --source https://api.nuget.org/v3/index.json --source https://www.myget.org/F/transactionprocessing/api/v3/index.json --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json
Expand Down
8 changes: 6 additions & 2 deletions .github/workflows/pullrequest_ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,19 @@ jobs:
dotnet-version: 6.0.200-preview.22055.15
include-prerelease: true

#- run: dotnet tool update -g dotnet-vs
- name: Setup .NET 6
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
include-prerelease: true

- name: Install MAUI Workloads
run: |
dotnet workload install ios --ignore-failed-sources
dotnet workload install maui --ignore-failed-sources

- name: Restore Dependencies
run: dotnet restore TransactionMobile.Maui.sln
run: dotnet restore TransactionMobile.Maui.sln --source https://api.nuget.org/v3/index.json --source https://www.myget.org/F/transactionprocessing/api/v3/index.json --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json

- name: Build Code
run: dotnet build TransactionMobile.Maui/TransactionMobile.Maui.csproj -c Release -f net6.0-ios --no-restore
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pullrequest_maccatalyst.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
dotnet workload install maui --ignore-failed-sources

- name: Restore Dependencies
run: dotnet restore TransactionMobile.Maui.sln
run: dotnet restore TransactionMobile.Maui.sln --source https://api.nuget.org/v3/index.json --source https://www.myget.org/F/transactionprocessing/api/v3/index.json --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json

- name: Build Code
run: dotnet build TransactionMobile.Maui/TransactionMobile.Maui.csproj -c Release -f net6.0-maccatalyst --no-restore
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/pullrequest_windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ jobs:
- name: Install MAUI Workloads
run: |
dotnet workload install maui --ignore-failed-sources
dotnet workload install maui-desktop --ignore-failed-sources
dotnet workload install maui-mobile --ignore-failed-sources
dotnet workload install maui-windows --ignore-failed-sources

- name: Restore Dependencies
run: dotnet restore TransactionMobile.Maui.sln --source https://api.nuget.org/v3/index.json --source https://www.myget.org/F/transactionprocessing/api/v3/index.json --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Memory;
using Models;
using Moq;
using RequestHandlers;
Expand All @@ -18,14 +19,14 @@ public class MerchantRequestHandlerTests
public async Task MerchantRequestHandler_GetContractProductsRequest_Handle_IsHandled()
{
Mock<IMerchantService> merchantService = new Mock<IMerchantService>();
merchantService.Setup(m => m.GetContractProducts(It.IsAny<String>(), It.IsAny<Guid>(), It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
merchantService.Setup(m => m.GetContractProducts(It.IsAny<CancellationToken>()))
.ReturnsAsync(TestData.ContractProductList);
MerchantRequestHandler handler = new MerchantRequestHandler(merchantService.Object);
Mock<IMemoryCacheService> memoryCacheService = new Mock<IMemoryCacheService>();


GetContractProductsRequest request = GetContractProductsRequest.Create(TestData.Token,
TestData.EstateId,
TestData.MerchantId,
null);
MerchantRequestHandler handler = new MerchantRequestHandler(merchantService.Object, memoryCacheService.Object);

GetContractProductsRequest request = GetContractProductsRequest.Create();

List<ContractProductModel> contractProductModels = await handler.Handle(request, CancellationToken.None);

Expand All @@ -36,13 +37,12 @@ public async Task MerchantRequestHandler_GetContractProductsRequest_Handle_IsHan
public async Task MerchantRequestHandler_GetMerchantBalanceRequest_Handle_IsHandled()
{
Mock<IMerchantService> merchantService = new Mock<IMerchantService>();
merchantService.Setup(m => m.GetMerchantBalance(It.IsAny<String>(), It.IsAny<Guid>(), It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
merchantService.Setup(m => m.GetMerchantBalance(It.IsAny<CancellationToken>()))
.ReturnsAsync(TestData.MerchantBalance);
MerchantRequestHandler handler = new MerchantRequestHandler(merchantService.Object);
Mock<IMemoryCacheService> memoryCacheService = new Mock<IMemoryCacheService>();
MerchantRequestHandler handler = new MerchantRequestHandler(merchantService.Object, memoryCacheService.Object);

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

Decimal merchantBalance = await handler.Handle(request, CancellationToken.None);

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

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

[Theory]
[InlineData(Models.ProductType.BillPayment)]
[InlineData(Models.ProductType.MobileWallet)]
[InlineData(Models.ProductType.MobileTopup)]
[InlineData(Models.ProductType.Voucher)]
public void GetContractProductsRequest_Create_WithProductType_IsCreated(Models.ProductType productType)
{
GetContractProductsRequest request = GetContractProductsRequest.Create(productType);

request.ShouldNotBeNull();
request.ProductType.ShouldBe(productType);
}

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

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

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.2-mauipre.1.22102.15" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="Moq" Version="4.16.1" />
<PackageReference Include="Shouldly" Version="4.0.3" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,21 @@ namespace TransactionMobile.Maui.BusinessLogic.Tests.ViewModelTests
using ViewModels.Admin;
using ViewModels.Transactions;
using Xunit;
using TransactionMobile.Maui.BusinessLogic.Services;

public class AdminPageViewModelTests
{
[Fact]
public void TransactionsPageViewModel_AdminCommand_Execute_IsExecuted()
public void AdminPageViewModel_AdminCommand_Execute_IsExecuted()
{
Mock<INavigationService> navigationService = new Mock<INavigationService>();
Mock<IMediator> mediator = new Mock<IMediator>();
Mock<IMemoryCache> userDetailsCache = new Mock<IMemoryCache>();
Mock<IMemoryCache> configurationCache = new Mock<IMemoryCache>();
Mock<IMemoryCacheService> memoryCacheService = new Mock<IMemoryCacheService>();
Mock<IDeviceService> deviceService = new Mock<IDeviceService>();
Mock<IApplicationInfoService> applicationInfoService = new Mock<IApplicationInfoService>();
AdminPageViewModel viewModel = new AdminPageViewModel(mediator.Object,
navigationService.Object,
userDetailsCache.Object,
configurationCache.Object,
memoryCacheService.Object,
deviceService.Object,
applicationInfoService.Object);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ namespace TransactionMobile.Maui.BusinessLogic.Tests.ViewModelTests;
using Models;
using Moq;
using Requests;
using TransactionMobile.Maui.BusinessLogic.Services;
using UIServices;
using ViewModels;
using Xunit;
Expand All @@ -19,11 +20,10 @@ public void LoginPageViewModel_LoginCommand_Execute_IsExecuted()
{
Mock<IMediator> mediator = new Mock<IMediator>();
Mock<INavigationService> navigationService = new Mock<INavigationService>();
MemoryCache userDetailsCache = new MemoryCache(new MemoryCacheOptions());
IMemoryCache configurationCache = new MemoryCache(new MemoryCacheOptions());
Mock<IMemoryCacheService> memoryCacheService = new Mock<IMemoryCacheService>();
Mock<IDeviceService> deviceService = new Mock<IDeviceService>();
Mock<IApplicationInfoService> applicationInfoService = new Mock<IApplicationInfoService>();
LoginPageViewModel viewModel = new LoginPageViewModel(mediator.Object, navigationService.Object,userDetailsCache,configurationCache,
LoginPageViewModel viewModel = new LoginPageViewModel(mediator.Object, navigationService.Object, memoryCacheService.Object,
deviceService.Object,applicationInfoService.Object);

mediator.Setup(m => m.Send(It.IsAny<GetConfigurationRequest>(), It.IsAny<CancellationToken>())).ReturnsAsync(new Configuration());
Expand Down
8 changes: 4 additions & 4 deletions TransactionMobile.Maui.BusinessLogic/Models/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ public class Configuration

public String ClientSecret { get; set; }

public String SecurityServiceUrl { get; set; }
public String SecurityServiceUri { get; set; }

public String TransactionProcessorAclUrl { get; set; }
public String TransactionProcessorAclUri { get; set; }

public String EstateManagementUrl { get; set; }
public String EstateManagementUri { get; set; }

public String EstateReportingUrl { get; set; }
public String EstateReportingUri { get; set; }

public LogLevel LogLevel { get; set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ public class TokenResponseModel
{
public String AccessToken { get; set; }
public String RefreshToken { get; set; }
public Int32 ExpiryInMinutes { get; set; }
public Int64 ExpiryInMinutes { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
namespace TransactionMobile.Maui.BusinessLogic.RequestHandlers;

using MediatR;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Primitives;
using Models;
using Requests;
using Services;
Expand All @@ -11,12 +13,15 @@ public class MerchantRequestHandler : IRequestHandler<GetContractProductsRequest

private readonly IMerchantService MerchantService;

private readonly IMemoryCacheService MemoryCacheService;

#endregion

#region Constructors
public MerchantRequestHandler(IMerchantService merchantService)
public MerchantRequestHandler(IMerchantService merchantService,IMemoryCacheService memoryCacheService)
{
this.MerchantService = merchantService;
this.MemoryCacheService = memoryCacheService;
}

#endregion
Expand All @@ -26,7 +31,14 @@ public MerchantRequestHandler(IMerchantService merchantService)
public async Task<List<ContractProductModel>> Handle(GetContractProductsRequest request,
CancellationToken cancellationToken)
{
List<ContractProductModel> products = await this.MerchantService.GetContractProducts(request.AccessToken, request.EstateId, request.MerchantId, cancellationToken);
this.MemoryCacheService.TryGetValue<List<ContractProductModel>>("ContractProducts", out List<ContractProductModel> products);

if (products == null || products.Any() == false)
{
products = await this.MerchantService.GetContractProducts(cancellationToken);

this.CacheContractData(products);
}

if (request.ProductType.HasValue)
{
Expand All @@ -39,7 +51,22 @@ public async Task<List<ContractProductModel>> Handle(GetContractProductsRequest
public async Task<Decimal> Handle(GetMerchantBalanceRequest request,
CancellationToken cancellationToken)
{
return await this.MerchantService.GetMerchantBalance(request.AccessToken, request.EstateId, request.MerchantId, cancellationToken);
return await this.MerchantService.GetMerchantBalance(cancellationToken);
}

private void CacheContractData(List<ContractProductModel> contractProductModels)
{
DateTime expirationTime = DateTime.Now.AddMinutes(60);
CancellationChangeToken expirationToken = new CancellationChangeToken(new CancellationTokenSource(TimeSpan.FromMinutes(60)).Token);
MemoryCacheEntryOptions cacheEntryOptions = new MemoryCacheEntryOptions()
// Pin to cache.
.SetPriority(CacheItemPriority.NeverRemove)
// Set the actual expiration time
.SetAbsoluteExpiration(expirationTime)
// Force eviction to run
.AddExpirationToken(expirationToken);

this.MemoryCacheService.Set("ContractProducts", contractProductModels, cacheEntryOptions);
}

#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,22 @@ public class GetContractProductsRequest : IRequest<List<ContractProductModel>>
{
#region Constructors

private GetContractProductsRequest(String accessToken,
Guid estateId,
Guid merchantId,
ProductType? productType)
private GetContractProductsRequest(ProductType? productType)
{
this.AccessToken = accessToken;
this.EstateId = estateId;
this.MerchantId = merchantId;
this.ProductType = productType;
}

#endregion

#region Properties

public String AccessToken { get; }

public Guid EstateId { get; }

public Guid MerchantId { get; }
public ProductType? ProductType { get; }
#endregion

#region Methods

public static GetContractProductsRequest Create(String accessToken,
Guid estateId,
Guid merchantId,
ProductType? productType)
public static GetContractProductsRequest Create(ProductType? productType =null)
{
return new GetContractProductsRequest(accessToken, estateId, merchantId,productType);
return new GetContractProductsRequest(productType);
}

#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,21 @@ public class GetMerchantBalanceRequest : IRequest<Decimal>
{
#region Constructors

private GetMerchantBalanceRequest(String accessToken,
Guid estateId,
Guid merchantId)
private GetMerchantBalanceRequest()
{
this.AccessToken = accessToken;
this.EstateId = estateId;
this.MerchantId = merchantId;

}

#endregion

#region Properties

public String AccessToken { get; }

public Guid EstateId { get; }

public Guid MerchantId { get; }

#endregion

#region Methods

public static GetMerchantBalanceRequest Create(String accessToken,
Guid estateId,
Guid merchantId)
public static GetMerchantBalanceRequest Create()
{
return new GetMerchantBalanceRequest(accessToken, estateId, merchantId);
return new GetMerchantBalanceRequest();
}

#endregion
Expand Down
Loading