fix: Add integration tests for accounts, balances and transactions
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nordigen/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||||
+122
-15
@@ -7,34 +7,141 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
using NodaTime;
|
using NodaTime;
|
||||||
|
|
||||||
|
using VMelnalksnis.NordigenDotNet.Accounts;
|
||||||
|
using VMelnalksnis.NordigenDotNet.Requisitions;
|
||||||
|
|
||||||
|
using Xunit.Abstractions;
|
||||||
|
|
||||||
|
using static VMelnalksnis.NordigenDotNet.Tests.Integration.ServiceProviderFixture;
|
||||||
|
|
||||||
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Accounts;
|
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Accounts;
|
||||||
|
|
||||||
public sealed class AccountClientTests : IClassFixture<ServiceProviderFixture>
|
public sealed class AccountClientTests : IClassFixture<ServiceProviderFixture>
|
||||||
{
|
{
|
||||||
|
private readonly ITestOutputHelper _testOutputHelper;
|
||||||
private readonly INordigenClient _nordigenClient;
|
private readonly INordigenClient _nordigenClient;
|
||||||
|
private readonly Requisition _requisition;
|
||||||
|
|
||||||
public AccountClientTests(ServiceProviderFixture serviceProviderFixture)
|
public AccountClientTests(ITestOutputHelper testOutputHelper, ServiceProviderFixture serviceProviderFixture)
|
||||||
{
|
{
|
||||||
|
_testOutputHelper = testOutputHelper;
|
||||||
_nordigenClient = serviceProviderFixture.NordigenClient;
|
_nordigenClient = serviceProviderFixture.NordigenClient;
|
||||||
|
|
||||||
|
_requisition = GetRequisition().GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact(Skip = "Requires manual setup at least every 90 days")]
|
[Fact]
|
||||||
public async Task Get()
|
public async Task Get_ShouldReturnExpected()
|
||||||
{
|
{
|
||||||
var requisition = await _nordigenClient.Requisitions.Get().SingleAsync();
|
_requisition.Accounts.Should().HaveCount(2);
|
||||||
|
var id = _requisition.Accounts.First();
|
||||||
|
|
||||||
foreach (var id in requisition.Accounts)
|
var account = await _nordigenClient.Accounts.Get(id);
|
||||||
|
var currentInstant = SystemClock.Instance.GetCurrentInstant();
|
||||||
|
using (new AssertionScope())
|
||||||
{
|
{
|
||||||
await _nordigenClient.Accounts.Get(id);
|
account.Id.Should().Be(id);
|
||||||
await _nordigenClient.Accounts.GetDetails(id);
|
account.Created.Should().BeLessThan(account.LastAccessed).And.BeLessThan(currentInstant);
|
||||||
await _nordigenClient.Accounts.GetBalances(id);
|
account.LastAccessed.Should().BeGreaterThan(currentInstant - Duration.FromMinutes(1));
|
||||||
|
account.Iban.Should().Be("GL3343697694912188");
|
||||||
var dateTo = SystemClock.Instance.GetCurrentInstant();
|
account.InstitutionId.Should().Be(IntegrationInstitutionId);
|
||||||
var dateFrom = dateTo - Duration.FromDays(7);
|
account.Status.Should().Be(AccountStatus.Ready);
|
||||||
var transactions = await _nordigenClient.Accounts.GetTransactions(id, new Interval(dateFrom, dateTo));
|
|
||||||
var allTransactions = await _nordigenClient.Accounts.GetTransactions(id);
|
|
||||||
|
|
||||||
transactions.Booked.Should().BeSubsetOf(allTransactions.Booked);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetDetails_ShouldReturnExpected()
|
||||||
|
{
|
||||||
|
var id = _requisition.Accounts.First();
|
||||||
|
|
||||||
|
var accountDetails = await _nordigenClient.Accounts.GetDetails(id);
|
||||||
|
|
||||||
|
using (new AssertionScope())
|
||||||
|
{
|
||||||
|
accountDetails.ResourceId.Should().Be("01F3NS4YV94RA29YCH8R0F6BMF");
|
||||||
|
accountDetails.Iban.Should().Be("GL3343697694912188");
|
||||||
|
accountDetails.Currency.Should().Be("EUR");
|
||||||
|
accountDetails.OwnerName.Should().Be("John Doe");
|
||||||
|
accountDetails.Name.Should().Be("Main Account");
|
||||||
|
accountDetails.Product.Should().Be("Checkings");
|
||||||
|
accountDetails.CashAccountType.Should().Be("CACC");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetBalances_ShouldReturnExpected()
|
||||||
|
{
|
||||||
|
var id = _requisition.Accounts.First();
|
||||||
|
|
||||||
|
var balances = await _nordigenClient.Accounts.GetBalances(id);
|
||||||
|
|
||||||
|
balances.Should().HaveCount(2);
|
||||||
|
|
||||||
|
var firstBalance = balances.First();
|
||||||
|
var secondBalance = balances.Last();
|
||||||
|
using (new AssertionScope())
|
||||||
|
{
|
||||||
|
firstBalance.Should().BeEquivalentTo(secondBalance, options => options.Excluding(balance => balance.BalanceType));
|
||||||
|
firstBalance.BalanceType.Should().Be("expected");
|
||||||
|
secondBalance.BalanceType.Should().Be("interimAvailable");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetTransactions_ShouldReturnExpected()
|
||||||
|
{
|
||||||
|
var id = _requisition.Accounts.First();
|
||||||
|
|
||||||
|
var dateTo = SystemClock.Instance.GetCurrentInstant();
|
||||||
|
var dateFrom = dateTo - Duration.FromDays(7);
|
||||||
|
var transactions = await _nordigenClient.Accounts.GetTransactions(id, new Interval(dateFrom, dateTo));
|
||||||
|
var allTransactions = await _nordigenClient.Accounts.GetTransactions(id);
|
||||||
|
|
||||||
|
using (new AssertionScope())
|
||||||
|
{
|
||||||
|
allTransactions.Booked.Should().HaveCount(534);
|
||||||
|
transactions.Booked.Should().HaveCount(42).And.BeSubsetOf(allTransactions.Booked);
|
||||||
|
transactions.Pending.Should().BeEquivalentTo(allTransactions.Pending);
|
||||||
|
|
||||||
|
var pendingTransaction = transactions.Pending.Should().ContainSingle().Subject;
|
||||||
|
pendingTransaction.TransactionAmount.Currency.Should().Be("EUR");
|
||||||
|
pendingTransaction.TransactionAmount.Amount.Should().Be(10m);
|
||||||
|
pendingTransaction.UnstructuredInformation.Should().Be("Reserved PAYMENT Emperor's Burgers");
|
||||||
|
pendingTransaction.ValueDate.Should().Be(new LocalDate(2022, 06, 21));
|
||||||
|
|
||||||
|
var bookedTransaction = transactions.Booked.Single(transaction => transaction.TransactionId is "2022062201927902-1");
|
||||||
|
bookedTransaction.TransactionAmount.Currency.Should().Be("EUR");
|
||||||
|
bookedTransaction.TransactionAmount.Amount.Should().Be(-15);
|
||||||
|
bookedTransaction.UnstructuredInformation.Should().Be("PAYMENT Alderaan Coffe");
|
||||||
|
bookedTransaction.ValueDate.Should().Be(new LocalDate(2022, 06, 22));
|
||||||
|
bookedTransaction.TransactionId.Should().Be("2022062201927902-1");
|
||||||
|
bookedTransaction.BookingDate.Should().Be(new(2022, 06, 22));
|
||||||
|
bookedTransaction.DebtorName.Should().BeNull();
|
||||||
|
bookedTransaction.DebtorAccount.Should().BeNull();
|
||||||
|
bookedTransaction.CreditorName.Should().BeNull();
|
||||||
|
bookedTransaction.CreditorAccount.Should().BeNull();
|
||||||
|
bookedTransaction.BankTransactionCode.Should().Be("PMNT");
|
||||||
|
bookedTransaction.EntryReference.Should().BeNull();
|
||||||
|
bookedTransaction.AdditionalInformation.Should().BeNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<Requisition> GetRequisition()
|
||||||
|
{
|
||||||
|
var requisition = await _nordigenClient.Requisitions.Get().SingleOrDefaultAsync(r => r.InstitutionId is IntegrationInstitutionId);
|
||||||
|
if (requisition is not null && requisition.Status is not RequisitionStatus.Ex)
|
||||||
|
{
|
||||||
|
return requisition;
|
||||||
|
}
|
||||||
|
|
||||||
|
var creation = new RequisitionCreation(new("https://github.com/VMelnalksnis/NordigenDotNet"), IntegrationInstitutionId);
|
||||||
|
var createdRequisition = await _nordigenClient.Requisitions.Post(creation);
|
||||||
|
|
||||||
|
var message = $@"Access to an institution needs to be approved every 90 days.
|
||||||
|
Please go to {createdRequisition.Link} and rerun this test.
|
||||||
|
For more information see https://nordigen.com/en/account_information_documenation/integration/sandbox/";
|
||||||
|
|
||||||
|
_testOutputHelper.WriteLine(message);
|
||||||
|
throw new(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -11,6 +11,8 @@ using NodaTime;
|
|||||||
|
|
||||||
using VMelnalksnis.NordigenDotNet.Agreements;
|
using VMelnalksnis.NordigenDotNet.Agreements;
|
||||||
|
|
||||||
|
using static VMelnalksnis.NordigenDotNet.Tests.Integration.ServiceProviderFixture;
|
||||||
|
|
||||||
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Agreements;
|
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Agreements;
|
||||||
|
|
||||||
public sealed class AgreementClientTests : IClassFixture<ServiceProviderFixture>
|
public sealed class AgreementClientTests : IClassFixture<ServiceProviderFixture>
|
||||||
@@ -25,7 +27,7 @@ public sealed class AgreementClientTests : IClassFixture<ServiceProviderFixture>
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async Task Get()
|
public async Task Get()
|
||||||
{
|
{
|
||||||
var creation = new EndUserAgreementCreation("CITADELE_PARXLV22");
|
var creation = new EndUserAgreementCreation(IntegrationInstitutionId);
|
||||||
|
|
||||||
var createdAgreement = await _nordigenClient.Agreements.Post(creation);
|
var createdAgreement = await _nordigenClient.Agreements.Post(creation);
|
||||||
(await _nordigenClient.Agreements.Get(createdAgreement.Id)).Should().BeEquivalentTo(createdAgreement);
|
(await _nordigenClient.Agreements.Get(createdAgreement.Id)).Should().BeEquivalentTo(createdAgreement);
|
||||||
|
|||||||
+3
-1
@@ -11,6 +11,8 @@ using NodaTime;
|
|||||||
|
|
||||||
using VMelnalksnis.NordigenDotNet.Requisitions;
|
using VMelnalksnis.NordigenDotNet.Requisitions;
|
||||||
|
|
||||||
|
using static VMelnalksnis.NordigenDotNet.Tests.Integration.ServiceProviderFixture;
|
||||||
|
|
||||||
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Requisitions;
|
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Requisitions;
|
||||||
|
|
||||||
public sealed class RequisitionsClientTests : IClassFixture<ServiceProviderFixture>
|
public sealed class RequisitionsClientTests : IClassFixture<ServiceProviderFixture>
|
||||||
@@ -25,7 +27,7 @@ public sealed class RequisitionsClientTests : IClassFixture<ServiceProviderFixtu
|
|||||||
[Fact]
|
[Fact]
|
||||||
public async Task CreateAndDelete()
|
public async Task CreateAndDelete()
|
||||||
{
|
{
|
||||||
var creation = new RequisitionCreation(new("https://github.com/VMelnalksnis/NordigenDotNet"), "CITADELE_PARXLV22");
|
var creation = new RequisitionCreation(new("https://github.com/VMelnalksnis/NordigenDotNet"), IntegrationInstitutionId);
|
||||||
var createdRequisition = await _nordigenClient.Requisitions.Post(creation);
|
var createdRequisition = await _nordigenClient.Requisitions.Post(creation);
|
||||||
var requisition = await _nordigenClient.Requisitions.Get(createdRequisition.Id);
|
var requisition = await _nordigenClient.Requisitions.Get(createdRequisition.Id);
|
||||||
var requisitions = await _nordigenClient.Requisitions.Get().ToListAsync();
|
var requisitions = await _nordigenClient.Requisitions.Get().ToListAsync();
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ namespace VMelnalksnis.NordigenDotNet.Tests.Integration;
|
|||||||
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
|
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
|
||||||
public sealed class ServiceProviderFixture
|
public sealed class ServiceProviderFixture
|
||||||
{
|
{
|
||||||
|
internal const string IntegrationInstitutionId = "SANDBOXFINANCE_SFIN0000";
|
||||||
|
|
||||||
private readonly IServiceProvider _serviceProvider;
|
private readonly IServiceProvider _serviceProvider;
|
||||||
|
|
||||||
public ServiceProviderFixture()
|
public ServiceProviderFixture()
|
||||||
|
|||||||
Reference in New Issue
Block a user