/// <summary> /// Initializes a new instance of the <see cref="RestHttpClientMock"/> class. /// </summary> /// <param name="httpClient">The HttpClient from http client factory.</param> /// <param name="loggerFactory">The logger factory.</param> /// <param name="configuration">The configuration.</param> /// <param name="httpContextAccessor">The HTTP context accessor.</param> public RestHttpClientMock(HttpClient httpClient, ILoggerFactory loggerFactory, RestHttpClientOptions configuration, IHttpContextAccessor httpContextAccessor) : base(httpClient, loggerFactory, configuration, httpContextAccessor) { }
/// <summary> /// Initializes a new instance of the <see cref="RestHttpClientFromOptionsMock`1"/> class. /// </summary> /// <param name="optionsAccessor">The options.</param> /// <param name="httpClient">The HttpClient from http client factory.</param> /// <param name="loggerFactory">The logger factory.</param> /// <param name="configuration">The configuration.</param> /// <param name="httpContextAccessor">The HTTP context accessor.</param> /// <param name="baseUri">The base Uri of all requests. For example: http://rsm.api.monq.cloud</param> public RestHttpClientFromOptionsMock(IOptions <ServiceOptions> optionsAccessor, HttpClient httpClient, ILoggerFactory loggerFactory, RestHttpClientOptions configuration, IHttpContextAccessor httpContextAccessor, string baseUri) : base(optionsAccessor, httpClient, loggerFactory, configuration, httpContextAccessor, baseUri) { }
public async Task ShouldProperlyMakeGetRequestByAbsoluteUriWithForwardedHeaders() { var modelJson = JsonConvert.SerializeObject(new Service[] { new Service { Id = 1, Name = "Service1" }, new Service { Id = 2, Name = "Service2" } }); var traceEventId = Guid.NewGuid().ToString(); const string userspaceId = "10"; const string uri = "http://unittest/api/services"; var httpContext = new DefaultHttpContext(); httpContext.Request.Headers.Add(TraceEventIdHeader, traceEventId); httpContext.Request.Headers.Add(UserspaceIdHeader, userspaceId); var headerOptions = new RestHttpClientHeaderOptions(); headerOptions.AddForwardedHeader(TraceEventIdHeader); headerOptions.AddForwardedHeader(UserspaceIdHeader); var conf = new RestHttpClientOptions(); conf.ConfigHeaders(headerOptions); var client = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson)); var restHttpClient = CreateRestHttpClient(client, httpContext, conf); var response = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10)); Assert.True(client.DefaultRequestHeaders.Contains(TraceEventIdHeader)); Assert.True(client.DefaultRequestHeaders.Contains(UserspaceIdHeader)); Assert.Equal(traceEventId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == TraceEventIdHeader).Value.FirstOrDefault()); Assert.Equal(userspaceId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == UserspaceIdHeader).Value.FirstOrDefault()); var services = response.ResultObject?.ToList(); Assert.NotNull(services); Assert.Equal(2, services !.Count); Assert.Equal(1, services[0].Id); Assert.Equal("Service1", services[0].Name); Assert.Equal(2, services[1].Id); Assert.Equal("Service2", services[1].Name); var _logger = _loggers.First(); Assert.Equal(2, _logger.LoggingEvents.Count); Assert.Equal($"Start downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}].", _logger.LoggingEvents[0]); Assert.Contains($"Downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}] finished with StatusCode {(int)HttpStatusCode.OK} at", _logger.LoggingEvents[1]); }
/// <summary> /// Инициализирует новый экземпляр класса <see cref="TestService" />. /// </summary> /// <param name="optionsAccessor">The options.</param> /// <param name="loggerFactory">The logger factory.</param> /// <param name="configuration">The configuration.</param> /// <param name="httpContextAccessor">The HTTP context accessor.</param> /// <param name="httpMessageInvoker">The HTTP message invoker.</param> /// <exception cref="System.ArgumentNullException">baseUri - Не указан базовый Uri сервиса.</exception> public TestService( IOptions <ServiceUriOptions> optionsAccessor, HttpClient httpClient, ILoggerFactory loggerFactory, RestHttpClientOptions configuration, IHttpContextAccessor httpContextAccessor) : base(optionsAccessor, httpClient, loggerFactory, configuration, httpContextAccessor, optionsAccessor.Value.TestServiceUri) { }
public async Task ShouldProperlyReuseHttpClientObjectInParallelWithHeaders() { var modelJson = JsonConvert.SerializeObject(new Service[] { new Service { Id = 1, Name = "Service1" }, new Service { Id = 2, Name = "Service2" } }); const string uri = "http://unittest/api/services"; var headerOptions = new RestHttpClientHeaderOptions(); headerOptions.AddForwardedHeader(TraceEventIdHeader); headerOptions.AddForwardedHeader(UserspaceIdHeader); var conf = new RestHttpClientOptions(); conf.ConfigHeaders(headerOptions); var httpContext = new DefaultHttpContext(); httpContext.Request.Headers.Add(TraceEventIdHeader, "eventId"); httpContext.Request.Headers.Add(UserspaceIdHeader, "12"); const int totalRequests = 1000; var client = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson)); var restHttpClient = CreateRestHttpClient(client, httpContext, conf); var firstResult = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10)); Assert.Equal(2, firstResult.ResultObject?.Count()); var results = Enumerable.Range(0, totalRequests).AsParallel().AsOrdered().WithDegreeOfParallelism(10) .Select(_ => restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10)).GetAwaiter().GetResult()) .AsSequential() .ToList(); Assert.Empty(results.Where(x => x.OriginalResponse?.RequestMessage?.Headers.Count() != 2)); Assert.Equal(2 * totalRequests, results.Where(x => x.ResultObject is not null).SelectMany(x => x.ResultObject).Count()); }