Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/307 support for checkout order validation #309

Merged
merged 3 commits into from
Aug 29, 2024
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
6 changes: 6 additions & 0 deletions src/Svea.WebPay.SDK.Tests/Builders/CheckoutOrderBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public class CheckoutOrderBuilder
private MerchantSettings merchantSettings;
private Cart cart;
private bool? recurring;
private OrderValidation validation = null;

public CreateOrderModel Build()
{
Expand Down Expand Up @@ -56,5 +57,10 @@ public CheckoutOrderBuilder AddRecurring()
this.recurring = true;
return this;
}
public CheckoutOrderBuilder AddOrderValidation(long minAge = 18)
{
this.validation = new OrderValidation(minAge);
return this;
}
}
}
17 changes: 16 additions & 1 deletion src/Svea.WebPay.SDK.Tests/Checkout/CreateOrderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,22 @@ public async System.Threading.Tasks.Task CreateOrder_Should_Serialize_AsExpected
var request = checkoutOrderBuilder.UseTestValues().AddRecurring().Build();

// Act
var actualOrder = await sveaClient.Checkout.CreateOrder(request).ConfigureAwait(false);
var actualOrder = await sveaClient.Checkout.CreateOrder(request);

// Assert
Assert.True(DataComparison.DataAreEqual(expectedOrder, actualOrder));
}

[Fact]
public async System.Threading.Tasks.Task CreateOrder_Should_Serialize_AsExpectedForOrderValidationr()
{
// Arrange
var expectedOrder = JsonSerializer.Deserialize<Data>(CheckoutDataSamples.CheckoutCreateRecurringOrderResponse, JsonSerialization.Settings);
var sveaClient = SveaClient(CreateHandlerMock(CheckoutDataSamples.CheckoutCreateRecurringOrderResponse));
var request = checkoutOrderBuilder.UseTestValues().AddOrderValidation().Build();

// Act
var actualOrder = await sveaClient.Checkout.CreateOrder(request);

// Assert
Assert.True(DataComparison.DataAreEqual(expectedOrder, actualOrder));
Expand Down
5 changes: 4 additions & 1 deletion src/Svea.WebPay.SDK.Tests/Helpers/DataComparison.cs
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,10 @@ public static bool DataAreEqual(Data expectedData, Data actualData)
{
Assert.Equal(expectedData.Recurring, actualData.Recurring);
}

if(expectedData.Validation !=null)
{
Assert.Equal(expectedData.Validation.MinAge, actualData.Validation.MinAge);
}
return true;
}

Expand Down
56 changes: 28 additions & 28 deletions src/Svea.WebPay.SDK.Tests/PaymentAdminTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@
var sveaClient = SveaClient(CreateHandlerMock(DataSample.AdminGetOrder));

// Act
var actualOrder = await sveaClient.PaymentAdmin.GetOrder(9788143).ConfigureAwait(false);
var actualOrder = await sveaClient.PaymentAdmin.GetOrder(9788143);

// Assert
Assert.True(DataComparison.OrdersAreEqual(expectedOrder, actualOrder));
Assert.Equal(expectedOrder.ExpirationDate, new DateTime(2024, 6, 9, 22, 0, 0));
Assert.Equal(expectedOrder.OrderStatus, OrderStatus.Expired);

Check warning on line 37 in src/Svea.WebPay.SDK.Tests/PaymentAdminTests.cs

View workflow job for this annotation

GitHub Actions / Build and publish artifact / Build

The literal or constant value OrderStatus.Expired should be passed as the 'expected' argument in the call to 'Assert.Equal(expected, actual)' in method 'GetOrderWithId_Should_Serialize_AsExpected' on type 'PaymentAdminTests'. Swap the parameter values. (https://xunit.net/xunit.analyzers/rules/xUnit2000)
}

[Fact]
Expand All @@ -46,7 +46,7 @@
var sveaClient = SveaClient(CreateHandlerMock(DataSample.AdminGetOrder));

// Act
var actualOrder = await sveaClient.PaymentAdmin.GetOrder(new Uri("http://www.test.com")).ConfigureAwait(false);
var actualOrder = await sveaClient.PaymentAdmin.GetOrder(new Uri("http://www.test.com"));

// Assert
Assert.True(DataComparison.OrdersAreEqual(expectedOrder, actualOrder));
Expand All @@ -60,7 +60,7 @@
var sveaClient = SveaClient(CreateHandlerMock(DataSample.TaskResponse, expectedTask.ResourceUri.OriginalString));

// Act
var actualTask = await sveaClient.PaymentAdmin.GetTask(1).ConfigureAwait(false);
var actualTask = await sveaClient.PaymentAdmin.GetTask(1);

// Assert
Assert.True(DataComparison.TasksAreEqual(expectedTask, actualTask));
Expand All @@ -74,7 +74,7 @@
var sveaClient = SveaClient(CreateHandlerMock(DataSample.TaskResponse, expectedTask.ResourceUri.OriginalString));

// Act
var actualTask = await sveaClient.PaymentAdmin.GetTask(new Uri("http://www.test.com")).ConfigureAwait(false);
var actualTask = await sveaClient.PaymentAdmin.GetTask(new Uri("http://www.test.com"));

// Assert
Mock.Verify();
Expand All @@ -92,8 +92,8 @@
DataSample.AdminDeliveredOrder));

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var resourceResponse = await order.Actions.DeliverOrder(new DeliveryRequest(new List<long> { 1, 2 }), new PollingTimeout(15)).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var resourceResponse = await order.Actions.DeliverOrder(new DeliveryRequest(new List<long> { 1, 2 }), new PollingTimeout(15));

// Assert
Assert.Equal(expectedTask.ResourceUri.OriginalString, resourceResponse.TaskUri.OriginalString);
Expand All @@ -111,10 +111,10 @@
DataSample.AdminPartiallyDeliveredOrder));

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var orderRow = new List<long> { order.OrderRows.First(x => x.AvailableActions.Contains(OrderRowActionType.CanDeliverRow)).OrderRowId };
var deliverRequest = new DeliveryRequest(orderRow);
var resourceResponse = await order.Actions.DeliverOrder(deliverRequest, new PollingTimeout(15)).ConfigureAwait(false);
var resourceResponse = await order.Actions.DeliverOrder(deliverRequest, new PollingTimeout(15));

// Assert
Assert.Equal(expectedTask.ResourceUri.OriginalString, resourceResponse.TaskUri.OriginalString);
Expand All @@ -133,7 +133,7 @@
DataSample.AddOrderRowResponse));

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var resourceResponse = await order.Actions.AddOrderRow(
new AddOrderRowRequest(
articleNumber: "1234567890",
Expand All @@ -145,7 +145,7 @@
unit: "SEK",
false
), new PollingTimeout(15)
).ConfigureAwait(false);
);

// Assert
foreach (var id in expectedResponse.OrderRows.Select(x => x.OrderRowId))
Expand All @@ -166,7 +166,7 @@
DataSample.AddOrderRowsResponse));

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);

var resourceResponse = await order.Actions.AddOrderRows(
new AddOrderRowsRequest(
Expand Down Expand Up @@ -194,7 +194,7 @@
)
}
), new PollingTimeout(15)
).ConfigureAwait(false);
);

// Assert
foreach (var id in expectedResponse.OrderRows.Select(x => x.OrderRowId))
Expand All @@ -214,11 +214,11 @@
DataSample.TaskResponse, DataSample.CreditResponse));

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var delivery = order.Deliveries.FirstOrDefault(dlv => dlv.Id == 5588817);
var orderRowIds = delivery.OrderRows.Where(row => row.AvailableActions.Contains(OrderRowActionType.CanCreditRow)).Select(row => (long)row.OrderRowId)
.ToList();
var resourceResponse = await delivery.Actions.CreditOrderRows(new CreditOrderRowsRequest(orderRowIds), new PollingTimeout(15)).ConfigureAwait(false);
var resourceResponse = await delivery.Actions.CreditOrderRows(new CreditOrderRowsRequest(orderRowIds), new PollingTimeout(15));

// Assert
Assert.Equal(expectedTask.ResourceUri.OriginalString, resourceResponse.TaskUri.OriginalString);
Expand All @@ -236,7 +236,7 @@
DataSample.TaskResponse, DataSample.CreditResponse));

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var delivery = order.Deliveries.FirstOrDefault(dlv => dlv.Id == 5588817);
var orderRowIds = delivery.OrderRows.Where(row => row.AvailableActions.Contains(OrderRowActionType.CanCreditRow)).Select(row => (long)row.OrderRowId)
.ToList();
Expand All @@ -246,7 +246,7 @@
new MinorUnit(100),
new MinorUnit(12), 1
)
), new PollingTimeout(15)).ConfigureAwait(false);
), new PollingTimeout(15));

// Assert
Assert.Equal(expectedTask.ResourceUri.OriginalString, resourceResponse.TaskUri.OriginalString);
Expand All @@ -261,7 +261,7 @@
var sveaClient = SveaClient(handlerMock);

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var orderRow = order.OrderRows.FirstOrDefault(row => row.OrderRowId == 1);
await orderRow.Actions.UpdateOrderRow(
new UpdateOrderRowRequest(
Expand All @@ -273,7 +273,7 @@
orderRow.VatPercent,
orderRow.Unit
)
).ConfigureAwait(false);
);

// Assert
// No exeception thrown
Expand All @@ -287,7 +287,7 @@
var sveaClient = SveaClient(handlerMock);

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
await order.Actions.UpdateOrderRows(
new UpdateOrderRowsRequest(
new List<NewOrderRow>
Expand All @@ -314,7 +314,7 @@
)
}
)
).ConfigureAwait(false);
);

// Assert
// No exeception thrown
Expand All @@ -328,8 +328,8 @@
var sveaClient = SveaClient(handlerMock);

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
await order.Actions.Cancel(new CancelRequest(true)).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
await order.Actions.Cancel(new CancelRequest(true));

// Assert
// No exeception thrown
Expand All @@ -343,9 +343,9 @@
var sveaClient = SveaClient(handlerMock);

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var orderRow = order.OrderRows.FirstOrDefault(row => row.OrderRowId == 1);
await orderRow.Actions.CancelOrderRow(new CancelRequest(true)).ConfigureAwait(false);
await orderRow.Actions.CancelOrderRow(new CancelRequest(true));

// Assert
// No exeception thrown
Expand All @@ -359,9 +359,9 @@
var sveaClient = SveaClient(handlerMock);

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
var orderRow = order.OrderRows.FirstOrDefault(row => row.OrderRowId == 1);
await order.Actions.CancelOrderRows(new CancelOrderRowsRequest(new long[] { 1, 2 })).ConfigureAwait(false);
await order.Actions.CancelOrderRows(new CancelOrderRowsRequest(new long[] { 1, 2 }));

// Assert
// No exeception thrown
Expand All @@ -375,7 +375,7 @@
var sveaClient = SveaClient(handlerMock);

// Act
var order = await sveaClient.PaymentAdmin.GetOrder(2291662).ConfigureAwait(false);
var order = await sveaClient.PaymentAdmin.GetOrder(2291662);
await order.Actions.ReplaceOrderRows(
new ReplaceOrderRowsRequest(
new List<NewOrderRow>
Expand All @@ -402,7 +402,7 @@
)
}
)
).ConfigureAwait(false);
);

// Assert
// No exeception thrown
Expand Down
10 changes: 9 additions & 1 deletion src/Svea.WebPay.SDK/CheckoutApi/CreateOrderModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class CreateOrderModel
public CreateOrderModel(RegionInfo countryCode, CurrencyCode currency, Language locale, string clientOrderNumber,
MerchantSettings merchantSettings, Cart cart, bool requireElectronicIdAuthentication, IList<Presetvalue> presetValues = null,
IdentityFlags identityFlags = null, Guid? partnerKey = null, string merchantData = null, ShippingInformation shippingInformation = null,
bool? recurring=null )
bool? recurring=null, OrderValidation validation=null )
{
CountryCode = countryCode;
Currency = currency;
Expand All @@ -56,6 +56,7 @@ public CreateOrderModel(RegionInfo countryCode, CurrencyCode currency, Language
PartnerKey = partnerKey;
MerchantData = merchantData;
ShippingInformation = shippingInformation;
Validation = validation;
Recurring = recurring;
}

Expand Down Expand Up @@ -135,6 +136,13 @@ public CreateOrderModel(RegionInfo countryCode, CurrencyCode currency, Language
/// </summary>
public ShippingInformation ShippingInformation { get; }

/// <summary>
/// Order validations such as minimum age requirement should be fulfilled here.
/// (It's nullable it means you do not need to provide anything in case the age limit is not required)
/// Apply it in order to have order validation such as minimum age
/// </summary>
public OrderValidation Validation { get; set; }

/// <summary>
/// Indicates if the order is recurring order and will create a recurring token when order is finalized. Only applicable if merchant has recurring orders enabled.
/// </summary>
Expand Down
5 changes: 2 additions & 3 deletions src/Svea.WebPay.SDK/CheckoutApi/Data.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
namespace Svea.WebPay.SDK.CheckoutApi
{
using Svea.WebPay.SDK.CheckoutApi.Response;
using System;
using System.Text.Json.Serialization;

Expand Down Expand Up @@ -109,9 +108,9 @@ public Data() : base() { }
public Data(MerchantSettings merchantSettings, Cart cart, Customer customer, Address shippingAddress, Address billingAddress, Gui gui, string locale, string currency,
string countryCode, Presetvalue[] presetValues, string clientOrderNumber, long orderId, string emailAddress, string phoneNumber, PaymentType? paymentType,
CheckoutOrderStatus status, object customerReference, bool? sveaWillBuyOrder, IdentityFlags identityFlags, object merchantData, PaymentInfo payment, string peppolId, GetOrderShippingInformation shippingInformation,
bool? recurring, string recurringToken = null) : base(merchantSettings, cart, customer, shippingAddress, billingAddress, locale, currency, countryCode,
bool? recurring, string recurringToken = null, OrderValidation validation = null) : base(merchantSettings, cart, customer, shippingAddress, billingAddress, locale, currency, countryCode,
presetValues, clientOrderNumber, orderId, emailAddress, phoneNumber, paymentType, status, customerReference,
sveaWillBuyOrder, identityFlags, merchantData, payment, peppolId, shippingInformation, recurring, recurringToken)
sveaWillBuyOrder, identityFlags, merchantData, payment, peppolId, shippingInformation, recurring, recurringToken, validation)
{

Gui = gui;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using System.Text;
using System.Text.Json.Serialization;

namespace Svea.WebPay.SDK.CheckoutApi.Response
namespace Svea.WebPay.SDK.CheckoutApi
{
public class OrderData
{
Expand Down Expand Up @@ -110,7 +110,7 @@ public OrderData() { }
public OrderData(MerchantSettings merchantSettings, Cart cart, Customer customer, Address shippingAddress, Address billingAddress, string locale, string currency,
string countryCode, Presetvalue[] presetValues, string clientOrderNumber, long orderId, string emailAddress, string phoneNumber, PaymentType? paymentType,
CheckoutOrderStatus status, object customerReference, bool? sveaWillBuyOrder, IdentityFlags identityFlags, object merchantData, PaymentInfo payment, string peppolId, GetOrderShippingInformation shippingInformation,
bool? recurring, string recurringToken = null)
bool? recurring, string recurringToken = null, OrderValidation validation = null)
{
MerchantSettings = merchantSettings;
Cart = cart;
Expand All @@ -136,6 +136,7 @@ public OrderData(MerchantSettings merchantSettings, Cart cart, Customer customer
ShippingInformation = shippingInformation;
Recurring = recurring;
RecurringToken = recurringToken;
Validation = validation;
}

/// <summary>
Expand Down Expand Up @@ -272,5 +273,12 @@ public OrderData(MerchantSettings merchantSettings, Cart cart, Customer customer
/// </summary>
[JsonInclude]
public string RecurringToken { get; }

/// <summary>
/// Order validations such as minimum age requirement.
/// Apply it in order to have order validation such as minimum age.
/// </summary>
[JsonInclude]
public OrderValidation Validation { get; }
}
}
16 changes: 16 additions & 0 deletions src/Svea.WebPay.SDK/CheckoutApi/OrderValidation.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace Svea.WebPay.SDK.CheckoutApi
{
public class OrderValidation
{
public OrderValidation() { }
public OrderValidation(long? minAge)
{
MinAge = minAge;
}
public long? MinAge { get; }
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using Svea.WebPay.SDK.CheckoutApi.Response;
using System;
using System.Collections.Generic;
using System.Text;
using System;
using System.Threading.Tasks;

namespace Svea.WebPay.SDK.CheckoutApi.Recurring
Expand Down
Loading