1
0
mirror of https://github.com/bitwarden/server.git synced 2024-12-02 13:53:23 +01:00
bitwarden-server/test/Billing.Test/Services/PayPalIPNClientTests.cs
Alex Morask cc2a81ae3f
[AC-1800] PayPal IPN Refactor (#3619)
* Add more logging to PayPal IPN webhook

* Add PayPalIPNClient tests

* Add PayPalControllerTests

---------

Co-authored-by: aelinton <95626935+aelinton@users.noreply.github.com>
2024-01-30 09:03:50 -05:00

87 lines
2.9 KiB
C#

using System.Net;
using Bit.Billing.Services;
using Bit.Billing.Services.Implementations;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using NSubstitute;
using RichardSzalay.MockHttp;
using Xunit;
namespace Bit.Billing.Test.Services;
public class PayPalIPNClientTests
{
private readonly Uri _endpoint = new("https://www.sandbox.paypal.com/cgi-bin/webscr");
private readonly MockHttpMessageHandler _mockHttpMessageHandler = new();
private readonly IOptions<BillingSettings> _billingSettings = Substitute.For<IOptions<BillingSettings>>();
private readonly ILogger<PayPalIPNClient> _logger = Substitute.For<ILogger<PayPalIPNClient>>();
private readonly IPayPalIPNClient _payPalIPNClient;
public PayPalIPNClientTests()
{
var httpClient = new HttpClient(_mockHttpMessageHandler)
{
BaseAddress = _endpoint
};
_payPalIPNClient = new PayPalIPNClient(
_billingSettings,
httpClient,
_logger);
}
[Fact]
public async Task VerifyIPN_FormDataNull_ThrowsArgumentNullException()
=> await Assert.ThrowsAsync<ArgumentNullException>(() => _payPalIPNClient.VerifyIPN(Guid.NewGuid(), null));
[Fact]
public async Task VerifyIPN_Unauthorized_ReturnsFalse()
{
const string formData = "form=data";
var request = _mockHttpMessageHandler
.Expect(HttpMethod.Post, _endpoint.ToString())
.WithFormData(new Dictionary<string, string> { { "cmd", "_notify-validate" }, { "form", "data" } })
.Respond(HttpStatusCode.Unauthorized);
var verified = await _payPalIPNClient.VerifyIPN(Guid.NewGuid(), formData);
Assert.False(verified);
Assert.Equal(1, _mockHttpMessageHandler.GetMatchCount(request));
}
[Fact]
public async Task VerifyIPN_OK_Invalid_ReturnsFalse()
{
const string formData = "form=data";
var request = _mockHttpMessageHandler
.Expect(HttpMethod.Post, _endpoint.ToString())
.WithFormData(new Dictionary<string, string> { { "cmd", "_notify-validate" }, { "form", "data" } })
.Respond("application/text", "INVALID");
var verified = await _payPalIPNClient.VerifyIPN(Guid.NewGuid(), formData);
Assert.False(verified);
Assert.Equal(1, _mockHttpMessageHandler.GetMatchCount(request));
}
[Fact]
public async Task VerifyIPN_OK_Verified_ReturnsTrue()
{
const string formData = "form=data";
var request = _mockHttpMessageHandler
.Expect(HttpMethod.Post, _endpoint.ToString())
.WithFormData(new Dictionary<string, string> { { "cmd", "_notify-validate" }, { "form", "data" } })
.Respond("application/text", "VERIFIED");
var verified = await _payPalIPNClient.VerifyIPN(Guid.NewGuid(), formData);
Assert.True(verified);
Assert.Equal(1, _mockHttpMessageHandler.GetMatchCount(request));
}
}