Skip to content
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
4 changes: 2 additions & 2 deletions EasyPost.Integration/TestUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public VCR(string? testCassettesFolder = null, ApiKey apiKey = ApiKey.Test)
Censors = censors,
SimulateDelay = false,
ManualDelay = 0,
ValidTimeFrame = TimeFrame.Months6,
ValidTimeFrame = TimeFrame.Months12,
WhenExpired = ExpirationActions.Warn
};
_vcr = new EasyVCR.VCR(advancedSettings);
Expand Down Expand Up @@ -151,7 +151,7 @@ internal Client SetUpTest(string cassetteName, Func<string, HttpClient, Client>
// set up cassette
Cassette cassette = new(_testCassettesFolder, cassetteName, new CassetteOrder.Alphabetical());

// add cassette to vcr
// add cassette to vcr
_vcr.Insert(cassette);

string filePath = Path.Combine(_testCassettesFolder, cassetteName + ".json");
Expand Down
3 changes: 3 additions & 0 deletions EasyPost.Tests/Fixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ public static byte[] EventBody

internal static string WebhookUrl => GetFixtureStructure().WebhookUrl;

// TODO: Add WebhookCustomHeaders
// TODO: Pull in updated examples submodule, update all above references to webhook fixture data

internal static Dictionary<string, object> BasicCarrierAccount => GetFixtureStructure().CarrierAccounts.Basic;

internal static Dictionary<string, object> BasicCustomsInfo => GetFixtureStructure().CustomsInfos.Basic;
Expand Down
2 changes: 2 additions & 0 deletions EasyPost.Tests/ServicesTests/WebhookServiceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public async Task TestCreate()

string url = $"https://example.com/create/{TestUtils.NetVersion}";

// TODO: Add webhook_secret and custom_headers params
Webhook webhook = await Client.Webhook.Create(new Dictionary<string, object> { { "url", url } });
CleanUpAfterTest(webhook.Id);

Expand Down Expand Up @@ -162,6 +163,7 @@ public async Task TestUpdate()
Thread.Sleep(10000); // Wait enough time to process
}

// TODO: Add webhook_secret and custom_headers params
webhook = await Client.Webhook.Update(webhook.Id, new Dictionary<string, object>());

Assert.IsType<Webhook>(webhook);
Expand Down
112 changes: 56 additions & 56 deletions EasyPost.Tests/TestUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public VCR(string? testCassettesFolder = null, ApiKey apiKey = ApiKey.Test)
Censors = censors,
SimulateDelay = false,
ManualDelay = 0,
ValidTimeFrame = TimeFrame.Months6,
ValidTimeFrame = TimeFrame.Months12,
WhenExpired = ExpirationActions.Warn
};
_vcr = new EasyVCR.VCR(advancedSettings);
Expand Down Expand Up @@ -191,81 +191,81 @@ public class MockRequestMatchRules(Method method, string resourceRegex)
{
internal Method Method { get; set; } = method;

internal string ResourceRegex { get; set; } = resourceRegex;
}
internal string ResourceRegex { get; set; } = resourceRegex;
}

public class MockRequestResponseInfo(HttpStatusCode statusCode, string? content = null, object? data = null)
public class MockRequestResponseInfo(HttpStatusCode statusCode, string? content = null, object? data = null)
{
internal HttpStatusCode StatusCode { get; set; } = statusCode;

internal string? Content { get; set; } = content ?? JsonSerialization.ConvertObjectToJson(data);
}
internal string? Content { get; set; } = content ?? JsonSerialization.ConvertObjectToJson(data);
}

public class MockRequest
{
public MockRequestMatchRules MatchRules { get; }
public class MockRequest
{
public MockRequestMatchRules MatchRules { get; }

public MockRequestResponseInfo ResponseInfo { get; }
public MockRequestResponseInfo ResponseInfo { get; }

internal MockRequest(MockRequestMatchRules matchRules, MockRequestResponseInfo responseInfo)
{
MatchRules = matchRules;
ResponseInfo = responseInfo;
}
}
internal MockRequest(MockRequestMatchRules matchRules, MockRequestResponseInfo responseInfo)
{
MatchRules = matchRules;
ResponseInfo = responseInfo;
}
}

internal sealed class MockClient : Client
{
private readonly List<MockRequest> _mockRequests = new();
internal sealed class MockClient : Client
{
private readonly List<MockRequest> _mockRequests = new();

#pragma warning disable CS1998
public override async Task<HttpResponseMessage> ExecuteRequest(HttpRequestMessage request, CancellationToken cancellationToken)
public override async Task<HttpResponseMessage> ExecuteRequest(HttpRequestMessage request, CancellationToken cancellationToken)
#pragma warning restore CS1998
{
MockRequest? mockRequest = FindMatchingMockRequest(request);
{
MockRequest? mockRequest = FindMatchingMockRequest(request);

if (mockRequest == null)
{
if (mockRequest == null)
{
#pragma warning disable CA2201
throw new Exception("No matching mock request found");
throw new Exception("No matching mock request found");
#pragma warning restore CA2201
}
}

return new HttpResponseMessage
{
Content = new StringContent(mockRequest.ResponseInfo.Content),
StatusCode = mockRequest.ResponseInfo.StatusCode,
};
}
return new HttpResponseMessage
{
Content = new StringContent(mockRequest.ResponseInfo.Content),
StatusCode = mockRequest.ResponseInfo.StatusCode,
};
}

internal MockClient(EasyPostClient client) : base(new ClientConfiguration(client.ApiKeyInUse)
{
ApiBase = client.ApiBaseInUse,
CustomHttpClient = client.CustomHttpClient,
})
{
}
internal MockClient(EasyPostClient client) : base(new ClientConfiguration(client.ApiKeyInUse)
{
ApiBase = client.ApiBaseInUse,
CustomHttpClient = client.CustomHttpClient,
})
{
}

internal void AddMockRequest(MockRequest mockRequest) => _mockRequests.Add(mockRequest);
internal void AddMockRequest(MockRequest mockRequest) => _mockRequests.Add(mockRequest);

internal void AddMockRequests(IEnumerable<MockRequest> mockRequests) => _mockRequests.AddRange(mockRequests);
internal void AddMockRequests(IEnumerable<MockRequest> mockRequests) => _mockRequests.AddRange(mockRequests);

private MockRequest? FindMatchingMockRequest(HttpRequestMessage request) => _mockRequests.FirstOrDefault(mock => mock.MatchRules.Method.HttpMethod == request.Method && EndpointMatches(request.RequestUri.AbsoluteUri, mock.MatchRules.ResourceRegex));
private MockRequest? FindMatchingMockRequest(HttpRequestMessage request) => _mockRequests.FirstOrDefault(mock => mock.MatchRules.Method.HttpMethod == request.Method && EndpointMatches(request.RequestUri.AbsoluteUri, mock.MatchRules.ResourceRegex));

private static bool EndpointMatches(string endpoint, string pattern)
{
try
{
return Regex.IsMatch(endpoint,
pattern,
RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | RegexOptions.Singleline,
TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{
return false;
private static bool EndpointMatches(string endpoint, string pattern)
{
try
{
return Regex.IsMatch(endpoint,
pattern,
RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | RegexOptions.Singleline,
TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{
return false;
}
}
}
}
}
}
}
2 changes: 2 additions & 0 deletions EasyPost/Parameters/Webhook/Create.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public class Create : BaseParameters<Models.API.Webhook>, IWebhookParameter
[TopLevelRequestParameter(Necessity.Required, "url")]
public string? Url { get; set; }

// TODO: Add custom_headers

#endregion
}
}
2 changes: 2 additions & 0 deletions EasyPost/Parameters/Webhook/Update.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public class Update : BaseParameters<Models.API.Webhook>
[TopLevelRequestParameter(Necessity.Optional, "webhook_secret")]
public string? Secret { get; set; }

// TODO: Add custom_headers

#endregion
}
}
Loading