fix: Add integration tests for accounts, balances and transactions

This commit is contained in:
Valters Melnalksnis
2022-06-23 10:00:34 +03:00
parent ef5aba1acd
commit f4002a4363
5 changed files with 132 additions and 17 deletions
@@ -7,34 +7,141 @@ using System.Threading.Tasks;
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;
public sealed class AccountClientTests : IClassFixture<ServiceProviderFixture>
{
private readonly ITestOutputHelper _testOutputHelper;
private readonly INordigenClient _nordigenClient;
private readonly Requisition _requisition;
public AccountClientTests(ServiceProviderFixture serviceProviderFixture)
public AccountClientTests(ITestOutputHelper testOutputHelper, ServiceProviderFixture serviceProviderFixture)
{
_testOutputHelper = testOutputHelper;
_nordigenClient = serviceProviderFixture.NordigenClient;
_requisition = GetRequisition().GetAwaiter().GetResult();
}
[Fact(Skip = "Requires manual setup at least every 90 days")]
public async Task Get()
[Fact]
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);
await _nordigenClient.Accounts.GetDetails(id);
await _nordigenClient.Accounts.GetBalances(id);
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);
transactions.Booked.Should().BeSubsetOf(allTransactions.Booked);
account.Id.Should().Be(id);
account.Created.Should().BeLessThan(account.LastAccessed).And.BeLessThan(currentInstant);
account.LastAccessed.Should().BeGreaterThan(currentInstant - Duration.FromMinutes(1));
account.Iban.Should().Be("GL3343697694912188");
account.InstitutionId.Should().Be(IntegrationInstitutionId);
account.Status.Should().Be(AccountStatus.Ready);
}
}
[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);
}
}
@@ -11,6 +11,8 @@ using NodaTime;
using VMelnalksnis.NordigenDotNet.Agreements;
using static VMelnalksnis.NordigenDotNet.Tests.Integration.ServiceProviderFixture;
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Agreements;
public sealed class AgreementClientTests : IClassFixture<ServiceProviderFixture>
@@ -25,7 +27,7 @@ public sealed class AgreementClientTests : IClassFixture<ServiceProviderFixture>
[Fact]
public async Task Get()
{
var creation = new EndUserAgreementCreation("CITADELE_PARXLV22");
var creation = new EndUserAgreementCreation(IntegrationInstitutionId);
var createdAgreement = await _nordigenClient.Agreements.Post(creation);
(await _nordigenClient.Agreements.Get(createdAgreement.Id)).Should().BeEquivalentTo(createdAgreement);
@@ -11,6 +11,8 @@ using NodaTime;
using VMelnalksnis.NordigenDotNet.Requisitions;
using static VMelnalksnis.NordigenDotNet.Tests.Integration.ServiceProviderFixture;
namespace VMelnalksnis.NordigenDotNet.Tests.Integration.Requisitions;
public sealed class RequisitionsClientTests : IClassFixture<ServiceProviderFixture>
@@ -25,7 +27,7 @@ public sealed class RequisitionsClientTests : IClassFixture<ServiceProviderFixtu
[Fact]
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 requisition = await _nordigenClient.Requisitions.Get(createdRequisition.Id);
var requisitions = await _nordigenClient.Requisitions.Get().ToListAsync();
@@ -19,6 +19,8 @@ namespace VMelnalksnis.NordigenDotNet.Tests.Integration;
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
public sealed class ServiceProviderFixture
{
internal const string IntegrationInstitutionId = "SANDBOXFINANCE_SFIN0000";
private readonly IServiceProvider _serviceProvider;
public ServiceProviderFixture()