Skip to content

Commit 31561cb

Browse files
chore: addressed comments on PR
1 parent 7bedad0 commit 31561cb

8 files changed

Lines changed: 32 additions & 24 deletions

File tree

src/TrueLayer/Extensions/UriExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ public static class UriExtensions
1010
{
1111
public static Uri Append(this Uri uri, params string[] segments)
1212
{
13-
string newUri = string.Join("/", new[] { uri.AbsoluteUri.TrimEnd('/') }
14-
.Concat(segments.Select(s => s.Trim('/'))));
13+
string newUri = string.Join("/", new[] { uri.AbsoluteUri.TrimEnd('/').Replace("\\", string.Empty) }
14+
.Concat(segments.Select(s => s.Replace("\\", string.Empty).Trim('/'))));
1515
return new Uri(newUri);
1616
}
1717

src/TrueLayer/Guard.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Diagnostics;
33
using System.Diagnostics.CodeAnalysis;
44
using System.Linq;
5+
using System.Text.RegularExpressions;
56

67
namespace TrueLayer
78
{
@@ -98,15 +99,17 @@ public static T GreaterThan<T>([NotNull] this T value, T greaterThan, string par
9899
/// <exception cref="ArgumentException">Thrown when the value is an URL</exception>
99100
/// <example>
100101
/// <code>
101-
/// _id = id.NotAnUrl(nameof(id));
102+
/// _id = id.NotAUrl(nameof(id));
102103
/// </code>
103104
/// </example>
104105
[DebuggerStepThrough]
105-
public static string? NotAnUrl(this string? value, string name)
106+
public static string? NotAUrl(this string? value, string name)
106107
=> value is not null
107108
&& (value.Contains(' ')
108109
|| Uri.IsWellFormedUriString(value, UriKind.Absolute)
109-
|| (value.Contains('/') && Uri.IsWellFormedUriString(value, UriKind.Relative)))
110+
|| value.StartsWith('\\')
111+
|| value.Contains('/')
112+
|| value.Contains('.'))
110113
? throw new ArgumentException("Value is malformed", name)
111114
: value;
112115
}

src/TrueLayer/Mandates/MandatesApi.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public async Task<ApiResponse<CreateMandateResponse>> CreateMandate(CreateMandat
7070
public async Task<ApiResponse<MandateDetailUnion>> GetMandate(string mandateId, MandateType mandateType, CancellationToken cancellationToken = default)
7171
{
7272
mandateId.NotNullOrWhiteSpace(nameof(mandateId));
73-
mandateId.NotAnUrl(nameof(mandateId));
73+
mandateId.NotAUrl(nameof(mandateId));
7474

7575
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest($"recurring_payments:{mandateType.AsString()}"), cancellationToken);
7676

@@ -97,8 +97,8 @@ public async Task<ApiResponse<ResourceCollection<MandateDetailUnion>>> ListManda
9797
}
9898

9999
var queryParameters = System.Web.HttpUtility.ParseQueryString(string.Empty);
100-
queryParameters["user_id"] = query.UserId.NotAnUrl($"{nameof(query)}.{nameof(query.UserId)}");
101-
queryParameters["cursor"] = query.Cursor.NotAnUrl($"{nameof(query)}.{nameof(query.UserId)}");
100+
queryParameters["user_id"] = query.UserId.NotAUrl($"{nameof(query)}.{nameof(query.UserId)}");
101+
queryParameters["cursor"] = query.Cursor.NotAUrl($"{nameof(query)}.{nameof(query.UserId)}");
102102
queryParameters["limit"] = query.Limit.ToString();
103103
var baseUriBuilder = new UriBuilder(_baseUri) { Query = queryParameters.ToString() };
104104

@@ -113,7 +113,7 @@ public async Task<ApiResponse<ResourceCollection<MandateDetailUnion>>> ListManda
113113
public async Task<ApiResponse<AuthorizationResponseUnion>> StartAuthorizationFlow(string mandateId, StartAuthorizationFlowRequest request, string idempotencyKey, MandateType mandateType, CancellationToken cancellationToken = default)
114114
{
115115
mandateId.NotNullOrWhiteSpace(nameof(mandateId));
116-
mandateId.NotAnUrl(nameof(mandateId));
116+
mandateId.NotAUrl(nameof(mandateId));
117117
request.NotNull(nameof(request));
118118
idempotencyKey.NotNullOrWhiteSpace(nameof(idempotencyKey));
119119
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest($"recurring_payments:{mandateType.AsString()}"), cancellationToken);
@@ -137,7 +137,7 @@ public async Task<ApiResponse<AuthorizationResponseUnion>> StartAuthorizationFlo
137137
public async Task<ApiResponse<AuthorizationResponseUnion>> SubmitProviderSelection(string mandateId, SubmitProviderSelectionRequest request, string idempotencyKey, MandateType mandateType, CancellationToken cancellationToken = default)
138138
{
139139
mandateId.NotNullOrWhiteSpace(nameof(mandateId));
140-
mandateId.NotAnUrl(nameof(mandateId));
140+
mandateId.NotAUrl(nameof(mandateId));
141141
request.NotNull(nameof(request));
142142
idempotencyKey.NotNullOrWhiteSpace(nameof(idempotencyKey));
143143
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest($"recurring_payments:{mandateType.AsString()}"), cancellationToken);
@@ -160,7 +160,7 @@ public async Task<ApiResponse<AuthorizationResponseUnion>> SubmitProviderSelecti
160160
public async Task<ApiResponse<AuthorizationResponseUnion>> SubmitConsent(string mandateId, string idempotencyKey, MandateType mandateType, CancellationToken cancellationToken = default)
161161
{
162162
mandateId.NotNullOrWhiteSpace(nameof(mandateId));
163-
mandateId.NotAnUrl(nameof(mandateId));
163+
mandateId.NotAUrl(nameof(mandateId));
164164
idempotencyKey.NotNullOrWhiteSpace(nameof(idempotencyKey));
165165
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest($"recurring_payments:{mandateType.AsString()}"), cancellationToken);
166166

@@ -183,7 +183,7 @@ public async Task<ApiResponse<AuthorizationResponseUnion>> SubmitConsent(string
183183
public async Task<ApiResponse<GetConfirmationOfFundsResponse>> GetConfirmationOfFunds(string mandateId, int amountInMinor, string currency, MandateType mandateType, CancellationToken cancellationToken = default)
184184
{
185185
mandateId.NotNullOrWhiteSpace(nameof(mandateId));
186-
mandateId.NotAnUrl(nameof(mandateId));
186+
mandateId.NotAUrl(nameof(mandateId));
187187

188188
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest($"recurring_payments:{mandateType.AsString()}"), cancellationToken);
189189

@@ -203,7 +203,7 @@ public async Task<ApiResponse<GetConfirmationOfFundsResponse>> GetConfirmationOf
203203
public async Task<ApiResponse<GetConstraintsResponse>> GetMandateConstraints(string mandateId, MandateType mandateType, CancellationToken cancellationToken = default)
204204
{
205205
mandateId.NotNullOrWhiteSpace(nameof(mandateId));
206-
mandateId.NotAnUrl(nameof(mandateId));
206+
mandateId.NotAUrl(nameof(mandateId));
207207

208208
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest($"recurring_payments:{mandateType.AsString()}"), cancellationToken);
209209

@@ -223,7 +223,7 @@ public async Task<ApiResponse<GetConstraintsResponse>> GetMandateConstraints(str
223223
public async Task<ApiResponse> RevokeMandate(string mandateId, string idempotencyKey, MandateType mandateType, CancellationToken cancellationToken = default)
224224
{
225225
mandateId.NotNullOrWhiteSpace(nameof(mandateId));
226-
mandateId.NotAnUrl(nameof(mandateId));
226+
mandateId.NotAUrl(nameof(mandateId));
227227

228228
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest($"recurring_payments:{mandateType.AsString()}"), cancellationToken);
229229

src/TrueLayer/MerchantAccounts/MerchantAccountsApi.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public async Task<ApiResponse<ResourceCollection<MerchantAccount>>> ListMerchant
4848
public async Task<ApiResponse<MerchantAccount>> GetMerchantAccount(string id, CancellationToken cancellationToken = default)
4949
{
5050
id.NotNullOrWhiteSpace(nameof(id));
51-
id.NotAnUrl(nameof(id));
51+
id.NotAUrl(nameof(id));
5252

5353
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest("payments"), cancellationToken);
5454

@@ -69,9 +69,9 @@ public async Task<ApiResponse<MerchantAccount>> GetMerchantAccount(string id, Ca
6969
public async Task<ApiResponse<GetPaymentSourcesResponse>> GetPaymentSources(string merchantAccountId, string userId, CancellationToken cancellationToken = default)
7070
{
7171
merchantAccountId.NotNullOrWhiteSpace(nameof(merchantAccountId));
72-
merchantAccountId.NotAnUrl(nameof(merchantAccountId));
72+
merchantAccountId.NotAUrl(nameof(merchantAccountId));
7373
userId.NotNullOrWhiteSpace(nameof(userId));
74-
userId.NotAnUrl(nameof(userId));
74+
userId.NotAUrl(nameof(userId));
7575

7676
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest("payments"), cancellationToken);
7777

src/TrueLayer/Payments/PaymentsApi.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public async Task<ApiResponse<CreatePaymentUnion>> CreatePayment(CreatePaymentRe
7777
public async Task<ApiResponse<GetPaymentUnion>> GetPayment(string id, CancellationToken cancellationToken = default)
7878
{
7979
id.NotNullOrWhiteSpace(nameof(id));
80-
id.NotAnUrl(nameof(id));
80+
id.NotAUrl(nameof(id));
8181

8282
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest("payments"), cancellationToken);
8383

src/TrueLayer/PaymentsProviders/PaymentsApi.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public PaymentsProvidersApi(IApiClient apiClient, TrueLayerOptions options)
2929
public async Task<ApiResponse<PaymentsProvider>> GetPaymentsProvider(string id)
3030
{
3131
id.NotNullOrWhiteSpace(nameof(id));
32-
id.NotAnUrl(nameof(id));
32+
id.NotAUrl(nameof(id));
3333

3434
UriBuilder baseUri = new(_baseUri.Append(id)) { Query = $"client_id={_options.ClientId}" };
3535

src/TrueLayer/Payouts/PayoutsApi.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public async Task<ApiResponse<CreatePayoutResponse>> CreatePayout(CreatePayoutRe
6666
public async Task<ApiResponse<GetPayoutUnion>> GetPayout(string id, CancellationToken cancellationToken = default)
6767
{
6868
id.NotNullOrWhiteSpace(nameof(id));
69-
id.NotAnUrl(nameof(id));
69+
id.NotAUrl(nameof(id));
7070

7171
ApiResponse<GetAuthTokenResponse> authResponse = await _auth.GetAuthToken(new GetAuthTokenRequest("payments"), cancellationToken);
7272

test/TrueLayer.Tests/GuardTests.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,25 @@ public void Greater_than_does_not_throw_if_greater_than_value()
4848
[InlineData("85BF9448-A93F-4F5F-A325-8B5BA7845F83")]
4949
[InlineData("{C5A41B28-109A-41C5-8CFD-695CC52A7539}")]
5050
[InlineData("12345")]
51-
public void NotAnUrl_WithNullOrNonUrlValue_ReturnsSameValue(string? value)
51+
public void NotAUrl_WithNullOrNonUrlValue_ReturnsSameValue(string? value)
5252
{
53-
Assert.Equal(value, value.NotAnUrl("value"));
53+
Assert.Equal(value, value.NotAUrl("value"));
5454
}
5555

5656
[Theory]
5757
[InlineData("http://example.com")]
5858
[InlineData("https://example.com")]
5959
[InlineData("/relative/url")]
6060
[InlineData("http://example.com?query=string")]
61+
[InlineData("http://example.com?query=string&otherquery=foo")]
6162
[InlineData("http://example.com/path%20with%20spaces")]
6263
[InlineData("string with spaces")]
6364
[InlineData("A7+uG3zwvUiKtrwb/ZtQow==")]
64-
public void NotAnUrl_WithUrlValue_ThrowsArgumentException(string value)
65-
=> Assert.Throws<ArgumentException>(() => value.NotAnUrl("value"));
65+
[InlineData("\\/g8ph66mx5ltptbsdfwmr6kut2k8bw8kx.oastify.com")]
66+
[InlineData("fake.test.com")]
67+
[InlineData("fake.com")]
68+
[InlineData("fake.com/")]
69+
public void NotAUrl_WithUrlValue_ThrowsArgumentException(string value)
70+
=> Assert.Throws<ArgumentException>(() => value.NotAUrl("value"));
6671
}
6772
}

0 commit comments

Comments
 (0)