Index: Src/GoogleApis.Tests/Apis/Requests/ClientServiceRequestTest.cs |
=================================================================== |
--- a/Src/GoogleApis.Tests/Apis/Requests/ClientServiceRequestTest.cs |
b/Src/GoogleApis.Tests/Apis/Requests/ClientServiceRequestTest.cs |
@@ -38,7 38,7 @@ |
namespace Google.Apis.Tests.Apis.Requests |
{ |
- /// <summary> Tests for the <see cref="Google.Apis.Requests.ClientServiceRequest"/>. </summary> |
/// <summary>Tests for the <see cref="Google.Apis.Requests.ClientServiceRequest"/>.</summary> |
[TestFixture] |
public class ClientServiceRequestTest |
{ |
@@ -49,7 49,7 @@ |
// ApplicationContext.RegisterLogger(new Google.Apis.Logging.Log4NetLogger()); |
} |
- /// <summary> Helper method to get a string from the stream. </summary> |
/// <summary>Helper method to get a string from the stream.</summary> |
private static string ExtractStringFromStream(Stream stream) |
{ |
var buffer = new byte[1000]; |
@@ -57,7 57,7 @@ |
return Encoding.UTF8.GetString(buffer, 0, len); |
} |
- /// <summary> A mock response class. </summary> |
/// <summary>A mock response class.</summary> |
class MockResponse : IDirectResponseSchema |
{ |
[Newtonsoft.Json.JsonPropertyAttribute("etag")] |
@@ -81,7 81,7 @@ |
} |
} |
- /// <summary> A mock request class. </summary> |
/// <summary>A mock request class.</summary> |
class MockRequest : IDirectResponseSchema |
{ |
[Newtonsoft.Json.JsonPropertyAttribute("etag")] |
@@ -102,10 102,10 @@ |
} |
} |
- /// <summary> A mock service request which returns <see cref="MockResponse"/>. </summary> |
/// <summary>A mock service request which returns <see cref="MockResponse"/>.</summary> |
class TestClientServiceRequest : ClientServiceRequest<MockResponse> |
{ |
- /// <summary> Gets or sets a request number. It's used on concurrent tests. </summary> |
/// <summary>Gets or sets a request number. It's used on concurrent tests.</summary> |
public int CallNum { get; set; } |
private string httpMethod; |
private object body; |
@@ -139,7 139,7 @@ |
} |
} |
- /// <summary> A mock message handler which returns an error. </summary> |
/// <summary>A mock message handler which returns an error.</summary> |
class ErrorMessageHanlder : CountableMessageHandler |
{ |
public string ExpectedError = |
@@ -176,22 176,22 @@ |
} |
} |
- /// <summary> Tests message handler which tests the content on the request and the response. </summary> |
- class TestBodyMessageHnalder : CountableMessageHandler |
/// <summary>Tests message handler which tests the content on the request and the response.</summary> |
class TestBodyMessageHandler : CountableMessageHandler |
{ |
- /// <summary> Gets or sets indication is GZip is eanbled. </summary> |
/// <summary>Gets or sets indication is GZip is eanbled.</summary> |
public bool GZipEnabled { get; set; } |
- /// <summary> Gets or sets the expected request object. </summary> |
/// <summary>Gets or sets the expected request object.</summary> |
public MockRequest ExpectedRequestObject { get; set; } |
- /// <summary> Gets or sets the returned response object </summary> |
/// <summary>Gets or sets the returned response object </summary> |
public MockResponse ResponseObject { get; set; } |
- /// <summary> Gets or sets the Serializer which is used to serialize and deserialize messages. </summary> |
/// <summary>Gets or sets the Serializer which is used to serialize and deserialize messages.</summary> |
public ISerializer Serializer { get; set; } |
- /// <summary> Gets the thread id in which this handler was invoked. </summary> |
/// <summary>Gets the thread id in which this handler was invoked.</summary> |
public int ThreadId { get; private set; } |
public string ResponseETag = "\"some-etag-here\""; |
@@ -203,7 203,7 @@ |
var mediaType = "application/json"; |
string strObject = null; |
- // if gzip enabled the request content is a gzip stream, otherwise it's a string content |
// If gzip enabled the request content is a gzip stream, otherwise it's a string content. |
if (GZipEnabled) |
{ |
Assert.That(request.Content, Is.AssignableFrom<StreamContent>()); |
@@ -227,11 227,11 @@ |
CharSet = Encoding.UTF8.WebName |
})); |
- // deserialize the requested object and check it's equal to the expected object |
// Deserialize the requested object and check it's equal to the expected object. |
var obj = Serializer.Deserialize<MockRequest>(strObject); |
Assert.That(obj, Is.EqualTo(ExpectedRequestObject)); |
- // return the response (with ETag) |
// Return the response (with ETag). |
var response = new HttpResponseMessage(); |
var serializedObject = Serializer.Serialize(ResponseObject); |
response.Content = new StringContent(serializedObject, Encoding.UTF8, mediaType); |
@@ -240,7 240,7 @@ |
} |
} |
- /// <summary> |
/// <summary> |
/// A mock exception which is thrown from a mock message handler in case it is configured to throw exceptions. |
/// </summary> |
class InvalidOperationMockException : Exception |
@@ -251,7 251,7 @@ |
} |
} |
- /// <summary> A message handler which returns an Http response message or throw an exception. </summary> |
/// <summary>A message handler which returns a HTTP response message or throw an exception.</summary> |
class MockMessageHandler : CountableMessageHandler |
{ |
private bool ThrowException { get; set; } |
@@ -274,13 274,13 @@ |
} |
} |
- /// <summary> A message handler which is used to cancel an Http request in the middle.</summary> |
/// <summary>A message handler which is used to cancel a HTTP request in the middle.</summary> |
class CancelRedirectMessageHandler : CountableMessageHandler |
{ |
- /// <summary> The cancellation token we are going to use to cancel a request.</summary> |
/// <summary>The cancellation token we are going to use to cancel a request.</summary> |
public CancellationTokenSource CancellationTokenSource { get; set; } |
- /// <summary> The request index we are going to cancel.</summary> |
/// <summary>The request index we are going to cancel.</summary> |
public int CancelRequestNum { get; set; } |
protected override Task<HttpResponseMessage> SendAsyncCore(HttpRequestMessage request, |
@@ -303,13 303,13 @@ |
} |
} |
- /// <summary> |
/// <summary> |
/// A message handler which checks concurrent calls (each odd request will succeeded, and even request will |
/// fail on the first try and will succeeded in the second try. |
/// </summary> |
class ConcurrentCallsHandler : CountableMessageHandler |
{ |
- /// <summary> Gets or sets the Serializer which is used to serialize and deserialize messages. </summary> |
/// <summary>Gets or sets the Serializer which is used to serialize and deserialize messages.</summary> |
public ISerializer Serializer { get; set; } |
protected override Task<HttpResponseMessage> SendAsyncCore(HttpRequestMessage request, |
@@ -335,16 335,18 @@ |
return tcs.Task; |
} |
- /// <summary> Unsuccessful response handler which "handles" service unavailable responses. </summary> |
/// <summary>Unsuccessful response handler which "handles" service unavailable responses.</summary> |
internal class ServiceUnavailableUnsuccessfulResponseHandler : IHttpUnsuccessfulResponseHandler |
{ |
- public bool HandleResponse(HandleUnsuccessfulResponseArgs args) |
public Task<bool> HandleResponseAsync(HandleUnsuccessfulResponseArgs args) |
{ |
- return args.Response.StatusCode == System.Net.HttpStatusCode.ServiceUnavailable; |
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); |
tcs.SetResult(args.Response.StatusCode.Equals(HttpStatusCode.ServiceUnavailable)); |
return tcs.Task; |
} |
} |
- /// <summary> |
/// <summary> |
/// Adds service unavailable unsuccessful response handler to the configurable message handler. |
/// </summary> |
internal class Initializer : IConfigurableHttpClientInitializer |
@@ -359,7 361,7 @@ |
#region Execute (and ExecuteAsync) |
- /// <summary> Tests that canceling a outgoing request to the server works as expected.</summary> |
/// <summary>Tests that canceling a outgoing request to the server works as expected.</summary> |
[Test] |
public void ExecuteAsync_Cancel() |
{ |
@@ -399,13 401,14 @@ |
{ |
if (ex.InnerException is TaskCanceledException) |
{ |
- // we expect a task canceled exception in case the canceled request is less or equal total |
- // number of retries |
// We expect a task canceled exception in case the canceled request is less or equal total |
// number of retries. |
Assert.False(cancelRequestNum > service.HttpClient.MessageHandler.NumTries); |
} |
else |
{ |
- // exception should be thrown as a result of casting to MockResponse object |
// Canceled exception wasn't thrown, in that case the cancel request number is bigger than |
// the actual number of tries. |
Assert.True(cancelRequestNum > service.HttpClient.MessageHandler.NumTries); |
} |
} |
@@ -415,6 418,7 @@ |
} |
} |
/// <summary>Tests the execute method in case the service was disposed.</summary> |
[Test] |
public void Execute_DisposeService() |
{ |
@@ -435,20 439,24 @@ |
Assert.Throws<ObjectDisposedException>(() => request.Execute()); |
} |
- /// <summary> A subtest for testing GZip and sync-async calls. </summary> |
/// <summary>A subtest for testing GZip and sync-async calls.</summary> |
/// <param name="gzip">Defines if GZip is enabled</param> |
/// <param name="async">Defines which method is going to be called (Execute or ExecuteAsync)</param> |
private void SubtestExecute_GZip(bool gzip, bool async) |
{ |
- var handler = new TestBodyMessageHnalder() |
- { |
- GZipEnabled = gzip, |
- ResponseObject = new MockResponse { Id = 100, Name = "sample name" }, |
- ExpectedRequestObject = new MockRequest { Name = "long long name" } |
- }; |
var handler = new TestBodyMessageHandler() |
{ |
GZipEnabled = gzip, |
ResponseObject = new MockResponse { Id = 100, Name = "sample name" }, |
ExpectedRequestObject = new MockRequest { Name = "long long name" } |
}; |
var initializer = new BaseClientService.Initializer() |
- { |
- GZipEnabled = gzip, |
- HttpClientFactory = new MockHttpClientFactory(handler) |
- }; |
{ |
GZipEnabled = gzip, |
HttpClientFactory = new MockHttpClientFactory(handler) |
}; |
using (var service = new MockClientService(initializer)) |
{ |
handler.Serializer = service.Serializer; |
@@ -467,61 475,63 @@ |
Assert.AreEqual(Thread.CurrentThread.ManagedThreadId, handler.ThreadId); |
} |
- // NOTICE: even if GZipEnabled is true, we don't need to extract the real string from the GZip stream, |
// Note: Even if GZipEnabled is true, we don't need to extract the real string from the GZip stream, |
// because in a real request we use HttpClientHandler which its AutomaticDecompression is set to |
// System.Net.DecompressionMethods.GZip. |
Assert.That(handler.Calls, Is.EqualTo(1)); |
- // the returned response should contain ETag, check that the service add the right ETag property on |
- // the response |
// The returned response should contain ETag, check that the service adds the right ETag property on |
// the response. |
handler.ResponseObject.ETag = handler.ResponseETag; |
Assert.That(response, Is.EqualTo(handler.ResponseObject)); |
} |
} |
- /// <summary> Tests execute when GZip is enabled. </summary> |
/// <summary>Tests execute when GZip is enabled.</summary> |
[Test] |
public void Execute_GZipEnabled() |
{ |
SubtestExecute_GZip(true, false); |
} |
- /// <summary> Tests execute when GZip is disabled. </summary> |
/// <summary>Tests execute when GZip is disabled.</summary> |
[Test] |
public void Execute_GZipDisabled() |
{ |
SubtestExecute_GZip(false, false); |
} |
- /// <summary> Tests async execute when GZip is enabled. </summary> |
/// <summary>Tests async execute when GZip is enabled.</summary> |
[Test] |
public void ExecuteAsync_GZipEnabled() |
{ |
SubtestExecute_GZip(true, true); |
} |
- /// <summary> Tests async execute when GZip is disabled. </summary> |
/// <summary>Tests async execute when GZip is disabled.</summary> |
[Test] |
public void ExecuteAsync_GZipDisabled() |
{ |
SubtestExecute_GZip(false, true); |
} |
- /// <summary> Tests execute with unicode characters. </summary> |
/// <summary>Tests execute with unicode characters.</summary> |
[Test] |
public void Execute_UnicodeCharacters() |
{ |
- var handler = new TestBodyMessageHnalder() |
- { |
- GZipEnabled = false, |
- ResponseObject = new MockResponse { Id = 100, Name = @"مرحبا العالم" }, |
- ExpectedRequestObject = new MockRequest { Name = @"مرحبا العالم! 您好,世界!" } |
- }; |
var handler = new TestBodyMessageHandler() |
{ |
GZipEnabled = false, |
ResponseObject = new MockResponse { Id = 100, Name = @"مرحبا العالم" }, |
ExpectedRequestObject = new MockRequest { Name = @"مرحبا العالم! 您好,世界!" } |
}; |
var initializer = new BaseClientService.Initializer() |
- { |
- GZipEnabled = false, |
- HttpClientFactory = new MockHttpClientFactory(handler) |
- }; |
{ |
GZipEnabled = false, |
HttpClientFactory = new MockHttpClientFactory(handler) |
}; |
using (var service = new MockClientService(initializer)) |
{ |
handler.Serializer = service.Serializer; |
@@ -529,17 539,17 @@ |
var request = new TestClientServiceRequest(service, "GET", handler.ExpectedRequestObject); |
var response = request.Execute(); |
Assert.That(handler.Calls, Is.EqualTo(1)); |
- // the returned response should contain ETag, check that the service add the right ETag property on |
- // the response |
// The returned response should contain ETag, check that the service add the right ETag property on |
// the response. |
handler.ResponseObject.ETag = handler.ResponseETag; |
Assert.That(response, Is.EqualTo(handler.ResponseObject)); |
} |
} |
- /// <summary> |
- /// A subtest for testing execute when an exception is thrown during sending the request, with or without |
- /// back-off. If back-off handler is attached to the service's message handler, there are going to be 3 tries |
- /// (3 is the default value of <seealso cref="ConfigurableMessageHandler.NumTries" />) before the operation |
/// <summary> |
/// A subtest for testing Execute when an exception is thrown while sending the request. This is tested with |
/// and without back-off. If back-off handler is attached to the service's message handler, there should be 3 |
/// tries (the default value of <seealso cref="ConfigurableMessageHandler.NumTries"/>) before the operation |
/// fails. |
/// </summary> |
/// <param name="backOff">Indicates if back-off handler is attached to the service.</param> |
@@ -547,14 557,13 @@ |
{ |
var handler = new MockMessageHandler(true); |
var initializer = new BaseClientService.Initializer() |
- { |
- HttpClientFactory = new MockHttpClientFactory(handler) |
- }; |
{ |
HttpClientFactory = new MockHttpClientFactory(handler) |
}; |
- // sets the default exponential back-off policy by the input |
// Set the default exponential back-off policy by the input. |
initializer.DefaultExponentialBackOffPolicy = backOff ? |
- BaseClientService.ExponentialBackOffPolicy.Exception : |
- BaseClientService.ExponentialBackOffPolicy.None; |
ExponentialBackOffPolicy.Exception : ExponentialBackOffPolicy.None; |
using (var service = new MockClientService(initializer)) |
{ |
@@ -566,7 575,7 @@ |
} |
} |
- /// <summary> |
/// <summary> |
/// Tests execute when an exception is thrown during a request and exponential back-off is enabled. |
/// </summary> |
[Test] |
@@ -575,7 584,7 @@ |
SubtestExecute_ThrowException(true); |
} |
- /// <summary> |
/// <summary> |
/// Tests execute when an exception is thrown during a request and exponential back-off is disabled. |
/// </summary> |
[Test] |
@@ -584,10 593,10 @@ |
SubtestExecute_ThrowException(false); |
} |
- /// <summary> |
- /// A subtest for testing async execute when an exception is thrown during sending the request, with or without |
- /// back-off handler. If back-off handler is attached to the service's message handler, there are going to be 3 |
- /// tries (3 is the default value of <seealso cref="ConfigurableMessageHandler.NumTries" />) before the |
/// <summary> |
/// A subtest for testing ExecuteAsync when an exception is thrown while sending the request. This is tested |
/// with and without back-off. If back-off handler is attached to the service's message handler, there should |
/// be 3 tries (the default value of <seealso cref="ConfigurableMessageHandler.NumTries"/>) before the |
/// operation fails. |
/// </summary> |
/// <param name="backOff">Indicates if back-off handler is attached to the service.</param> |
@@ -599,10 608,9 @@ |
HttpClientFactory = new MockHttpClientFactory(handler) |
}; |
- // configure the back-off behavior by the input |
// Configure the back-off behavior by the input. |
initializer.DefaultExponentialBackOffPolicy = backOff ? |
- BaseClientService.ExponentialBackOffPolicy.Exception : |
- BaseClientService.ExponentialBackOffPolicy.None; |
ExponentialBackOffPolicy.Exception : ExponentialBackOffPolicy.None; |
using (var service = new MockClientService(initializer)) |
{ |
@@ -623,7 631,7 @@ |
} |
} |
- /// <summary> |
/// <summary> |
/// Tests async execute when an exception is thrown during a request and exponential back-off is enabled. |
/// </summary> |
[Test] |
@@ -632,7 640,7 @@ |
SubtestExecuteAsync_ThrowException(true); |
} |
- /// <summary> |
/// <summary> |
/// Tests async execute when an exception is thrown during a request and exponential back-off is disabled. |
/// </summary> |
[Test] |
@@ -641,15 649,16 @@ |
SubtestExecuteAsync_ThrowException(false); |
} |
- /// <summary> Tests execute when server returned an error. </summary> |
/// <summary>Tests execute when server returned an error.</summary> |
[Test] |
public void Execute_Error() |
{ |
var handler = new ErrorMessageHanlder(); |
var initializer = new BaseClientService.Initializer() |
- { |
- HttpClientFactory = new MockHttpClientFactory(handler) |
- }; |
{ |
HttpClientFactory = new MockHttpClientFactory(handler) |
}; |
using (var service = new MockClientService(initializer)) |
{ |
var request = new TestClientServiceRequest(service, "GET", null); |
@@ -666,15 675,16 @@ |
} |
} |
- /// <summary> Tests execute when server returned an error. </summary> |
/// <summary>Tests execute when server returned an error.</summary> |
[Test] |
public void ExecuteAsync_Error() |
{ |
var handler = new ErrorMessageHanlder(); |
var initializer = new BaseClientService.Initializer |
- { |
- HttpClientFactory = new MockHttpClientFactory(handler) |
- }; |
{ |
HttpClientFactory = new MockHttpClientFactory(handler) |
}; |
using (var service = new MockClientService(initializer)) |
{ |
var request = new TestClientServiceRequest(service, "GET", null); |
@@ -698,17 708,17 @@ |
} |
} |
- /// <summary> Tests async execution of multiple request simultaneously. </summary> |
/// <summary>Tests async execution of multiple request simultaneously.</summary> |
[Test] |
public void ExecuteAsync_Simultaneously() |
{ |
var tasks = new List<Task<MockResponse>>(); |
var handler = new ConcurrentCallsHandler(); |
var initializer = new BaseClientService.Initializer() |
- { |
- HttpClientFactory = new MockHttpClientFactory(handler), |
- HttpClientInitializer = new ConcurrentCallsHandler.Initializer() |
- }; |
{ |
HttpClientFactory = new MockHttpClientFactory(handler), |
HttpClientInitializer = new ConcurrentCallsHandler.Initializer() |
}; |
using (var service = new MockClientService(initializer)) |
{ |
@@ -746,20 756,22 @@ |
#region ExecuteStream (and ExecuteAsStreamAsync) |
- /// <summary> A subtest for testing execute as stream (async and sync). </summary> |
/// <summary>A subtest for testing execute as stream (async and sync).</summary> |
private void SubtestExecuteAsStream(bool async) |
{ |
- var handler = new TestBodyMessageHnalder |
- { |
- GZipEnabled = false, |
- ResponseObject = new MockResponse { Id = 100, Name = "sample name" }, |
- ExpectedRequestObject = new MockRequest { Name = "long long name" } |
- }; |
var handler = new TestBodyMessageHandler |
{ |
GZipEnabled = false, |
ResponseObject = new MockResponse { Id = 100, Name = "sample name" }, |
ExpectedRequestObject = new MockRequest { Name = "long long name" } |
}; |
var initializer = new BaseClientService.Initializer |
- { |
- GZipEnabled = false, |
- HttpClientFactory = new MockHttpClientFactory(handler) |
- }; |
{ |
GZipEnabled = false, |
HttpClientFactory = new MockHttpClientFactory(handler) |
}; |
using (var service = new MockClientService(initializer)) |
{ |
handler.Serializer = service.Serializer; |
@@ -782,7 794,7 @@ |
Assert.AreEqual(Thread.CurrentThread.ManagedThreadId, handler.ThreadId); |
} |
- // read the object |
// Read the object. |
var str = ExtractStringFromStream(stream); |
response = service.Serializer.Deserialize<MockResponse>(str); |
@@ -791,14 803,14 @@ |
} |
} |
- /// <summary> Tests execute stream. </summary> |
/// <summary>Tests execute stream.</summary> |
[Test] |
public void ExecuteAsStream() |
{ |
SubtestExecuteAsStream(false); |
} |
- /// <summary> Tests execute stream (async). </summary> |
/// <summary>Tests execute stream (async).</summary> |
[Test] |
public void ExecuteAsStreamAsync() |
{ |
@@ -811,7 823,7 @@ |
#region Query Parameters |
- /// <summary> Client request which contains query parameters. </summary> |
/// <summary>Client request which contains query parameters.</summary> |
class ClientServiceRequestWithQueryParameters : TestClientServiceRequest |
{ |
[RequestParameterAttribute("required", Google.Apis.Util.RequestParameterType.Query)] |
@@ -836,50 848,50 @@ |
: base(service, method, body) |
{ |
RequestParameters.Add("required", new Parameter |
- { |
- Name = "required", |
- IsRequired = true, |
- ParameterType = "query" |
- }); |
{ |
Name = "required", |
IsRequired = true, |
ParameterType = "query" |
}); |
RequestParameters.Add("optionalWithValue", new Parameter |
- { |
- Name = "optionalWithValue", |
- IsRequired = false, |
- ParameterType = "query", |
- DefaultValue = "DoesNotDisplay" |
- }); |
{ |
Name = "optionalWithValue", |
IsRequired = false, |
ParameterType = "query", |
DefaultValue = "DoesNotDisplay" |
}); |
RequestParameters.Add("optionalWithValue2", new Parameter |
- { |
- Name = "optionalWithValue", |
- IsRequired = false, |
- ParameterType = "query", |
- DefaultValue = "DoesNotDisplay" |
- }); |
{ |
Name = "optionalWithValue", |
IsRequired = false, |
ParameterType = "query", |
DefaultValue = "DoesNotDisplay" |
}); |
RequestParameters.Add("optionalWithNull", new Parameter |
- { |
- Name = "optionalWithNull", |
- IsRequired = false, |
- ParameterType = "query", |
- DefaultValue = "c" |
- }); |
{ |
Name = "optionalWithNull", |
IsRequired = false, |
ParameterType = "query", |
DefaultValue = "c" |
}); |
RequestParameters.Add("optionalEmpty", new Parameter |
- { |
- Name = "optionalEmpty", |
- IsRequired = false, |
- ParameterType = "query", |
- DefaultValue = "d" |
- }); |
{ |
Name = "optionalEmpty", |
IsRequired = false, |
ParameterType = "query", |
DefaultValue = "d" |
}); |
RequestParameters.Add("optionalNotPressent", new Parameter |
- { |
- Name = "optionalNotPressent", |
- IsRequired = false, |
- ParameterType = "query", |
- DefaultValue = "DoesNotDisplay" |
- }); |
{ |
Name = "optionalNotPressent", |
IsRequired = false, |
ParameterType = "query", |
DefaultValue = "DoesNotDisplay" |
}); |
} |
} |
- /// <summary> Tests build request with query parameters. </summary> |
/// <summary>Tests build request with query parameters.</summary> |
[Test] |
public void CreateRequest_QueryParameters() |
{ |
@@ -897,7 909,7 @@ |
} |
} |
- /// <summary> Tests build request with missing required query parameter. </summary> |
/// <summary>Tests build request with missing required query parameter.</summary> |
[Test] |
public void CreateRequest_QueryParameterIsMissing() |
{ |
@@ -922,7 934,7 @@ |
#region Path Parameters |
- /// <summary> Client request which contains path parameters. </summary> |
/// <summary>Client request which contains path parameters.</summary> |
class ClientServiceRequestWithPathParameters : TestClientServiceRequest |
{ |
[RequestParameter("path1", RequestParameterType.Path)] |
@@ -954,7 966,7 @@ |
} |
} |
- /// <summary> Tests build request with path parameters. </summary> |
/// <summary>Tests build request with path parameters.</summary> |
[Test] |
public void CreateRequest_PathParameters() |
{ |
@@ -977,14 989,15 @@ |
private const string SimpleDeveloperKey = "ABC123"; |
private const string ComplexDeveloperKey = "?&^% ABC123"; |
- /// <summary> Tests build request with simple developer key. </summary> |
/// <summary>Tests build request with simple developer key.</summary> |
[Test] |
public void CreateRequest_DeveloperKey() |
{ |
var initializer = new BaseClientService.Initializer |
- { |
- ApiKey = SimpleDeveloperKey |
- }; |
{ |
ApiKey = SimpleDeveloperKey |
}; |
using (var service = new MockClientService(initializer, "https://build_request_params")) |
{ |
var request = new TestClientServiceRequest(service, "GET", null); |
@@ -994,14 1007,15 @@ |
} |
} |
- /// <summary> Tests build request with complex developer key. </summary> |
/// <summary>Tests build request with complex developer key.</summary> |
[Test] |
public void CreateRequest_DeveloperKey_RequiresEscape() |
{ |
var initializer = new BaseClientService.Initializer |
- { |
- ApiKey = ComplexDeveloperKey |
- }; |
{ |
ApiKey = ComplexDeveloperKey |
}; |
using (var service = new MockClientService(initializer, "https://build_request_params")) |
{ |
var request = new TestClientServiceRequest(service, "GET", null); |
@@ -1017,7 1031,7 @@ |
#region Supported Methods |
- /// <summary> Tests if invalid method throws an exception. </summary> |
/// <summary>Tests if invalid method throws an exception.</summary> |
[Test] |
public void CreateRequest_UnsupportedMethods() |
{ |
@@ -1028,7 1042,7 @@ |
} |
} |
- /// <summary> Tests that valid method doesn't throw an exception. </summary> |
/// <summary>Tests that valid method doesn't throw an exception.</summary> |
[Test] |
public void CreateRequest_SupportedMethods() |
{ |
@@ -1052,20 1066,20 @@ |
#region ETag |
- /// <summary> Tests the create request method with different ETags. </summary> |
/// <summary>Tests the create request method with different ETags.</summary> |
[Test] |
public void CreateRequest_ETag() |
{ |
var body = new MockRequest { Name = "long long name" }; |
using (var service = new MockClientService()) |
{ |
- // no ETag (ETag = null) |
// No ETag (ETag = null). |
var request = new TestClientServiceRequest(service, HttpConsts.Get, body); |
var httpRequest = request.CreateRequest(); |
Assert.That(httpRequest.Headers.IfMatch.Count, Is.EqualTo(0)); |
Assert.That(httpRequest.Headers.IfNoneMatch.Count, Is.EqualTo(0)); |
- // ETag has a value, but ETag action is ignored |
// ETag has a value, but ETag action is ignored. |
body.ETag = "\"ETAG_HERE\""; |
request = new TestClientServiceRequest(service, HttpConsts.Get, body); |
request.ETagAction = ETagAction.Ignore; |
@@ -1073,21 1087,21 @@ |
Assert.That(httpRequest.Headers.IfMatch.Count, Is.EqualTo(0)); |
Assert.That(httpRequest.Headers.IfNoneMatch.Count, Is.EqualTo(0)); |
- // ETag has a value, so use default action (Get -> If-None-Match) |
// ETag has a value, so use default action (Get -> If-None-Match). |
request = new TestClientServiceRequest(service, HttpConsts.Get, body); |
httpRequest = request.CreateRequest(); |
Assert.That(httpRequest.Headers.IfMatch.Count, Is.EqualTo(0)); |
Assert.That(httpRequest.Headers.IfNoneMatch.Count, Is.EqualTo(1)); |
Assert.That(httpRequest.Headers.IfNoneMatch.First(), Is.EqualTo(new EntityTagHeaderValue(body.ETag))); |
- // ETag has a value, so use default action (Post -> If-Match) |
// ETag has a value, so use default action (Post -> If-Match). |
request = new TestClientServiceRequest(service, HttpConsts.Post, body); |
httpRequest = request.CreateRequest(); |
Assert.That(httpRequest.Headers.IfNoneMatch.Count, Is.EqualTo(0)); |
Assert.That(httpRequest.Headers.IfMatch.Count, Is.EqualTo(1)); |
Assert.That(httpRequest.Headers.IfMatch.First(), Is.EqualTo(new EntityTagHeaderValue(body.ETag))); |
- // ETag has a value, default is override, use the specified ETag action |
// ETag has a value, default is override, use the specified ETag action. |
request = new TestClientServiceRequest(service, HttpConsts.Post, body); |
request.ETagAction = ETagAction.IfNoneMatch; |
httpRequest = request.CreateRequest(); |
@@ -1095,7 1109,7 @@ |
Assert.That(httpRequest.Headers.IfNoneMatch.Count, Is.EqualTo(1)); |
Assert.That(httpRequest.Headers.IfNoneMatch.First(), Is.EqualTo(new EntityTagHeaderValue(body.ETag))); |
- // ETag has a value, default is override, use the specified ETag action |
// ETag has a value, default is override, use the specified ETag action. |
request = new TestClientServiceRequest(service, HttpConsts.Get, body); |
request.ETagAction = ETagAction.IfMatch; |
httpRequest = request.CreateRequest(); |
@@ -1105,7 1119,7 @@ |
} |
} |
- /// <summary> Tests that get default ETag action works as expected. </summary> |
/// <summary>Tests that get default ETag action works as expected.</summary> |
[Test] |
public void GetDefaultETagActionTest() |
{ |