From c713a5448d7ebbe8882cff8337df9aa837076cb5 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 10 Mar 2026 07:41:23 -0500 Subject: [PATCH] tests(tests.common): add class library for sharing code amongst test projects --- .../Data/AccountBuilder.cs | 62 ++++++++++++++++ .../Data/AccountMetadataBuilder.cs | 33 +++++++++ .../Data/InstitutionBuilder.cs | 59 +++++++++++++++ .../Data/InstitutionMetadataBuilder.cs | 52 +++++++++++++ .../Data/TransactionBuilder.cs | 67 +++++++++++++++++ .../Data/TransactionMetadataBuilder.cs | 26 +++++++ .../FiscalOS.Tests.Common/Data/UserBuilder.cs | 73 +++++++++++++++++++ .../FiscalOS.Tests.Common.csproj | 14 ++++ tests/FiscalOS.Tests.Common/Usings.cs | 6 ++ 9 files changed, 392 insertions(+) create mode 100644 tests/FiscalOS.Tests.Common/Data/AccountBuilder.cs create mode 100644 tests/FiscalOS.Tests.Common/Data/AccountMetadataBuilder.cs create mode 100644 tests/FiscalOS.Tests.Common/Data/InstitutionBuilder.cs create mode 100644 tests/FiscalOS.Tests.Common/Data/InstitutionMetadataBuilder.cs create mode 100644 tests/FiscalOS.Tests.Common/Data/TransactionBuilder.cs create mode 100644 tests/FiscalOS.Tests.Common/Data/TransactionMetadataBuilder.cs create mode 100644 tests/FiscalOS.Tests.Common/Data/UserBuilder.cs create mode 100644 tests/FiscalOS.Tests.Common/FiscalOS.Tests.Common.csproj create mode 100644 tests/FiscalOS.Tests.Common/Usings.cs diff --git a/tests/FiscalOS.Tests.Common/Data/AccountBuilder.cs b/tests/FiscalOS.Tests.Common/Data/AccountBuilder.cs new file mode 100644 index 0000000..48ecdb4 --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Data/AccountBuilder.cs @@ -0,0 +1,62 @@ +namespace FiscalOS.Tests.Common.Data; + +public sealed class AccountBuilder +{ + private string _name = "accountName"; + private AccountMetadata? _metadata; + private readonly List _transactions = []; + + private AccountBuilder() + { + } + + public static AccountBuilder Create() + { + return new(); + } + + public AccountBuilder WithName(string name) + { + _name = name; + return this; + } + + public AccountBuilder WithMetadata(Action? action = null) + { + var imb = AccountMetadataBuilder.Create(); + action?.Invoke(imb); + _metadata = imb.Build(); + return this; + } + + public AccountBuilder WithMetadata(AccountMetadata metadata) + { + _metadata = metadata; + return this; + } + + public AccountBuilder WithTransaction(Action? action = null) + { + var tb = TransactionBuilder.Create(); + action?.Invoke(tb); + _transactions.Add(tb.Build()); + return this; + } + + public Account Build() + { + if (_metadata is null) + { + throw new InvalidOperationException($"You must call {nameof(WithMetadata)} prior to building"); + } + + var account = Account.From(_name, _metadata); + + foreach (var transaction in _transactions) + { + account.AddTransaction(transaction); + } + + return account; + } +} \ No newline at end of file diff --git a/tests/FiscalOS.Tests.Common/Data/AccountMetadataBuilder.cs b/tests/FiscalOS.Tests.Common/Data/AccountMetadataBuilder.cs new file mode 100644 index 0000000..9d6f3db --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Data/AccountMetadataBuilder.cs @@ -0,0 +1,33 @@ +namespace FiscalOS.Tests.Common.Data; + +public sealed class AccountMetadataBuilder +{ + private string _plaidId = "plaidId"; + private string _plaidName = "plaidName"; + + private AccountMetadataBuilder() + { + } + + public static AccountMetadataBuilder Create() + { + return new(); + } + + public AccountMetadataBuilder WithPlaidId(string plaidId) + { + _plaidId = plaidId; + return this; + } + + public AccountMetadataBuilder WithPlaidName(string plaidName) + { + _plaidName = plaidName; + return this; + } + + public PlaidAccountMetadata Build() + { + return PlaidAccountMetadata.From(_plaidId, _plaidName); + } +} \ No newline at end of file diff --git a/tests/FiscalOS.Tests.Common/Data/InstitutionBuilder.cs b/tests/FiscalOS.Tests.Common/Data/InstitutionBuilder.cs new file mode 100644 index 0000000..6d08876 --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Data/InstitutionBuilder.cs @@ -0,0 +1,59 @@ +namespace FiscalOS.Tests.Common.Data; + +public sealed class InstitutionBuilder +{ + private string _name = "institutionName"; + private InstitutionMetadata? _metadata; + private readonly List _accounts = []; + + private InstitutionBuilder() + { + } + + public static InstitutionBuilder Create() + { + return new(); + } + + public InstitutionBuilder WithName(string name) + { + _name = name; + return this; + } + + public InstitutionBuilder WithMetadata(Action? action = null) + { + var imb = InstitutionMetadataBuilder.Create(); + action?.Invoke(imb); + _metadata = imb.Build(); + return this; + } + + public InstitutionBuilder WithAccount(Action? action = null) + { + var ab = AccountBuilder.Create(); + action?.Invoke(ab); + _accounts.Add(ab.Build()); + return this; + } + + public Institution Build() + { + if (_metadata is null) + { + throw new InvalidOperationException($"You must call {nameof(WithMetadata)} prior to building"); + } + + var institution = Institution.From( + _name, + _metadata + ); + + foreach (var account in _accounts) + { + institution.AddAccount(account); + } + + return institution; + } +} \ No newline at end of file diff --git a/tests/FiscalOS.Tests.Common/Data/InstitutionMetadataBuilder.cs b/tests/FiscalOS.Tests.Common/Data/InstitutionMetadataBuilder.cs new file mode 100644 index 0000000..93a35be --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Data/InstitutionMetadataBuilder.cs @@ -0,0 +1,52 @@ +namespace FiscalOS.Tests.Common.Data; + +public sealed class InstitutionMetadataBuilder +{ + private string _plaidId = "plaidId"; + private string _plaidName = "plaidName"; + private string _accessToken = "encryptedAccessToken"; + private string _itemId = "itemId"; + + private InstitutionMetadataBuilder() + { + } + + public static InstitutionMetadataBuilder Create() + { + return new(); + } + + public InstitutionMetadataBuilder WithPlaidId(string plaidId) + { + _plaidId = plaidId; + return this; + } + + public InstitutionMetadataBuilder WithPlaidName(string plaidName) + { + _plaidName = plaidName; + return this; + } + + public InstitutionMetadataBuilder WithAccessToken(string accessToken) + { + _accessToken = accessToken; + return this; + } + + public InstitutionMetadataBuilder WithItemId(string itemId) + { + _itemId = itemId; + return this; + } + + public PlaidInstitutionMetadata Build() + { + return PlaidInstitutionMetadata.From( + _plaidId, + _plaidName, + _accessToken, + _itemId + ); + } +} \ No newline at end of file diff --git a/tests/FiscalOS.Tests.Common/Data/TransactionBuilder.cs b/tests/FiscalOS.Tests.Common/Data/TransactionBuilder.cs new file mode 100644 index 0000000..3120475 --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Data/TransactionBuilder.cs @@ -0,0 +1,67 @@ +namespace FiscalOS.Tests.Common.Data; + +public sealed class TransactionBuilder +{ + private string _merchantName = "merchantName"; + private string _description = "description"; + private decimal _amount = 100; + private DateTimeOffset _date = DateTimeOffset.UtcNow; + private TransactionMetadata? _metadata; + + private TransactionBuilder() + { + } + + public static TransactionBuilder Create() + { + return new(); + } + + public TransactionBuilder WithMerchantName(string merchantName) + { + _merchantName = merchantName; + return this; + } + + public TransactionBuilder WithDescription(string description) + { + _description = description; + return this; + } + + public TransactionBuilder WithAmount(decimal amount) + { + _amount = amount; + return this; + } + + public TransactionBuilder WithDate(DateTimeOffset date) + { + _date = date; + return this; + } + + public TransactionBuilder WithMetadata(Action? action = null) + { + var tmb = TransactionMetadataBuilder.Create(); + action?.Invoke(tmb); + _metadata = tmb.Build(); + return this; + } + + public Transaction Build() + { + if (_metadata is null) + { + throw new InvalidOperationException($"You must call {nameof(WithMetadata)} prior to building"); + } + + return Transaction.From( + _merchantName, + _description, + _amount, + _date, + _metadata + ); + } +} \ No newline at end of file diff --git a/tests/FiscalOS.Tests.Common/Data/TransactionMetadataBuilder.cs b/tests/FiscalOS.Tests.Common/Data/TransactionMetadataBuilder.cs new file mode 100644 index 0000000..7f6db3c --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Data/TransactionMetadataBuilder.cs @@ -0,0 +1,26 @@ +namespace FiscalOS.Tests.Common.Data; + +public sealed class TransactionMetadataBuilder +{ + private string _plaidId = "plaidId"; + + private TransactionMetadataBuilder() + { + } + + public static TransactionMetadataBuilder Create() + { + return new(); + } + + public TransactionMetadataBuilder WithPlaidId(string plaidId) + { + _plaidId = plaidId; + return this; + } + + public PlaidTransactionMetadata Build() + { + return PlaidTransactionMetadata.From(_plaidId); + } +} \ No newline at end of file diff --git a/tests/FiscalOS.Tests.Common/Data/UserBuilder.cs b/tests/FiscalOS.Tests.Common/Data/UserBuilder.cs new file mode 100644 index 0000000..6ec90fb --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Data/UserBuilder.cs @@ -0,0 +1,73 @@ +namespace FiscalOS.Tests.Common.Data; + +public sealed class UserBuilder +{ + private string _username = "username"; + private string _password = "hashedPassword"; + private EncryptedDataKey _dataKey = EncryptedDataKey.From( + "keyUsed", + "encryptedKey" + ); + private readonly List _instituions = []; + + private UserBuilder() + { + } + + public static UserBuilder Create() + { + return new(); + } + + public UserBuilder WithUsername(string username) + { + _username = username; + return this; + } + + public UserBuilder WithPassword(string password) + { + _password = password; + return this; + } + + public UserBuilder WithDataKey(EncryptedDataKey key) + { + _dataKey = key; + return this; + } + + public UserBuilder WithInstitution(Action? action = null) + { + var ib = InstitutionBuilder.Create(); + action?.Invoke(ib); + _instituions.Add(ib.Build()); + return this; + } + + public User Build() + { + var user = User.From( + _username, + _password, + _dataKey + ); + + foreach (var institution in _instituions) + { + user.AddInstitution(institution); + + foreach (var account in institution.Accounts) + { + user.AddAccount(account); + + foreach (var transaction in account.Transactions) + { + user.AddTransaction(transaction); + } + } + } + + return user; + } +} \ No newline at end of file diff --git a/tests/FiscalOS.Tests.Common/FiscalOS.Tests.Common.csproj b/tests/FiscalOS.Tests.Common/FiscalOS.Tests.Common.csproj new file mode 100644 index 0000000..0a46908 --- /dev/null +++ b/tests/FiscalOS.Tests.Common/FiscalOS.Tests.Common.csproj @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/FiscalOS.Tests.Common/Usings.cs b/tests/FiscalOS.Tests.Common/Usings.cs new file mode 100644 index 0000000..e6bc17a --- /dev/null +++ b/tests/FiscalOS.Tests.Common/Usings.cs @@ -0,0 +1,6 @@ +global using FiscalOS.Core.Accounts; +global using FiscalOS.Core.Identity; +global using FiscalOS.Core.Security; +global using FiscalOS.Core.Transactions; +global using FiscalOS.Infra.Accounts.Plaid; +global using FiscalOS.Infra.Transactions.Plaid;