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
4 changes: 2 additions & 2 deletions Embedly.Examples/Examples/CustomerExamples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public async Task<Result<string>> GetCustomerAsync(string customerId)
logger.LogInformation("Customer retrieved: {CustomerName}. Correlation: {CorrelationId}",
$"{response.Data.FirstName} {response.Data.LastName}", correlationId);

return $"Customer: {response.Data.FirstName} {response.Data.LastName} ({response.Data.Email})";
return $"Customer: {response.Data.FirstName} {response.Data.LastName} ({response.Data.EmailAddress})";
}, "GetCustomer");
}

Expand All @@ -100,7 +100,7 @@ public async Task<Result<List<string>>> ListCustomersAsync(int page = 1, int pag
throw new InvalidOperationException($"Customer listing failed: {customers.Error?.Message}");

var customerList = customers.Data
.Select(c => $"{c.FirstName} {c.LastName} - {c.Email}")
.Select(c => $"{c.FirstName} {c.LastName} - {c.EmailAddress}")
.ToList();

logger.LogInformation("Retrieved {Count} customers. Correlation: {CorrelationId}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()
getResponse.Data!.Id.Should().Be(customerId);
getResponse.Data.FirstName.Should().Be(createRequest.FirstName);
getResponse.Data.LastName.Should().Be(createRequest.LastName);
getResponse.Data.Email.Should().Be(createRequest.EmailAddress);
getResponse.Data.EmailAddress.Should().Be(createRequest.EmailAddress);

LogSuccess("Customer retrieved successfully with matching data");

Expand All @@ -82,7 +82,7 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()

if (updateResponse.Success)
{
updateResponse.Data.Should().NotBeNull();
updateResponse.Data.Should().BeTrue();
LogSuccess("Customer name updated successfully");
}
else
Expand All @@ -94,8 +94,8 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()
LogStep("Updating customer contact information");
var updateContactRequest = new UpdateCustomerContactRequest
{
Email = CreateTestEmail("updated"),
PhoneNumber = CreateTestPhoneNumber()
EmailAddress = CreateTestEmail("updated"),
MobileNumber = CreateTestPhoneNumber()
};
LogApiCall("Update Customer Contact", updateContactRequest);

Expand All @@ -104,7 +104,7 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()

if (contactResponse.Success)
{
contactResponse.Data.Should().NotBeNull();
contactResponse.Data.Should().BeTrue();
LogSuccess("Customer contact updated successfully");
}
else
Expand Down Expand Up @@ -166,7 +166,8 @@ public async Task CustomerKycUpgradeWorkflow_ShouldHandleDifferentVerificationMe
var bvnUpgradeRequest = new BvnKycUpgradeRequest
{
CustomerId = customerId,
Bvn = "12345678909" // Test BVN
Bvn = "12345678909", // Test BVN
Verify = 1 // No. of Verification Attempts
};

LogApiCall("BVN KYC Upgrade", bvnUpgradeRequest);
Expand Down
16 changes: 8 additions & 8 deletions Embedly.SDK.Tests/Integration/TestIntegration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()
getResponse.Data!.Id.Should().Be(customerId);
getResponse.Data.FirstName.Should().Be(createRequest.FirstName);
getResponse.Data.LastName.Should().Be(createRequest.LastName);
getResponse.Data.Email.Should().Be(createRequest.EmailAddress);
getResponse.Data.EmailAddress.Should().Be(createRequest.EmailAddress);

LogSuccess("Customer retrieved successfully with matching data");

Expand All @@ -82,7 +82,7 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()

if (updateResponse.Success)
{
updateResponse.Data.Should().NotBeNull();
updateResponse.Data.Should().BeTrue();
LogSuccess("Customer name updated successfully");
}
else
Expand All @@ -94,8 +94,8 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()
LogStep("Updating customer contact information");
var updateContactRequest = new UpdateCustomerContactRequest
{
Email = CreateTestEmail("updated"),
PhoneNumber = CreateTestPhoneNumber()
EmailAddress = CreateTestEmail("updated"),
MobileNumber = CreateTestPhoneNumber()
};
LogApiCall("Update Customer Contact", updateContactRequest);

Expand All @@ -104,7 +104,7 @@ public async Task CompleteCustomerLifecycleWorkflow_ShouldSucceedWithAllSteps()

if (contactResponse.Success)
{
contactResponse.Data.Should().NotBeNull();
contactResponse.Data.Should().BeTrue();
LogSuccess("Customer contact updated successfully");
}
else
Expand Down Expand Up @@ -189,7 +189,8 @@ public async Task CustomerKycUpgradeWorkflow_ShouldHandleDifferentVerificationMe
var bvnUpgradeRequest = new BvnKycUpgradeRequest
{
CustomerId = customerId,
Bvn = "12345678901" // Test BVN
Bvn = "12345678901", // Test BVN
Verify = 1 // No. of Verification Attempts
};

LogApiCall("BVN KYC Upgrade", bvnUpgradeRequest);
Expand All @@ -212,8 +213,7 @@ public async Task CustomerKycUpgradeWorkflow_ShouldHandleDifferentVerificationMe
{
CustomerId = customerId,
HouseAddress = "123 Integration Test Street",
PostalCode = "12345",
Country = "NG",
MeterNumber = "67492874901"
};

LogApiCall("Address Verification", addressRequest);
Expand Down
48 changes: 21 additions & 27 deletions Embedly.SDK.Tests/Services/CustomerServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task CreateAsync_WithValidRequest_ReturnsSuccessfulResponse()
result.Data!.Id.Should().Be(expectedCustomer.Id);
result.Data.FirstName.Should().Be(request.FirstName);
result.Data.LastName.Should().Be(request.LastName);
result.Data.Email.Should().Be(request.EmailAddress);
result.Data.EmailAddress.Should().Be(request.EmailAddress);
result.Data.MobileNumber.Should().Be(request.MobileNumber);

VerifyHttpClientPostCall<CreateCustomerRequest, Customer>("api/v1/customers/add", request);
Expand Down Expand Up @@ -232,13 +232,10 @@ public async Task UpdateNameAsync_WithValidParameters_ReturnsUpdatedCustomer()
var customerId = CreateTestGuid().ToString();
const string firstName = "Updated";
const string lastName = "Name";
var expectedCustomer = CreateTestCustomer(customerId);
expectedCustomer.FirstName = firstName;
expectedCustomer.LastName = lastName;
var apiResponse = CreateSuccessfulApiResponse(expectedCustomer);
var apiResponse = CreateSuccessfulApiResponse(true);

MockHttpClient
.Setup(x => x.PatchAsync<UpdateCustomerNameRequest, Customer>(
.Setup(x => x.PatchAsync<UpdateCustomerNameRequest, bool>(
It.Is<string>(url => url.Contains($"api/v1/customers/customer/{customerId}/updatename")),
It.IsAny<UpdateCustomerNameRequest>(),
It.IsAny<CancellationToken>()))
Expand All @@ -250,12 +247,10 @@ public async Task UpdateNameAsync_WithValidParameters_ReturnsUpdatedCustomer()
// Assert
result.Should().NotBeNull();
result.Success.Should().BeTrue();
result.Data.Should().NotBeNull();
result.Data!.FirstName.Should().Be(firstName);
result.Data.LastName.Should().Be(lastName);
result.Data.Should().BeTrue();

MockHttpClient.Verify(
x => x.PatchAsync<UpdateCustomerNameRequest, Customer>(
x => x.PatchAsync<UpdateCustomerNameRequest, bool>(
It.Is<string>(url => url.Contains($"api/v1/customers/customer/{customerId}/updatename")),
It.Is<UpdateCustomerNameRequest>(r =>
r.CustomerId == customerId &&
Expand All @@ -275,11 +270,10 @@ public async Task UpdateNameAsync_WithRequestObject_CallsCorrectEndpoint()
FirstName = "NewFirst",
LastName = "NewLast"
};
var expectedCustomer = CreateTestCustomer(request.CustomerId);
var apiResponse = CreateSuccessfulApiResponse(expectedCustomer);
var apiResponse = CreateSuccessfulApiResponse(true);

MockHttpClient
.Setup(x => x.PatchAsync<UpdateCustomerNameRequest, Customer>(
.Setup(x => x.PatchAsync<UpdateCustomerNameRequest, bool>(
It.IsAny<string>(),
It.IsAny<UpdateCustomerNameRequest>(),
It.IsAny<CancellationToken>()))
Expand All @@ -292,7 +286,7 @@ public async Task UpdateNameAsync_WithRequestObject_CallsCorrectEndpoint()
result.Should().NotBeNull();
result.Success.Should().BeTrue();

VerifyHttpClientPatchCall<UpdateCustomerNameRequest, Customer>(
VerifyHttpClientPatchCall<UpdateCustomerNameRequest, bool>(
$"api/v1/customers/customer/{request.CustomerId}/updatename", request);
}

Expand All @@ -303,14 +297,13 @@ public async Task UpdateContactAsync_WithValidRequest_ReturnsUpdatedCustomer()
var customerId = CreateTestGuid().ToString();
var request = new UpdateCustomerContactRequest
{
Email = "updated@test.com",
PhoneNumber = "+2348012345678"
EmailAddress = "updated@test.com",
MobileNumber = "+2348012345678"
};
var expectedCustomer = CreateTestCustomer(customerId);
var apiResponse = CreateSuccessfulApiResponse(expectedCustomer);
var apiResponse = CreateSuccessfulApiResponse(true);

MockHttpClient
.Setup(x => x.PatchAsync<UpdateCustomerContactRequest, Customer>(
.Setup(x => x.PatchAsync<UpdateCustomerContactRequest, bool>(
It.Is<string>(url => url.Contains($"api/v1/customers/customer/{customerId}/updatecontact")),
request,
It.IsAny<CancellationToken>()))
Expand All @@ -323,7 +316,7 @@ public async Task UpdateContactAsync_WithValidRequest_ReturnsUpdatedCustomer()
result.Should().NotBeNull();
result.Success.Should().BeTrue();

VerifyHttpClientPatchCall<UpdateCustomerContactRequest, Customer>(
VerifyHttpClientPatchCall<UpdateCustomerContactRequest, bool>(
$"api/v1/customers/customer/{customerId}/updatecontact", request);
}

Expand Down Expand Up @@ -439,7 +432,8 @@ public async Task UpgradeKycWithBvnAsync_WithValidRequest_ReturnsBvnKycResult()
var request = new BvnKycUpgradeRequest
{
CustomerId = CreateTestGuid().ToString(),
Bvn = "12345678901"
Bvn = "12345678901",
Verify = 1 // No. of verification attempts
};

var expectedResult = new BvnKycUpgradeResponse
Expand Down Expand Up @@ -566,8 +560,8 @@ public async Task GetVerificationPropertiesAsync_WithValidId_ReturnsProperties()
var expectedProperties = new CustomerVerificationProperties
{
CustomerId = customerId,
KycLevel = "TIER_1",
CompletedVerifications = new List<string> { "NIN", "BVN", "EMAIL", "PHONE" }
CustomerTierId = 1,
HasNin = true
};
var apiResponse = CreateSuccessfulApiResponse(expectedProperties);

Expand All @@ -585,7 +579,7 @@ public async Task GetVerificationPropertiesAsync_WithValidId_ReturnsProperties()
result.Success.Should().BeTrue();
result.Data.Should().NotBeNull();
result.Data!.CustomerId.Should().Be(customerId);
result.Data.KycLevel.Should().Be("TIER_1");
result.Data.CustomerTierId.Should().Be(1);

VerifyHttpClientGetCall<CustomerVerificationProperties>(
$"api/v1/customers/customer-verification-properties/{customerId}");
Expand Down Expand Up @@ -692,7 +686,7 @@ public void UpdateNameAsync_WithNullRequestObject_ThrowsArgumentNullException()
public void UpdateContactAsync_WithNullCustomerId_ThrowsArgumentException()
{
// Arrange
var request = new UpdateCustomerContactRequest { Email = "test@test.com" };
var request = new UpdateCustomerContactRequest { EmailAddress = "test@test.com" };

// Act & Assert
var exception =
Expand Down Expand Up @@ -733,10 +727,10 @@ private Customer CreateTestCustomer(string? customerId = null)
Id = customerId ?? CreateTestGuid().ToString(),
FirstName = "John",
LastName = "Doe",
Email = CreateTestEmail("john.doe"),
EmailAddress = CreateTestEmail("john.doe"),
MobileNumber = CreateTestPhoneNumber("1234"),
DateOfBirth = DateTime.UtcNow.AddYears(-25),
CreatedAt = DateTimeOffset.UtcNow,
DateCreated = DateTimeOffset.UtcNow,
CustomerTierId = 0,
Status = CustomerStatus.Active
};
Expand Down
44 changes: 23 additions & 21 deletions Embedly.SDK.Tests/Services/PayoutServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ public async Task NameEnquiryAsync_WithValidRequest_ReturnsAccountName()
result.Should().NotBeNull();
result.Success.Should().BeTrue();
result.Data.Should().NotBeNull();
result.Data!.Data.AccountName.Should().NotBeNullOrEmpty();
result.Data!.AccountName.Should().NotBeNullOrEmpty();
result.Data!.AccountNumber.Should().NotBeNullOrEmpty();
result.Data!.DestinationInstitutionCode.Should().NotBeNullOrEmpty();
}

[Test]
Expand All @@ -118,11 +120,11 @@ public async Task InterBankTransferAsync_WithValidRequest_ReturnsTransactionDeta
{
// Arrange
var request = CreateValidBankTransferRequest();
var expectedTransaction = CreateTestPayoutTransaction();
var apiResponse = CreateSuccessfulApiResponse(expectedTransaction);
var expectedReference = CreateTestStringId(prefix: "EMB");
var apiResponse = CreateSuccessfulApiResponse(expectedReference);

MockHttpClient
.Setup(x => x.PostAsync<BankTransferRequest, PayoutTransaction>(
.Setup(x => x.PostAsync<BankTransferRequest, string>(
It.IsAny<string>(),
request,
It.IsAny<CancellationToken>()))
Expand All @@ -133,10 +135,8 @@ public async Task InterBankTransferAsync_WithValidRequest_ReturnsTransactionDeta

// Assert
result.Should().NotBeNull();
result.Success.Should().BeTrue();
result.Succeeded.Should().BeTrue();
result.Data.Should().NotBeNull();
result.Data!.Id.Should().Be(expectedTransaction.Id);
result.Data.Amount.Should().Be(expectedTransaction.Amount);
}

[Test]
Expand All @@ -150,12 +150,19 @@ public void InterBankTransferAsync_WithNullRequest_ThrowsArgumentNullException()
public async Task GetTransactionStatusAsync_WithValidReference_ReturnsTransactionStatus()
{
// Arrange
var transactionReference = "TXN-123456789";
var expectedTransaction = CreateTestPayoutTransaction();
var apiResponse = CreateSuccessfulApiResponse(expectedTransaction);
var transactionReference = CreateTestStringId(prefix: "EMB");
var expectedTransactionStatus = new PayoutTransactionStatus
{
PaymentReference = CreateTestLongId().ToString(),
ProviderReference = CreateTestLongId().ToString(),
SessionId = CreateTestLongId().ToString(),
Status = "success",
TransactionReference = transactionReference
};
var apiResponse = CreateSuccessfulApiResponse(expectedTransactionStatus);

MockHttpClient
.Setup(x => x.GetAsync<PayoutTransaction>(
.Setup(x => x.GetAsync<PayoutTransactionStatus>(
It.IsAny<string>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(apiResponse);
Expand All @@ -167,7 +174,7 @@ public async Task GetTransactionStatusAsync_WithValidReference_ReturnsTransactio
result.Should().NotBeNull();
result.Success.Should().BeTrue();
result.Data.Should().NotBeNull();
result.Data!.Reference.Should().Be(expectedTransaction.Reference);
result.Data!.TransactionReference.Should().Be(expectedTransactionStatus.TransactionReference);
}

[Test]
Expand Down Expand Up @@ -386,8 +393,6 @@ private Bank CreateTestBank(string code, string name)
{
BankCode = code,
BankName = name,
IsActive = true,
Type = "Commercial"
};
}

Expand All @@ -404,13 +409,10 @@ private NameEnquiryResponse CreateTestNameEnquiryResponse()
{
return new NameEnquiryResponse
{
Status = "success",
Data = new BankAccountVerificationData
{
DestinationBankCode = "000010",
AccountNumber = "1111111111",
AccountName = "CHECKING ACCOUNT"
}
DestinationInstitutionCode = "000010",
AccountName = "CHECKING ACCOUNT",
AccountNumber = "1111111111",
SessionId = CreateTestLongId().ToString()
};
}

Expand Down
4 changes: 2 additions & 2 deletions Embedly.SDK.Tests/Services/WalletServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -394,8 +394,8 @@ private Wallet CreateTestWallet()
CustomerId = CreateTestGuid(),
Name = "Test Wallet",
CurrencyId = Guid.Parse("fd5e474d-bb42-4db1-ab74-e8d2a01047e9"),
LedgerBalance = 50000.00,
AvailableBalance = 45000.00,
LedgerBalance = 50000m,
AvailableBalance = 45000m,
IsDefault = true,
VirtualAccount = CreateTestVirtualAccount(),
WalletGroupId = CreateTestGuid(),
Expand Down
3 changes: 1 addition & 2 deletions Embedly.SDK.Tests/Testing/ServiceTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,11 @@ protected static void AssertThrowsArgumentExceptionForNullOrEmptyString<TRespons
/// <param name="message">Optional success message.</param>
/// <returns>A successful API response.</returns>
protected static ApiResponse<T> CreateSuccessfulApiResponse<T>(T data, string? message = null)
where T : class
{
return new ApiResponse<T>
{
Success = true,
Succeeded = true,
Data = data,
Message = message ?? "Operation completed successfully",
RequestId = "test-request-id",
Expand Down Expand Up @@ -155,7 +155,6 @@ protected void VerifyHttpClientPatchCall<TRequest, TResponse>(
TRequest request,
Times? times = null)
where TRequest : class
where TResponse : class
{
MockHttpClient.Verify(
x => x.PatchAsync<TRequest, TResponse>(
Expand Down
Loading
Loading