1
0
mirror of https://github.com/bitwarden/server.git synced 2024-11-30 13:33:24 +01:00
bitwarden-server/test/Billing.Test/Services/PayPalIPNClientTests.cs
Alex Morask 6cc53b4739
Fix PayPal IPN Logging (#3768)
* Remove request logging, fix txn_id correlation

* Respond 400 when txn_id is missing

* More cleanup
2024-02-08 15:37:41 +00: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(string.Empty, 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(string.Empty, 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(string.Empty, 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(string.Empty, formData);
Assert.True(verified);
Assert.Equal(1, _mockHttpMessageHandler.GetMatchCount(request));
}
}