diff --git a/AsbCloudWebApi.IntegrationTests/Middlware/UserConnectionsLimitMiddlwareTest.cs b/AsbCloudWebApi.IntegrationTests/Middlware/UserConnectionsLimitMiddlwareTest.cs index b21f4cce..1bb5731d 100644 --- a/AsbCloudWebApi.IntegrationTests/Middlware/UserConnectionsLimitMiddlwareTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Middlware/UserConnectionsLimitMiddlwareTest.cs @@ -3,6 +3,7 @@ using AsbCloudApp.Data.SAUB; using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Xunit; @@ -78,7 +79,7 @@ namespace AsbCloudWebApi.IntegrationTests.Middlware webBuilder.UseStartup(); webBuilder.ConfigureServices(serviceCollection => { - serviceCollection.ReplaceService(new TelemetryDataSaubService()); + object value = ReplaceService(serviceCollection, new TelemetryDataSaubService()); }); }) .Build(); @@ -143,6 +144,17 @@ namespace AsbCloudWebApi.IntegrationTests.Middlware httpClient.DefaultRequestHeaders.Authorization = new("Bearer", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiZGV2IiwiaWRDb21wYW55IjoiMSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6InJvb3QiLCJuYmYiOjE2NjY1ODY2MjAsImV4cCI6MTY5ODE0NDIyMCwiaXNzIjoiYSIsImF1ZCI6ImEifQ.zqBdR4nYB87-Xyzv025waasN47i43c9FJ23RfzIvUsM"); return httpClient; } + + private static IServiceCollection ReplaceService(this IServiceCollection services, T instance) + where T : notnull + { + var typeofT = typeof(T); + var originalDecriptor = services.Last(s => s.ServiceType == typeofT); + var newDecriptor = new ServiceDescriptor(typeofT, instance); + services.Remove(originalDecriptor); + services.Add(newDecriptor); + return services; + } } } diff --git a/AsbCloudWebApi.Tests/Middlware/UserConnectionsLimitMiddlwareTest.cs b/AsbCloudWebApi.Tests/Middlware/UserConnectionsLimitMiddlwareTest.cs deleted file mode 100644 index ee85b6aa..00000000 --- a/AsbCloudWebApi.Tests/Middlware/UserConnectionsLimitMiddlwareTest.cs +++ /dev/null @@ -1,156 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.SAUB; -using AsbCloudApp.Requests; -using AsbCloudApp.Services; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using Xunit; - -namespace AsbCloudWebApi.Tests.Middlware -{ - //TODO: переписать как интеграционный тест. Использовать WebApplicationFactory. - public class UserConnectionsLimitMiddlwareTest - { - const int iterations2Block = 8; - - private readonly (int, DateTime, DateTime)[] wells = new[] - { - (191, new DateTime(2022, 09, 01, 21, 43, 00, DateTimeKind.Utc), new DateTime(2022, 09, 04, 07, 37, 31, DateTimeKind.Utc)), - (3 , new DateTime(2021, 09, 16, 06, 13, 33, DateTimeKind.Utc), new DateTime(2021, 09, 20, 00, 29, 28, DateTimeKind.Utc)), - (199, new DateTime(2022, 09, 15, 11, 27, 18, DateTimeKind.Utc), new DateTime(2022, 09, 20, 14, 00, 23, DateTimeKind.Utc)), - (6 , new DateTime(2021, 09, 20, 00, 35, 03, DateTimeKind.Utc), new DateTime(2021, 09, 25, 06, 46, 17, DateTimeKind.Utc)), - (41 , new DateTime(2021, 12, 10, 00, 59, 52, DateTimeKind.Utc), new DateTime(2022, 10, 31, 15, 29, 24, DateTimeKind.Utc)), - (100, new DateTime(2022, 04, 24, 03, 04, 05, DateTimeKind.Utc), new DateTime(2022, 04, 29, 11, 38, 36, DateTimeKind.Utc)), - (154, new DateTime(2022, 03, 28, 10, 09, 14, DateTimeKind.Utc), new DateTime(2022, 06, 14, 15, 01, 12, DateTimeKind.Utc)), - (5 , new DateTime(2021, 09, 25, 08, 09, 37, DateTimeKind.Utc), new DateTime(2021, 10, 01, 14, 39, 51, DateTimeKind.Utc)), - (1 , new DateTime(2021, 09, 10, 01, 32, 42, DateTimeKind.Utc), new DateTime(2021, 09, 18, 00, 35, 22, DateTimeKind.Utc)), - (112, new DateTime(2022, 04, 20, 16, 47, 51, DateTimeKind.Utc), new DateTime(2022, 04, 28, 15, 04, 33, DateTimeKind.Utc)), - }; - - public class TelemetryDataSaubService : ITelemetryDataSaubService - { - public async Task> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default) - { - await Task.Delay(1000, token); - return Enumerable.Empty(); - } - - public Task> GetAsync(int idWell, TelemetryDataRequest request, CancellationToken token) - { - throw new NotImplementedException(); - } - - public DatesRangeDto? GetRange(int idWell, DateTimeOffset start, DateTimeOffset end) - { - throw new NotImplementedException(); - } - - public DatesRangeDto? GetRange(int idWell) - { - throw new NotImplementedException(); - } - - public Task GetRangeAsync(int idWell, DateTimeOffset start, DateTimeOffset end, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task GetRangeAsync(int idWell, DateTimeOffset geDate, DateTimeOffset? leDate, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task> GetTelemetryDataStatAsync(int idTelemetry, CancellationToken token) => throw new NotImplementedException(); - - public Task GetZippedCsv(int idWell, DateTime beginDate, DateTime endDate, CancellationToken token) - { - throw new NotImplementedException(); - } - - public Task UpdateDataAsync(string uid, IEnumerable dtos, CancellationToken token) => throw new NotImplementedException(); - } - - public UserConnectionsLimitMiddlwareTest() - { - var host = Host.CreateDefaultBuilder(Array.Empty()) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - webBuilder.ConfigureServices(serviceCollection => { - serviceCollection.ReplaceService(new TelemetryDataSaubService()); - }); - }) - .Build(); - host.Start(); - } - - [Fact] - public async Task Send_n_requests_and_get_blocked() - { - var i = 0; - for (; i < iterations2Block; i++) - _ = Task.Run(async () => - { - var well = wells[i]; - var url = MakeUrl(well.Item1, well.Item2, well.Item3); - var response = await MakeHttpClient().GetAsync(url); - await Task.Delay(1000); - }); - - var well = wells[i]; - var url = MakeUrl(well.Item1, well.Item2, well.Item3); - var response = await MakeHttpClient().GetAsync(url); - Assert.Equal(System.Net.HttpStatusCode.TooManyRequests, response.StatusCode); - } - - - [Fact] - public async Task Send_n_requests_and_get_blocked_then_restored() - { - var i = 0; - var tasks = new Task[iterations2Block]; - for (; i < iterations2Block; i++) - tasks[i] = Task.Run(async () => - { - var well = wells[i]; - var url = MakeUrl(well.Item1, well.Item2, well.Item3); - var response = await MakeHttpClient().GetAsync(url); - await Task.Delay(1000); - }); - - var well = wells[i]; - var url = MakeUrl(well.Item1, well.Item2, well.Item3); - var response = await MakeHttpClient().GetAsync(url); - Assert.Equal(System.Net.HttpStatusCode.TooManyRequests, response.StatusCode); - - Task.WaitAll(tasks); - response = await MakeHttpClient().GetAsync(url); - Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); - } - - private static string MakeUrl(int idWell, DateTime dateBegin, DateTime dateEnd) - { - var interval = (dateEnd - dateBegin).TotalSeconds; - var dateBeginString = dateBegin.ToString("yyyy-MM-ddZ"); - var url = $"http://127.0.0.1:5000/api/TelemetryDataSaub/{idWell}?begin={dateBeginString}&intervalSec={interval}&approxPointsCount={interval}"; - return url; - } - - private static HttpClient MakeHttpClient() - { - var httpClient = new HttpClient(); - httpClient.DefaultRequestHeaders.Authorization = new("Bearer", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiZGV2IiwiaWRDb21wYW55IjoiMSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6InJvb3QiLCJuYmYiOjE2NjY1ODY2MjAsImV4cCI6MTY5ODE0NDIyMCwiaXNzIjoiYSIsImF1ZCI6ImEifQ.zqBdR4nYB87-Xyzv025waasN47i43c9FJ23RfzIvUsM"); - return httpClient; - } - } - -}