using System.Net; using System.Reflection; using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Requests; using AsbCloudDb.Model; using AsbCloudWebApi.IntegrationTests.Clients; using AsbCloudWebApi.IntegrationTests.Data; using Mapster; using Microsoft.EntityFrameworkCore; using Refit; using Xunit; namespace AsbCloudWebApi.IntegrationTests.Controllers.WellOperations; public class WellOperationControllerTest : BaseIntegrationTest { private IWellOperationClient client; public WellOperationControllerTest(WebAppFactoryFixture factory) : base(factory) { client = factory.GetAuthorizedHttpClient(string.Empty); dbContext.CleanupDbSet(); } /// /// Успешное добавление операций (без предварительной очистки данных) /// /// [Fact] public async Task InsertRange_returns_success() { //arrange var well = await dbContext.Wells.FirstAsync(); var entity = CreateWellOperation(well.Id); var dtos = new[] { entity.Adapt() }; //act var response = await client.InsertRangeAsync(well.Id, false, dtos); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); } /// /// Успешное добавление операций (с предварительной очисткой данных) /// /// [Fact] public async Task InsertRangeWithDeleteBefore_returns_success() { //arrange var well = await dbContext.Wells.FirstAsync(); var entity = CreateWellOperation(well.Id); var dtos = new[] { entity.Adapt() }; //act var response = await client.InsertRangeAsync(well.Id, true, dtos); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); } /// /// Успешное обновление операций /// /// [Fact] public async Task UpdateRangeAsync_returns_success() { //arrange var well = await dbContext.Wells.FirstAsync(); var entity = CreateWellOperation(well.Id); dbContext.WellOperations.Add(entity); await dbContext.SaveChangesAsync(); var dtos = new[] { entity.Adapt() }; //act var response = await client.UpdateRangeAsync(well.Id, dtos); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); } /// /// Получение плановых операций /// /// [Fact] public async Task GetPageOperationsAsync_returns_first_page() { //arrange const int pageSize = 10; const int pageIndex = 0; var well = await dbContext.Wells.FirstAsync(); var entity = CreateWellOperation(well.Id); dbContext.WellOperations.Add(entity); await dbContext.SaveChangesAsync(); var dto = entity.Adapt(); var timezoneOffset = TimeSpan.FromHours(well.Timezone.Hours); dto.DateStart = dto.DateStart.ToOffset(timezoneOffset); dto.LastUpdateDate = dto.LastUpdateDate?.ToOffset(timezoneOffset); var request = new WellOperationRequestBase { OperationType = WellOperation.IdOperationTypePlan, Skip = pageIndex, Take = pageSize, }; //act var response = await client.GetPageOperationsAsync(well.Id, request); //assert Assert.Equal(response.StatusCode, HttpStatusCode.OK); Assert.NotNull(response.Content); var totalExpected = response.Content.Count - pageSize * pageIndex; Assert.Equal(totalExpected, response.Content.Items.Count()); Assert.Single(response.Content.Items); var actualDto = response.Content.Items.First(); MatchHelper.Match(dto, actualDto); } [Theory] [InlineData(WellOperation.IdOperationTypePlan, "PlanWellOperations.xlsx")] [InlineData(WellOperation.IdOperationTypeFact, "FactWellOperations.xlsx")] public async Task ParseAsync_returns_success(int idType, string fileName) { //arrange var well = await dbContext.Wells.FirstAsync(); var expectedDto = new WellOperationDto { IdWell = well.Id, IdWellSectionType = 2, IdCategory = WellOperationCategory.IdSlide, IdPlan = null, CategoryInfo = "Доп.инфо", IdType = idType, DepthStart = 10.0, DepthEnd = 20.0, DateStart = new DateTimeOffset(new DateTime(2023, 1, 10), TimeSpan.FromHours(well.Timezone.Hours)), DurationHours = 1.0, Comment = "123", }; var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); //act var response = await client.ParseAsync(well.Id, idType, streamPart); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.NotNull(response.Content); var actualDto = response.Content.Item.First().Item; MatchHelper.Match(expectedDto, actualDto); } [Theory] [InlineData(WellOperation.IdOperationTypePlan)] [InlineData(WellOperation.IdOperationTypeFact)] public async Task ExportAsync_returns_success(int idType) { //arrange var well = await dbContext.Wells.FirstAsync(); var entity = CreateWellOperation(well.Id, idType); dbContext.WellOperations.Add(entity); await dbContext.SaveChangesAsync(); //act var response = await client.ExportAsync(well.Id, idType); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal("application/octet-stream", response.ContentHeaders?.ContentType?.MediaType); Assert.True(response.ContentHeaders?.ContentLength > 0); } private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => new() { IdWell = idWell, IdWellSectionType = 2, IdCategory = WellOperationCategory.IdSlide, IdPlan = null, CategoryInfo = "Доп.инфо", LastUpdateDate = new DateTimeOffset(new DateTime(2023, 1, 10)).ToUniversalTime(), IdType = idType, DepthStart = 10.0, DepthEnd = 20.0, DateStart = new DateTimeOffset(new DateTime(2023, 1, 10), TimeSpan.FromHours(Defaults.Timezone.Hours)).ToUniversalTime(), DurationHours = 1.0, Comment = "1", IdUser = 1, }; }