diff --git a/src/FiscalOS.API/Accounts/Add/Endpoint.cs b/src/FiscalOS.API/Accounts/Add/Endpoint.cs index 2b70e6f..06f3e4e 100644 --- a/src/FiscalOS.API/Accounts/Add/Endpoint.cs +++ b/src/FiscalOS.API/Accounts/Add/Endpoint.cs @@ -42,12 +42,9 @@ internal static class Endpoint return Results.Conflict(); } - // TODO: We need to get the initial balance - // of the account - var accountMetadata = PlaidAccountMetadata.From(request.PlaidAccountId, request.PlaidAccountName); var account = Account.From(user.Institutions.First().Id, request.PlaidAccountName, accountMetadata); - var balance = Balance.From(request.AccountCurrentBalance, request.AccountAvailableBalance); + var balance = Balance.From(request.AccountCurrentBalance, request.AccountAvailableBalance, request.AccountCurrencyCode); account.AddBalance(balance); user.AddAccount(account); diff --git a/src/FiscalOS.API/Accounts/Add/Request.cs b/src/FiscalOS.API/Accounts/Add/Request.cs index 470e5b4..fdc4923 100644 --- a/src/FiscalOS.API/Accounts/Add/Request.cs +++ b/src/FiscalOS.API/Accounts/Add/Request.cs @@ -7,6 +7,7 @@ public record Request : IValidatableObject public string PlaidAccountName { get; init; } = string.Empty; public decimal AccountCurrentBalance { get; init; } public decimal AccountAvailableBalance { get; init; } + public string AccountCurrencyCode { get; init; } = string.Empty; public IEnumerable Validate(ValidationContext validationContext) { @@ -27,5 +28,11 @@ public record Request : IValidatableObject var fieldName = nameof(PlaidAccountName); yield return new($"The {fieldName} field is required.", [fieldName]); } + + if (string.IsNullOrWhiteSpace(AccountCurrencyCode)) + { + var fieldName = nameof(AccountCurrencyCode); + yield return new($"The {fieldName} field is required.", [fieldName]); + } } } \ No newline at end of file diff --git a/tests/FiscalOS.API.Tests/Integration/Accounts/AddTests.cs b/tests/FiscalOS.API.Tests/Integration/Accounts/AddTests.cs index e0f0e9d..96a89f4 100644 --- a/tests/FiscalOS.API.Tests/Integration/Accounts/AddTests.cs +++ b/tests/FiscalOS.API.Tests/Integration/Accounts/AddTests.cs @@ -16,7 +16,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) } [Fact] - public async Task Add_WhenCalledWithoutInstitutionIdOrAccountIdOrAccountName_ItShouldReturn400WithProblemDetails() + public async Task Add_WhenCalledWithoutRequiredInformation_ItShouldReturn400WithProblemDetails() { using var request = HttpRequestBuilder.New() .Post(AddUri) @@ -31,6 +31,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) ["PlaidInstitutionId"] = ["The PlaidInstitutionId field is required."], ["PlaidAccountId"] = ["The PlaidAccountId field is required."], ["PlaidAccountName"] = ["The PlaidAccountName field is required."], + ["AccountCurrencyCode"] = ["The AccountCurrencyCode field is required."], }); } @@ -44,6 +45,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) { plaidAccountId = "accountId", plaidAccountName = "Some Account", + accountCurrencyCode = "USD", }) .Build(); @@ -65,6 +67,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) { plaidInstitutionId = "institutionId", plaidAccountName = "Some Account", + accountCurrencyCode = "USD", }) .Build(); @@ -86,6 +89,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) { plaidInstitutionId = "institutionId", plaidAccountId = "accountId", + accountCurrencyCode = "USD", }) .Build(); @@ -108,6 +112,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) plaidInstitutionId = "id", plaidAccountId = "id", plaidAccountName = "Some Account", + accountCurrencyCode = "USD", }) .Build(); @@ -141,6 +146,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) plaidInstitutionId = "id", plaidAccountId = "id", plaidAccountName = "Some Account", + accountCurrencyCode = "USD", }) .Build(); @@ -189,6 +195,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) plaidInstitutionId = ((PlaidMetadata)institution.Metadata!).PlaidId, plaidAccountId = ((PlaidAccountMetadata)account.Metadata!).PlaidId, plaidAccountName = ((PlaidAccountMetadata)account.Metadata).PlaidName, + accountCurrencyCode = "USD", }) .Build(); @@ -223,6 +230,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) var newAccountId = "newAccountId"; var newAccountName = "New Account"; var expectedBalance = 100; + var expectedCurrencyCode = "USD"; using var request = HttpRequestBuilder.New() .Post(AddUri) @@ -234,6 +242,7 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) plaidAccountName = newAccountName, accountCurrentBalance = expectedBalance, accountAvailableBalance = expectedBalance, + accountCurrencyCode = expectedCurrencyCode, }) .Build(); @@ -264,7 +273,8 @@ public class AddTests(TestApi testApi) : IntegrationTest(testApi) .Balances.Should().ContainSingle( b => b.AccountId == updatedUser.Accounts.First().Id && b.Current == expectedBalance && - b.Available == expectedBalance + b.Available == expectedBalance && + b.CurrencyCode == expectedCurrencyCode ); } } \ No newline at end of file diff --git a/tests/FiscalOS.API.Tests/Integration/Institutions/GetAvailableTests.cs b/tests/FiscalOS.API.Tests/Integration/Institutions/GetAvailableTests.cs index 228626e..1335931 100644 --- a/tests/FiscalOS.API.Tests/Integration/Institutions/GetAvailableTests.cs +++ b/tests/FiscalOS.API.Tests/Integration/Institutions/GetAvailableTests.cs @@ -10,6 +10,7 @@ public class GetAvailableTests(TestApi testApi) : IntegrationTest(testApi) { return new($"/institutions/{id}/available", UriKind.Relative); } + [Fact] public async Task GetAvailable_WhenCalledAndUnauthenticated_ItShouldReturn401WithProblemDetails() {