Инжект новой фабрики клиентов вместо PersistenceClientFactory в интеграционных тестах
Some checks failed
Unit tests / test (push) Failing after 1m16s

This commit is contained in:
Olga Nemt 2024-12-27 13:35:18 +05:00
parent 4ec4ec17eb
commit 6873a32667
14 changed files with 399 additions and 387 deletions

View File

@ -6,7 +6,7 @@ namespace DD.Persistence.Client.Clients.Interfaces;
/// Клиент для работы с временными данными /// Клиент для работы с временными данными
/// </summary> /// </summary>
/// <typeparam name="TDto"></typeparam> /// <typeparam name="TDto"></typeparam>
public interface ITimeSeriesClient<TDto> : IDisposable where TDto : class, new() public interface ITimeSeriesClient<TDto> : IDisposable where TDto : class, ITimeSeriesAbstractDto
{ {
/// <summary> /// <summary>
/// Добавление записей /// Добавление записей

View File

@ -5,7 +5,7 @@ using Refit;
namespace DD.Persistence.Client.Clients.Interfaces.Refit namespace DD.Persistence.Client.Clients.Interfaces.Refit
{ {
public interface IRefitTechMessagesClient : IDisposable public interface IRefitTechMessagesClient : IRefitClient, IDisposable
{ {
private const string BaseRoute = "/api/techMessages"; private const string BaseRoute = "/api/techMessages";

View File

@ -2,8 +2,8 @@ using DD.Persistence.Models;
using Refit; using Refit;
namespace DD.Persistence.Client.Clients.Interfaces.Refit; namespace DD.Persistence.Client.Clients.Interfaces.Refit;
public interface IRefitTimeSeriesClient<TDto> : IDisposable public interface IRefitTimeSeriesClient<TDto> : IRefitClient, IDisposable
where TDto : class, new() where TDto : class, ITimeSeriesAbstractDto
{ {
private const string BaseRoute = "/api/dataSaub"; private const string BaseRoute = "/api/dataSaub";

View File

@ -3,7 +3,7 @@ using Refit;
namespace DD.Persistence.Client.Clients.Interfaces.Refit; namespace DD.Persistence.Client.Clients.Interfaces.Refit;
public interface IRefitTimestampedSetClient : IDisposable public interface IRefitTimestampedSetClient : IRefitClient, IDisposable
{ {
private const string baseUrl = "/api/TimestampedSet/{idDiscriminator}"; private const string baseUrl = "/api/TimestampedSet/{idDiscriminator}";

View File

@ -11,9 +11,9 @@ public class TechMessagesClient : BaseClient, ITechMessagesClient
{ {
private readonly IRefitTechMessagesClient refitTechMessagesClient; private readonly IRefitTechMessagesClient refitTechMessagesClient;
public TechMessagesClient(IRefitTechMessagesClient refitTechMessagesClient, ILogger<TechMessagesClient> logger) : base(logger) public TechMessagesClient(IRefitClientFactory<IRefitTechMessagesClient> refitTechMessagesClientFactory, ILogger<TechMessagesClient> logger) : base(logger)
{ {
this.refitTechMessagesClient = refitTechMessagesClient; this.refitTechMessagesClient = refitTechMessagesClientFactory.Create();
} }
public async Task<PaginationContainer<TechMessageDto>> GetPage(PaginationRequest request, CancellationToken token) public async Task<PaginationContainer<TechMessageDto>> GetPage(PaginationRequest request, CancellationToken token)

View File

@ -5,13 +5,13 @@ using DD.Persistence.Client.Clients.Interfaces.Refit;
using DD.Persistence.Models; using DD.Persistence.Models;
namespace DD.Persistence.Client.Clients; namespace DD.Persistence.Client.Clients;
public class TimeSeriesClient<TDto> : BaseClient, ITimeSeriesClient<TDto> where TDto : class, new() public class TimeSeriesClient<TDto> : BaseClient, ITimeSeriesClient<TDto> where TDto : class, ITimeSeriesAbstractDto
{ {
private readonly IRefitTimeSeriesClient<TDto> timeSeriesClient; private readonly IRefitTimeSeriesClient<TDto> timeSeriesClient;
public TimeSeriesClient(IRefitTimeSeriesClient<TDto> refitTechMessagesClient, ILogger<TimeSeriesClient<TDto>> logger) : base(logger) public TimeSeriesClient(IRefitClientFactory<IRefitTimeSeriesClient<TDto>> refitTechMessagesClientFactory, ILogger<TimeSeriesClient<TDto>> logger) : base(logger)
{ {
this.timeSeriesClient = refitTechMessagesClient; this.timeSeriesClient = refitTechMessagesClientFactory.Create();
} }
public async Task<int> AddRange(IEnumerable<TDto> dtos, CancellationToken token) public async Task<int> AddRange(IEnumerable<TDto> dtos, CancellationToken token)

View File

@ -9,9 +9,9 @@ public class TimestampedSetClient : BaseClient, ITimestampedSetClient
{ {
private readonly IRefitTimestampedSetClient refitTimestampedSetClient; private readonly IRefitTimestampedSetClient refitTimestampedSetClient;
public TimestampedSetClient(IRefitTimestampedSetClient refitTimestampedSetClient, ILogger<TimestampedSetClient> logger) : base(logger) public TimestampedSetClient(IRefitClientFactory<IRefitTimestampedSetClient> refitTimestampedSetClientFactory, ILogger<TimestampedSetClient> logger) : base(logger)
{ {
this.refitTimestampedSetClient = refitTimestampedSetClient; this.refitTimestampedSetClient = refitTimestampedSetClientFactory.Create();
} }
public async Task<int> AddRange(Guid idDiscriminator, IEnumerable<TimestampedSetDto> sets, CancellationToken token) public async Task<int> AddRange(Guid idDiscriminator, IEnumerable<TimestampedSetDto> sets, CancellationToken token)

View File

@ -9,9 +9,9 @@ public class WitsDataClient : BaseClient, IWitsDataClient
{ {
private readonly IRefitWitsDataClient refitWitsDataClient; private readonly IRefitWitsDataClient refitWitsDataClient;
public WitsDataClient(IRefitWitsDataClient refitWitsDataClient, ILogger<WitsDataClient> logger) : base(logger) public WitsDataClient(IRefitClientFactory<IRefitWitsDataClient> refitWitsDataClientFactory, ILogger<WitsDataClient> logger) : base(logger)
{ {
this.refitWitsDataClient = refitWitsDataClient; this.refitWitsDataClient = refitWitsDataClientFactory.Create();
} }
public async Task<int> AddRange(IEnumerable<WitsDataDto> dtos, CancellationToken token) public async Task<int> AddRange(IEnumerable<WitsDataDto> dtos, CancellationToken token)

View File

@ -1,5 +1,6 @@
using DD.Persistence.Client.Clients; using DD.Persistence.Client.Clients;
using DD.Persistence.Client.Clients.Interfaces; using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Models;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace DD.Persistence.Client; namespace DD.Persistence.Client;
@ -16,14 +17,14 @@ public static class DependencyInjection
/// <returns></returns> /// <returns></returns>
public static IServiceCollection AddPersistenceClients(this IServiceCollection services) public static IServiceCollection AddPersistenceClients(this IServiceCollection services)
{ {
services.AddSingleton(typeof(IRefitClientFactory<>), typeof(RefitClientFactory<>)); services.AddTransient(typeof(IRefitClientFactory<>), typeof(RefitClientFactory<>));
services.AddTransient<IChangeLogClient, ChangeLogClient>(); services.AddTransient<IChangeLogClient, ChangeLogClient>();
services.AddTransient<IDataSourceSystemClient, DataSourceSystemClient>(); services.AddTransient<IDataSourceSystemClient, DataSourceSystemClient>();
services.AddTransient<ISetpointClient, SetpointClient>(); services.AddTransient<ISetpointClient, SetpointClient>();
//services.AddTransient<ITechMessagesClient, TechMessagesClient>(); services.AddTransient<ITechMessagesClient, TechMessagesClient>();
//services.AddTransient<ITimeSeriesClient<>, TimeSeriesClient<>>(); services.AddTransient<ITimeSeriesClient<DataSaubDto>, TimeSeriesClient<DataSaubDto>>();
//services.AddTransient<ITimeSeriesClient, TimeSeriesClient>(); services.AddTransient<ITimestampedSetClient, TimestampedSetClient>();
//services.AddTransient<IWitsDataClient, WitsDataClient>(); services.AddTransient<IWitsDataClient, WitsDataClient>();
return services; return services;
} }
} }

View File

@ -1,146 +1,146 @@
using Microsoft.Extensions.Configuration; //using Microsoft.Extensions.Configuration;
using DD.Persistence.Client.Clients.Interfaces; //using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Client.Clients; //using DD.Persistence.Client.Clients;
using DD.Persistence.Client.Helpers; //using DD.Persistence.Client.Helpers;
using Refit; //using Refit;
using DD.Persistence.Factories; //using DD.Persistence.Factories;
using DD.Persistence.Client.Clients.Interfaces.Refit; //using DD.Persistence.Client.Clients.Interfaces.Refit;
using Microsoft.Extensions.Logging; //using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection; //using Microsoft.Extensions.DependencyInjection;
using System.Text.Json; //using System.Text.Json;
namespace DD.Persistence.Client //namespace DD.Persistence.Client
{ //{
/// <summary> // /// <summary>
/// Фабрика клиентов для доступа к Persistence - сервису // /// Фабрика клиентов для доступа к Persistence - сервису
/// </summary> // /// </summary>
public class PersistenceClientFactory // public class PersistenceClientFactory
{ // {
private static readonly JsonSerializerOptions JsonSerializerOptions = new() // private static readonly JsonSerializerOptions JsonSerializerOptions = new()
{ // {
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
PropertyNameCaseInsensitive = true // PropertyNameCaseInsensitive = true
}; // };
private static readonly RefitSettings RefitSettings = new(new SystemTextJsonContentSerializer(JsonSerializerOptions)); // private static readonly RefitSettings RefitSettings = new(new SystemTextJsonContentSerializer(JsonSerializerOptions));
private readonly IServiceProvider provider; // private readonly IServiceProvider provider;
private HttpClient httpClient; // private HttpClient httpClient;
public PersistenceClientFactory(IHttpClientFactory httpClientFactory, IServiceProvider provider, IConfiguration configuration) // public PersistenceClientFactory(IHttpClientFactory httpClientFactory, IServiceProvider provider, IConfiguration configuration)
{ // {
this.provider = provider; // this.provider = provider;
httpClient = httpClientFactory.CreateClient(); // httpClient = httpClientFactory.CreateClient();
httpClient.Authorize(configuration); // httpClient.Authorize(configuration);
} // }
public PersistenceClientFactory(IHttpClientFactory httpClientFactory, IAuthTokenFactory authTokenFactory, IServiceProvider provider, IConfiguration configuration) // public PersistenceClientFactory(IHttpClientFactory httpClientFactory, IAuthTokenFactory authTokenFactory, IServiceProvider provider, IConfiguration configuration)
{ // {
this.provider = provider; // this.provider = provider;
httpClient = httpClientFactory.CreateClient(); // httpClient = httpClientFactory.CreateClient();
var token = authTokenFactory.GetToken(); // var token = authTokenFactory.GetToken();
httpClient.Authorize(token); // httpClient.Authorize(token);
} // }
/// <summary> // /// <summary>
/// Получить клиент для работы с уставками // /// Получить клиент для работы с уставками
/// </summary> // /// </summary>
/// <returns></returns> // /// <returns></returns>
//public ISetpointClient GetSetpointClient() // //public ISetpointClient GetSetpointClient()
//{ // //{
// var logger = provider.GetRequiredService<ILogger<SetpointClient>>(); // // var logger = provider.GetRequiredService<ILogger<SetpointClient>>();
// var restClient = RestService.For<IRefitSetpointClient>(httpClient, RefitSettings); // // var restClient = RestService.For<IRefitSetpointClient>(httpClient, RefitSettings);
// var client = new SetpointClient(restClient, logger); // // var client = new SetpointClient(restClient, logger);
// return client; // // return client;
//} // //}
/// <summary> // /// <summary>
/// Получить клиент для работы с технологическими сообщениями // /// Получить клиент для работы с технологическими сообщениями
/// </summary> // /// </summary>
/// <returns></returns> // /// <returns></returns>
public ITechMessagesClient GetTechMessagesClient() // //public ITechMessagesClient GetTechMessagesClient()
{ // //{
var logger = provider.GetRequiredService<ILogger<TechMessagesClient>>(); // // var logger = provider.GetRequiredService<ILogger<TechMessagesClient>>();
var restClient = RestService.For<IRefitTechMessagesClient>(httpClient, RefitSettings); // // var restClient = RestService.For<IRefitTechMessagesClient>(httpClient, RefitSettings);
var client = new TechMessagesClient(restClient, logger); // // var client = new TechMessagesClient(restClient, logger);
return client; // // return client;
} // //}
/// <summary> // /// <summary>
/// Получить клиент для работы с временными данными // /// Получить клиент для работы с временными данными
/// </summary> // /// </summary>
/// <typeparam name="TDto"></typeparam> // /// <typeparam name="TDto"></typeparam>
/// <returns></returns> // /// <returns></returns>
public ITimeSeriesClient<TDto> GetTimeSeriesClient<TDto>() // //public ITimeSeriesClient<TDto> GetTimeSeriesClient<TDto>()
where TDto : class, new() // // where TDto : class, new()
{ // //{
var logger = provider.GetRequiredService<ILogger<TimeSeriesClient<TDto>>>(); // // var logger = provider.GetRequiredService<ILogger<TimeSeriesClient<TDto>>>();
var restClient = RestService.For<IRefitTimeSeriesClient<TDto>>(httpClient, RefitSettings); // // var restClient = RestService.For<IRefitTimeSeriesClient<TDto>>(httpClient, RefitSettings);
var client = new TimeSeriesClient<TDto>(restClient, logger); // // var client = new TimeSeriesClient<TDto>(restClient, logger);
return client; // // return client;
} // //}
/// <summary> // /// <summary>
/// Получить клиент для работы с данными с отметкой времени // /// Получить клиент для работы с данными с отметкой времени
/// </summary> // /// </summary>
/// <returns></returns> // /// <returns></returns>
public ITimestampedSetClient GetTimestampedSetClient() // //public ITimestampedSetClient GetTimestampedSetClient()
{ // //{
var logger = provider.GetRequiredService<ILogger<TimestampedSetClient>>(); // // var logger = provider.GetRequiredService<ILogger<TimestampedSetClient>>();
var restClient = RestService.For<IRefitTimestampedSetClient>(httpClient, RefitSettings); // // var restClient = RestService.For<IRefitTimestampedSetClient>(httpClient, RefitSettings);
var client = new TimestampedSetClient(restClient, logger); // // var client = new TimestampedSetClient(restClient, logger);
return client; // // return client;
} // //}
/// <summary> // /// <summary>
/// Получить клиент для работы с записями ChangeLog // /// Получить клиент для работы с записями ChangeLog
/// </summary> // /// </summary>
/// <returns></returns> // /// <returns></returns>
//public IChangeLogClient GetChangeLogClient() // //public IChangeLogClient GetChangeLogClient()
//{ // //{
// var logger = provider.GetRequiredService<ILogger<ChangeLogClient>>(); // // var logger = provider.GetRequiredService<ILogger<ChangeLogClient>>();
// var restClient = RestService.For<IRefitChangeLogClient>(httpClient, RefitSettings); // // var restClient = RestService.For<IRefitChangeLogClient>(httpClient, RefitSettings);
// var client = new ChangeLogClient(restClient, logger); // // var client = new ChangeLogClient(restClient, logger);
// return client; // // return client;
//} // //}
/// <summary> // /// <summary>
/// Получить клиент для работы c параметрами Wits // /// Получить клиент для работы c параметрами Wits
/// </summary> // /// </summary>
/// <returns></returns> // /// <returns></returns>
public IWitsDataClient GetWitsDataClient() // //public IWitsDataClient GetWitsDataClient()
{ // //{
var logger = provider.GetRequiredService<ILogger<WitsDataClient>>(); // // var logger = provider.GetRequiredService<ILogger<WitsDataClient>>();
var restClient = RestService.For<IRefitWitsDataClient>(httpClient, RefitSettings); // // var restClient = RestService.For<IRefitWitsDataClient>(httpClient, RefitSettings);
var client = new WitsDataClient(restClient, logger); // // var client = new WitsDataClient(restClient, logger);
return client; // // return client;
} // //}
/// <summary> // /// <summary>
/// Получить клиент для работы c системами // /// Получить клиент для работы c системами
/// </summary> // /// </summary>
/// <returns></returns> // /// <returns></returns>
//public IDataSourceSystemClient GetDataSourceSystemClient() // //public IDataSourceSystemClient GetDataSourceSystemClient()
//{ // //{
// var logger = provider.GetRequiredService<ILogger<DataSourceSystemClient>>(); // // var logger = provider.GetRequiredService<ILogger<DataSourceSystemClient>>();
// var restClient = RestService.For<IRefitDataSourceSystemClient>(httpClient, RefitSettings); // // var restClient = RestService.For<IRefitDataSourceSystemClient>(httpClient, RefitSettings);
// var client = new DataSourceSystemClient(restClient, logger); // // var client = new DataSourceSystemClient(restClient, logger);
// return client; // // return client;
//} // //}
} // }
} //}

View File

@ -1,38 +1,41 @@
using Microsoft.Extensions.Caching.Memory; using DD.Persistence.Client;
using Microsoft.Extensions.DependencyInjection; using DD.Persistence.Client.Clients;
using DD.Persistence.Client;
using DD.Persistence.Client.Clients.Interfaces; using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Client.Clients.Interfaces.Refit;
using DD.Persistence.Database.Entity; using DD.Persistence.Database.Entity;
using DD.Persistence.Models; using DD.Persistence.Models;
using DD.Persistence.Models.Enumerations; using DD.Persistence.Models.Enumerations;
using DD.Persistence.Models.Requests; using DD.Persistence.Models.Requests;
using System.Net; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Xunit; using Xunit;
namespace DD.Persistence.IntegrationTests.Controllers namespace DD.Persistence.IntegrationTests.Controllers
{ {
public class TechMessagesControllerTest : BaseIntegrationTest public class TechMessagesControllerTest : BaseIntegrationTest
{ {
private static readonly string SystemCacheKey = $"{typeof(Database.Entity.DataSourceSystem).FullName}CacheKey"; private static readonly string SystemCacheKey = $"{typeof(Database.Entity.DataSourceSystem).FullName}CacheKey";
private readonly ITechMessagesClient techMessagesClient; private readonly ITechMessagesClient techMessagesClient;
private readonly IMemoryCache memoryCache; private readonly IMemoryCache memoryCache;
public TechMessagesControllerTest(WebAppFactoryFixture factory) : base(factory) public TechMessagesControllerTest(WebAppFactoryFixture factory) : base(factory)
{ {
var scope = factory.Services.CreateScope(); var refitClientFactory = scope.ServiceProvider
var persistenceClientFactory = scope.ServiceProvider .GetRequiredService<IRefitClientFactory<IRefitTechMessagesClient>>();
.GetRequiredService<PersistenceClientFactory>(); var logger = scope.ServiceProvider.GetRequiredService<ILogger<TechMessagesClient>>();
techMessagesClient = persistenceClientFactory.GetTechMessagesClient(); techMessagesClient = scope.ServiceProvider
memoryCache = scope.ServiceProvider.GetRequiredService<IMemoryCache>(); .GetRequiredService<ITechMessagesClient>();
} memoryCache = scope.ServiceProvider.GetRequiredService<IMemoryCache>();
}
[Fact] [Fact]
public async Task GetPage_returns_success() public async Task GetPage_returns_success()
{ {
//arrange //arrange
memoryCache.Remove(SystemCacheKey); memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>(); dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>(); dbContext.CleanupDbSet<DataSourceSystem>();
var requestDto = new PaginationRequest() var requestDto = new PaginationRequest()
{ {
@ -44,235 +47,235 @@ namespace DD.Persistence.IntegrationTests.Controllers
//act //act
var response = await techMessagesClient.GetPage(requestDto, CancellationToken.None); var response = await techMessagesClient.GetPage(requestDto, CancellationToken.None);
//assert //assert
Assert.NotNull(response); Assert.NotNull(response);
Assert.Empty(response.Items); Assert.Empty(response.Items);
Assert.Equal(requestDto.Skip, response.Skip); Assert.Equal(requestDto.Skip, response.Skip);
Assert.Equal(requestDto.Take, response.Take); Assert.Equal(requestDto.Take, response.Take);
} }
[Fact] [Fact]
public async Task GetPage_AfterSave_returns_success() public async Task GetPage_AfterSave_returns_success()
{ {
//arrange //arrange
var dtos = await InsertRange(Guid.NewGuid()); var dtos = await InsertRange(Guid.NewGuid());
var dtosCount = dtos.Count(); var dtosCount = dtos.Count();
var requestDto = new PaginationRequest() var requestDto = new PaginationRequest()
{ {
Skip = 0, Skip = 0,
Take = 2, Take = 2,
SortSettings = nameof(TechMessage.CategoryId) SortSettings = nameof(TechMessage.CategoryId)
}; };
//act //act
var response = await techMessagesClient.GetPage(requestDto, CancellationToken.None); var response = await techMessagesClient.GetPage(requestDto, CancellationToken.None);
//assert
Assert.NotNull(response);
Assert.Equal(dtosCount, response.Count);
}
[Fact]
public async Task InsertRange_returns_success()
{
await InsertRange(Guid.NewGuid());
}
[Fact]
public async Task InsertRange_returns_BadRequest()
{
//arrange
const string exceptionMessage = "Ошибка валидации, формата или маршрутизации запроса";
var systemId = Guid.NewGuid();
var dtos = new List<TechMessageDto>()
{
new TechMessageDto()
{
EventId = Guid.NewGuid(),
CategoryId = -1, // < 0
Timestamp = DateTimeOffset.UtcNow,
Text = string.Empty, // length < 0
EventState = EventState.Triggered
}
};
try
{
//act
var response = await techMessagesClient.AddRange(systemId, dtos, CancellationToken.None);
}
catch (Exception ex)
{
//assert
Assert.Equal(exceptionMessage, ex.Message);
}
}
[Fact]
public async Task GetSystems_returns_success()
{
//arrange
memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>();
//act
var response = await techMessagesClient.GetSystems(CancellationToken.None);
//assert
Assert.NotNull(response);
Assert.Empty(response);
}
[Fact]
public async Task GetSystems_AfterSave_returns_success()
{
//arrange
await InsertRange(Guid.NewGuid());
//act
var response = await techMessagesClient.GetSystems(CancellationToken.None);
//assert
Assert.NotNull(response);
var expectedSystemCount = 1;
Assert.Equal(expectedSystemCount, response!.Count());
}
[Fact]
public async Task GetStatistics_returns_success()
{
//arrange
memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>();
var categoryIds = new [] { 1, 2 };
var systemIds = new [] { Guid.NewGuid() };
//act
var response = await techMessagesClient.GetStatistics(systemIds, categoryIds, CancellationToken.None);
//assert
Assert.NotNull(response);
Assert.Empty(response);
}
[Fact]
public async Task GetStatistics_AfterSave_returns_success()
{
//arrange
var categoryIds = new[] { 1 };
var systemId = Guid.NewGuid();
var dtos = await InsertRange(systemId);
var filteredDtos = dtos.Where(e => categoryIds.Contains(e.CategoryId));
//act
var response = await techMessagesClient.GetStatistics([systemId], categoryIds, CancellationToken.None);
//assert
Assert.NotNull(response);
Assert.NotEmpty(response);
var categories = response
.FirstOrDefault()!.Categories
.Count();
Assert.Equal(filteredDtos.Count(), categories);
}
[Fact]
public async Task GetDatesRange_returns_NoContent()
{
//arrange
memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>();
//act
var response = await techMessagesClient.GetDatesRangeAsync(CancellationToken.None);
//assert //assert
Assert.Null(response); Assert.NotNull(response);
} Assert.Equal(dtosCount, response.Count);
}
[Fact] [Fact]
public async Task GetDatesRange_AfterSave_returns_success() public async Task InsertRange_returns_success()
{ {
//arrange await InsertRange(Guid.NewGuid());
await InsertRange(Guid.NewGuid()); }
[Fact]
public async Task InsertRange_returns_BadRequest()
{
//arrange
const string exceptionMessage = "Ошибка валидации, формата или маршрутизации запроса";
var systemId = Guid.NewGuid();
var dtos = new List<TechMessageDto>()
{
new TechMessageDto()
{
EventId = Guid.NewGuid(),
CategoryId = -1, // < 0
Timestamp = DateTimeOffset.UtcNow,
Text = string.Empty, // length < 0
EventState = EventState.Triggered
}
};
try
{
//act
var response = await techMessagesClient.AddRange(systemId, dtos, CancellationToken.None);
}
catch (Exception ex)
{
//assert
Assert.Equal(exceptionMessage, ex.Message);
}
}
[Fact]
public async Task GetSystems_returns_success()
{
//arrange
memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>();
//act
var response = await techMessagesClient.GetSystems(CancellationToken.None);
//assert
Assert.NotNull(response);
Assert.Empty(response);
}
[Fact]
public async Task GetSystems_AfterSave_returns_success()
{
//arrange
await InsertRange(Guid.NewGuid());
//act
var response = await techMessagesClient.GetSystems(CancellationToken.None);
//assert
Assert.NotNull(response);
var expectedSystemCount = 1;
Assert.Equal(expectedSystemCount, response!.Count());
}
[Fact]
public async Task GetStatistics_returns_success()
{
//arrange
memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>();
var categoryIds = new[] { 1, 2 };
var systemIds = new[] { Guid.NewGuid() };
//act
var response = await techMessagesClient.GetStatistics(systemIds, categoryIds, CancellationToken.None);
//assert
Assert.NotNull(response);
Assert.Empty(response);
}
[Fact]
public async Task GetStatistics_AfterSave_returns_success()
{
//arrange
var categoryIds = new[] { 1 };
var systemId = Guid.NewGuid();
var dtos = await InsertRange(systemId);
var filteredDtos = dtos.Where(e => categoryIds.Contains(e.CategoryId));
//act
var response = await techMessagesClient.GetStatistics([systemId], categoryIds, CancellationToken.None);
//assert
Assert.NotNull(response);
Assert.NotEmpty(response);
var categories = response
.FirstOrDefault()!.Categories
.Count();
Assert.Equal(filteredDtos.Count(), categories);
}
[Fact]
public async Task GetDatesRange_returns_NoContent()
{
//arrange
memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>();
//act //act
var response = await techMessagesClient.GetDatesRangeAsync(CancellationToken.None); var response = await techMessagesClient.GetDatesRangeAsync(CancellationToken.None);
//assert //assert
Assert.NotNull(response); Assert.Null(response);
Assert.NotNull(response?.From); }
Assert.NotNull(response?.To);
}
// [Fact] [Fact]
// public async Task GetPart_returns_success() public async Task GetDatesRange_AfterSave_returns_success()
// { {
// //arrange //arrange
// var dateBegin = DateTimeOffset.UtcNow; await InsertRange(Guid.NewGuid());
// var take = 2;
// //act //act
// var response = await techMessagesClient.GetPart(dateBegin, take, CancellationToken.None); var response = await techMessagesClient.GetDatesRangeAsync(CancellationToken.None);
// //assert //assert
// Assert.NotNull(response); Assert.NotNull(response);
// Assert.Empty(response); Assert.NotNull(response?.From);
//} Assert.NotNull(response?.To);
}
[Fact] // [Fact]
public async Task GetPart_AfterSave_returns_success() // public async Task GetPart_returns_success()
{ // {
//arrange // //arrange
var dateBegin = DateTimeOffset.UtcNow; // var dateBegin = DateTimeOffset.UtcNow;
var take = 1; // var take = 2;
await InsertRange(Guid.NewGuid());
// //act
// var response = await techMessagesClient.GetPart(dateBegin, take, CancellationToken.None);
// //assert
// Assert.NotNull(response);
// Assert.Empty(response);
//}
[Fact]
public async Task GetPart_AfterSave_returns_success()
{
//arrange
var dateBegin = DateTimeOffset.UtcNow;
var take = 1;
await InsertRange(Guid.NewGuid());
//act //act
var response = await techMessagesClient.GetPart(dateBegin, take, CancellationToken.None); var response = await techMessagesClient.GetPart(dateBegin, take, CancellationToken.None);
//assert //assert
Assert.NotNull(response); Assert.NotNull(response);
Assert.NotEmpty(response); Assert.NotEmpty(response);
} }
private async Task<IEnumerable<TechMessageDto>> InsertRange(Guid systemId) private async Task<IEnumerable<TechMessageDto>> InsertRange(Guid systemId)
{ {
//arrange //arrange
memoryCache.Remove(SystemCacheKey); memoryCache.Remove(SystemCacheKey);
dbContext.CleanupDbSet<TechMessage>(); dbContext.CleanupDbSet<TechMessage>();
dbContext.CleanupDbSet<DataSourceSystem>(); dbContext.CleanupDbSet<DataSourceSystem>();
var dtos = new List<TechMessageDto>() var dtos = new List<TechMessageDto>()
{ {
new TechMessageDto() new TechMessageDto()
{ {
EventId = Guid.NewGuid(), EventId = Guid.NewGuid(),
CategoryId = 1, CategoryId = 1,
Timestamp = DateTimeOffset.UtcNow, Timestamp = DateTimeOffset.UtcNow,
Text = nameof(TechMessageDto.Text), Text = nameof(TechMessageDto.Text),
EventState = Models.Enumerations.EventState.Triggered EventState = Models.Enumerations.EventState.Triggered
}, },
new TechMessageDto() new TechMessageDto()
{ {
EventId = Guid.NewGuid(), EventId = Guid.NewGuid(),
CategoryId = 2, CategoryId = 2,
Timestamp = DateTimeOffset.UtcNow, Timestamp = DateTimeOffset.UtcNow,
Text = nameof(TechMessageDto.Text), Text = nameof(TechMessageDto.Text),
EventState = Models.Enumerations.EventState.Triggered EventState = Models.Enumerations.EventState.Triggered
} }
}; };
//act //act
var response = await techMessagesClient.AddRange(systemId, dtos, CancellationToken.None); var response = await techMessagesClient.AddRange(systemId, dtos, CancellationToken.None);
//assert //assert
Assert.Equal(dtos.Count, response); Assert.Equal(dtos.Count, response);
return dtos; return dtos;
} }

View File

@ -1,16 +1,19 @@
using DD.Persistence.Client;
using DD.Persistence.Client.Clients;
using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Client.Clients.Interfaces.Refit;
using DD.Persistence.Database.Model;
using DD.Persistence.Models;
using Mapster; using Mapster;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using DD.Persistence.Client; using Microsoft.Extensions.Logging;
using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Database.Model;
using System.Net;
using Xunit; using Xunit;
namespace DD.Persistence.IntegrationTests.Controllers; namespace DD.Persistence.IntegrationTests.Controllers;
public abstract class TimeSeriesBaseControllerTest<TEntity, TDto> : BaseIntegrationTest public abstract class TimeSeriesBaseControllerTest<TEntity, TDto> : BaseIntegrationTest
where TEntity : class, ITimestampedData, new() where TEntity : class, ITimestampedData, new()
where TDto : class, new() where TDto : class, ITimeSeriesAbstractDto, new()
{ {
private readonly ITimeSeriesClient<TDto> timeSeriesClient; private readonly ITimeSeriesClient<TDto> timeSeriesClient;
@ -18,11 +21,12 @@ public abstract class TimeSeriesBaseControllerTest<TEntity, TDto> : BaseIntegrat
{ {
dbContext.CleanupDbSet<TEntity>(); dbContext.CleanupDbSet<TEntity>();
var scope = factory.Services.CreateScope(); var refitClientFactory = scope.ServiceProvider
var persistenceClientFactory = scope.ServiceProvider .GetRequiredService<IRefitClientFactory<IRefitTimeSeriesClient<TDto>>>();
.GetRequiredService<PersistenceClientFactory>(); var logger = scope.ServiceProvider.GetRequiredService<ILogger<TimeSeriesClient<TDto>>>();
timeSeriesClient = persistenceClientFactory.GetTimeSeriesClient<TDto>(); timeSeriesClient = scope.ServiceProvider
.GetRequiredService<ITimeSeriesClient<TDto>>();
} }
public async Task InsertRangeSuccess(TDto dto) public async Task InsertRangeSuccess(TDto dto)

View File

@ -3,6 +3,9 @@ using DD.Persistence.Client;
using DD.Persistence.Client.Clients.Interfaces; using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Models; using DD.Persistence.Models;
using Xunit; using Xunit;
using DD.Persistence.Client.Clients.Interfaces.Refit;
using DD.Persistence.Client.Clients;
using Microsoft.Extensions.Logging;
namespace DD.Persistence.IntegrationTests.Controllers; namespace DD.Persistence.IntegrationTests.Controllers;
public class TimestampedSetControllerTest : BaseIntegrationTest public class TimestampedSetControllerTest : BaseIntegrationTest
@ -11,10 +14,12 @@ public class TimestampedSetControllerTest : BaseIntegrationTest
public TimestampedSetControllerTest(WebAppFactoryFixture factory) : base(factory) public TimestampedSetControllerTest(WebAppFactoryFixture factory) : base(factory)
{ {
var persistenceClientFactory = scope.ServiceProvider var refitClientFactory = scope.ServiceProvider
.GetRequiredService<PersistenceClientFactory>(); .GetRequiredService<IRefitClientFactory<IRefitTimestampedSetClient>>();
var logger = scope.ServiceProvider.GetRequiredService<ILogger<TimestampedSetClient>>();
client = persistenceClientFactory.GetTimestampedSetClient(); client = scope.ServiceProvider
.GetRequiredService<ITimestampedSetClient>();
} }
[Fact] [Fact]

View File

@ -1,13 +1,12 @@
using Microsoft.Extensions.DependencyInjection; using DD.Persistence.Client;
using DD.Persistence.Client.Clients;
using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Client.Clients.Interfaces.Refit;
using DD.Persistence.Database.Entity; using DD.Persistence.Database.Entity;
using DD.Persistence.Models; using DD.Persistence.Models;
using System.Net; using Microsoft.Extensions.DependencyInjection;
using Xunit;
using DD.Persistence.Client.Clients.Interfaces;
using DD.Persistence.Client;
using DD.Persistence.Client.Clients.Interfaces.Refit;
using DD.Persistence.Client.Clients;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Xunit;
namespace DD.Persistence.IntegrationTests.Controllers; namespace DD.Persistence.IntegrationTests.Controllers;
public class WitsDataControllerTest : BaseIntegrationTest public class WitsDataControllerTest : BaseIntegrationTest
@ -17,7 +16,7 @@ public class WitsDataControllerTest : BaseIntegrationTest
public WitsDataControllerTest(WebAppFactoryFixture factory) : base(factory) public WitsDataControllerTest(WebAppFactoryFixture factory) : base(factory)
{ {
var refitClientFactory = scope.ServiceProvider var refitClientFactory = scope.ServiceProvider
.GetRequiredService<IRefitClientFactory<IRefitWitsDataClient>>(); .GetRequiredService<IRefitClientFactory<IRefitWitsDataClient>>();
var logger = scope.ServiceProvider.GetRequiredService<ILogger<WitsDataClient>>(); var logger = scope.ServiceProvider.GetRequiredService<ILogger<WitsDataClient>>();
witsDataClient = scope.ServiceProvider witsDataClient = scope.ServiceProvider