Skip to content

Commit b4792b9

Browse files
committed
Added /Core classes and tests in preparations for the v7-generator-upgrade
1 parent 93ca104 commit b4792b9

36 files changed

+2731
-5
lines changed

Adyen.IntegrationTest/Adyen.IntegrationTest.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net8.0;net6.0</TargetFrameworks>
4+
<TargetFramework>net8.0</TargetFramework>
55
<LangVersion>12</LangVersion>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>disable</Nullable>

Adyen.Test/Adyen.Test.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net8.0;net6.0</TargetFrameworks>
4+
<TargetFramework>net8.0</TargetFramework>
55
<LangVersion>12</LangVersion>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>disable</Nullable>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using Adyen.Core.Auth;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
4+
namespace Adyen.Test.Core.Auth
5+
{
6+
[TestClass]
7+
public class TokenProviderTest
8+
{
9+
internal sealed class TestToken : TokenBase
10+
{
11+
public string Value { get; }
12+
13+
internal TestToken(string value)
14+
{
15+
Value = value;
16+
}
17+
}
18+
19+
[TestMethod]
20+
public async Task Given_TokenProviderWithToken_When_GetCalled_Then_SameInstanceAndValueAreReturned()
21+
{
22+
// Arrange
23+
var token = new TestToken("apikey");
24+
var provider = new TokenProvider<TestToken>(token);
25+
26+
// Act
27+
var result = provider.Get();
28+
29+
// Assert
30+
Assert.AreSame(token, result);
31+
Assert.AreEqual("apikey", result.Value);
32+
}
33+
34+
[TestMethod]
35+
public async Task Given_TokenProvider_When_GetCalledMultipleTimes_Then_SameInstanceReturnedEachTime()
36+
{
37+
// Arrange
38+
var token = new TestToken("apikey");
39+
var provider = new TokenProvider<TestToken>(token);
40+
41+
// Act
42+
var first = provider.Get();
43+
var second = provider.Get();
44+
45+
// Assert
46+
Assert.AreSame(first, second);
47+
}
48+
}
49+
}
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
using System;
2+
using System.IO;
3+
using System.Net;
4+
using System.Net.Http;
5+
using System.Text.Json;
6+
using Microsoft.VisualStudio.TestTools.UnitTesting;
7+
using Adyen.Core.Client;
8+
9+
namespace Adyen.Test.Core.Client
10+
{
11+
[TestClass]
12+
public class ApiResponseTests
13+
{
14+
private HttpRequestMessage CreateRequest(string? uri = "https://adyen.com")
15+
=> new HttpRequestMessage(HttpMethod.Get, uri);
16+
17+
private HttpResponseMessage CreateResponse(HttpStatusCode statusCode, string reasonPhrase = "")
18+
=> new HttpResponseMessage(statusCode)
19+
{
20+
ReasonPhrase = reasonPhrase
21+
};
22+
23+
[TestMethod]
24+
[DataRow(HttpStatusCode.OK, true)]
25+
[DataRow(HttpStatusCode.Created, true)]
26+
[DataRow(HttpStatusCode.Accepted, true)]
27+
[DataRow(HttpStatusCode.BadRequest, false)]
28+
[DataRow(HttpStatusCode.Unauthorized, false)]
29+
[DataRow(HttpStatusCode.Forbidden, false)]
30+
[DataRow(HttpStatusCode.NotFound, false)]
31+
[DataRow(HttpStatusCode.TooManyRequests, false)]
32+
[DataRow(HttpStatusCode.UnprocessableEntity, false)]
33+
[DataRow(HttpStatusCode.InternalServerError, false)]
34+
public async Task Given_ApiResponse_When_SuccessStatusCode_Then_Result_ShouldMatchHttpResponseMessage(HttpStatusCode code, bool expected)
35+
{
36+
// Arrange
37+
// Act
38+
var response = new ApiResponse(CreateRequest(), CreateResponse(code), "", "/", DateTime.UtcNow, new JsonSerializerOptions());
39+
// Assert
40+
Assert.AreEqual(expected, response.IsSuccessStatusCode);
41+
}
42+
43+
[TestMethod]
44+
public async Task Given_ApiResponse_When_Properties_Are_Set_Then_Object_Should_Return_Correct_Values()
45+
{
46+
// Arrange
47+
var request = CreateRequest("https://adyen.com/");
48+
49+
// Act
50+
var responseMessage = CreateResponse(HttpStatusCode.Accepted, "Accepted");
51+
var apiResponse = new ApiResponse(request, responseMessage, "{\"key\":\"value\"}", "/path", DateTime.UtcNow, new JsonSerializerOptions());
52+
53+
// Assert
54+
Assert.AreEqual(responseMessage.StatusCode, apiResponse.StatusCode);
55+
Assert.AreEqual(responseMessage.ReasonPhrase, apiResponse.ReasonPhrase);
56+
Assert.AreEqual(request.RequestUri, apiResponse.RequestUri);
57+
Assert.AreEqual("/path", apiResponse.Path);
58+
Assert.IsNotNull(apiResponse.Headers);
59+
Assert.AreEqual("{\"key\":\"value\"}", apiResponse.RawContent);
60+
Assert.IsNull(apiResponse.ContentStream);
61+
}
62+
63+
[TestMethod]
64+
public async Task Given_ApiResponse_When_ContentStream_Is_Set_Then_Return_ContentStream_And_Empty_RawContent()
65+
{
66+
// Arrange
67+
var request = CreateRequest();
68+
var responseMessage = CreateResponse(HttpStatusCode.OK);
69+
70+
// Act
71+
var stream = new MemoryStream(new byte[] { 1, 2, 3 });
72+
var apiResponse = new ApiResponse(request, responseMessage, stream, "/stream", DateTime.UtcNow, new JsonSerializerOptions());
73+
74+
// Assert
75+
Assert.AreEqual(stream, apiResponse.ContentStream);
76+
Assert.AreEqual(string.Empty, apiResponse.RawContent);
77+
}
78+
79+
private class TestApiResponse<T> : ApiResponse,
80+
IOk<T>, ICreated<T>, IAccepted<T>,
81+
IBadRequest<T>, IUnauthorized<T>, IForbidden<T>, ITooManyRequests<T>, INotFound<T>, IUnprocessableContent<T>, IInternalServerError<T>
82+
{
83+
public TestApiResponse(HttpRequestMessage message, HttpResponseMessage response, string raw, string path, DateTime requested, JsonSerializerOptions opts)
84+
: base(message, response, raw, path, requested, opts) { }
85+
86+
private T DeserializeRaw() => JsonSerializer.Deserialize<T>(RawContent, _jsonSerializerOptions)!;
87+
88+
public T Ok() => DeserializeRaw();
89+
public bool TryDeserializeOkResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
90+
91+
public T Created() => DeserializeRaw();
92+
public bool TryDeserializeCreatedResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
93+
94+
public T Accepted() => DeserializeRaw();
95+
public bool TryDeserializeAcceptedResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
96+
97+
public T BadRequest() => DeserializeRaw();
98+
public bool TryDeserializeBadRequestResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
99+
100+
public T Unauthorized() => DeserializeRaw();
101+
public bool TryDeserializeUnauthorizedResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
102+
103+
public T Forbidden() => DeserializeRaw();
104+
public bool TryDeserializeForbiddenResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
105+
106+
public T TooManyRequests() => DeserializeRaw();
107+
public bool TryDeserializeTooManyRequestsResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
108+
109+
public T NotFound() => DeserializeRaw();
110+
public bool TryDeserializeNotFoundResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
111+
112+
public T UnprocessableContent() => DeserializeRaw();
113+
public bool TryDeserializeUnprocessableContentResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
114+
115+
public T InternalServerError() => DeserializeRaw();
116+
public bool TryDeserializeInternalServerErrorResponse(out T? result) { result = string.IsNullOrEmpty(RawContent) ? default : DeserializeRaw(); return result != null; }
117+
}
118+
119+
private record TestModel(string Foo);
120+
121+
[TestMethod]
122+
public async Task Given_ApiResponse_When_TypedResponses_Then_Deserialize_Correctly()
123+
{
124+
// Arrange
125+
var model = new TestModel("adyen");
126+
127+
// Act
128+
string json = JsonSerializer.Serialize(model, new JsonSerializerOptions());
129+
var response = new TestApiResponse<TestModel>(CreateRequest(), CreateResponse(HttpStatusCode.OK), json, "/path", DateTime.UtcNow, new JsonSerializerOptions());
130+
131+
// Assert
132+
Assert.AreEqual(model, response.Ok());
133+
Assert.IsTrue(response.TryDeserializeOkResponse(out var okResult));
134+
Assert.AreEqual(model, okResult);
135+
136+
Assert.AreEqual(model, response.Created());
137+
Assert.IsTrue(response.TryDeserializeCreatedResponse(out var createdResult));
138+
Assert.AreEqual(model, createdResult);
139+
140+
Assert.AreEqual(model, response.Accepted());
141+
Assert.IsTrue(response.TryDeserializeAcceptedResponse(out var acceptedResult));
142+
Assert.AreEqual(model, acceptedResult);
143+
144+
Assert.AreEqual(model, response.BadRequest());
145+
Assert.IsTrue(response.TryDeserializeBadRequestResponse(out var badResult));
146+
Assert.AreEqual(model, badResult);
147+
148+
Assert.AreEqual(model, response.Unauthorized());
149+
Assert.IsTrue(response.TryDeserializeUnauthorizedResponse(out var unAuthResult));
150+
Assert.AreEqual(model, unAuthResult);
151+
152+
Assert.AreEqual(model, response.Forbidden());
153+
Assert.IsTrue(response.TryDeserializeForbiddenResponse(out var forbiddenResult));
154+
Assert.AreEqual(model, forbiddenResult);
155+
156+
Assert.AreEqual(model, response.TooManyRequests());
157+
Assert.IsTrue(response.TryDeserializeTooManyRequestsResponse(out var tooManyResult));
158+
Assert.AreEqual(model, tooManyResult);
159+
160+
Assert.AreEqual(model, response.NotFound());
161+
Assert.IsTrue(response.TryDeserializeNotFoundResponse(out var notFoundResult));
162+
Assert.AreEqual(model, notFoundResult);
163+
164+
Assert.AreEqual(model, response.UnprocessableContent());
165+
Assert.IsTrue(response.TryDeserializeUnprocessableContentResponse(out var unprocessableResult));
166+
Assert.AreEqual(model, unprocessableResult);
167+
168+
Assert.AreEqual(model, response.InternalServerError());
169+
Assert.IsTrue(response.TryDeserializeInternalServerErrorResponse(out var internalResult));
170+
Assert.AreEqual(model, internalResult);
171+
}
172+
}
173+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using Adyen.Core.Client.Extensions;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
4+
namespace Adyen.Test.Core.Client
5+
{
6+
[TestClass]
7+
public class HttpRequestMessageExtensionsTest
8+
{
9+
[TestMethod]
10+
public void Given_AddUserAgentToHeaders_When_ApplicationName_Is_Null_Returns_adyen_dotnet_api_library_And_AdyenLibraryVersion()
11+
{
12+
// Arrange
13+
HttpRequestMessageExtensions.ApplicationName = null;
14+
var request = new HttpRequestMessage();
15+
16+
// Act
17+
request.AddUserAgentToHeaders();
18+
19+
// Assert
20+
string target = request.Headers.GetValues("UserAgent").First();
21+
Assert.AreEqual($"adyen-dotnet-api-library/{HttpRequestMessageExtensions.AdyenLibraryVersion}", target);
22+
}
23+
24+
[TestMethod]
25+
public void Given_AddUserAgentToHeaders_When_ApplicationName_Is_Set_Returns_MyApp_adyen_dotnet_api_library_And_AdyenLibraryVersion()
26+
{
27+
// Arrange
28+
var request = new HttpRequestMessage();
29+
HttpRequestMessageExtensions.ApplicationName = "MyApp";
30+
31+
// Act
32+
request.AddUserAgentToHeaders();
33+
34+
// Assert
35+
string target = request.Headers.GetValues("UserAgent").First();
36+
Assert.AreEqual($"MyApp adyen-dotnet-api-library/{HttpRequestMessageExtensions.AdyenLibraryVersion}", target);
37+
}
38+
39+
[TestMethod]
40+
public void Given_AddLibraryNameToHeader_When_Provided_Returns_adyen_dotnet_api_library()
41+
{
42+
// Arrange
43+
HttpRequestMessageExtensions.ApplicationName = null;
44+
var request = new HttpRequestMessage();
45+
46+
// Act
47+
request.AddLibraryNameToHeader();
48+
49+
// Assert
50+
string target = request.Headers.GetValues("adyen-library-name").First();
51+
Assert.AreEqual("adyen-dotnet-api-library", target);
52+
}
53+
54+
[TestMethod]
55+
public void Given_AddLibraryNameToHeader_When_Provided_Returns_AdyenLibraryVersion()
56+
{
57+
// Arrange
58+
HttpRequestMessageExtensions.ApplicationName = null;
59+
var request = new HttpRequestMessage();
60+
61+
// Act
62+
request.AddLibraryVersionToHeader();
63+
64+
// Assert
65+
string target = request.Headers.GetValues("adyen-library-version").First();
66+
Assert.AreEqual(HttpRequestMessageExtensions.AdyenLibraryVersion, target);
67+
}
68+
69+
[TestMethod]
70+
public void Given_AddUserAgentToHeaders_When_Called_MultipleTimes_Should_Not_Throw_Any_Exceptions()
71+
{
72+
// Arrange
73+
HttpRequestMessageExtensions.ApplicationName = null;
74+
var request = new HttpRequestMessage();
75+
76+
// Act
77+
// Assert
78+
try
79+
{
80+
request.AddUserAgentToHeaders();
81+
request.AddUserAgentToHeaders();
82+
83+
request.AddLibraryNameToHeader();
84+
request.AddLibraryNameToHeader();
85+
86+
request.AddLibraryVersionToHeader();
87+
request.AddLibraryVersionToHeader();
88+
}
89+
catch (Exception e)
90+
{
91+
Assert.Fail();
92+
}
93+
}
94+
}
95+
}

0 commit comments

Comments
 (0)