From 832489b9ac57fe34e2e0514d8e477882ee168cc5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 21 May 2024 07:12:22 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Requests/ProcessMapPlanBaseRequest.cs | 7 - AsbCloudInfrastructure/DependencyInjection.cs | 4 +- .../Repository/ChangeLogRepositoryAbstract.cs | 1 + .../ProcessMapPlanBaseRepository.cs | 3 - .../Clients/IProcessMapPlanDrillingClient.cs | 20 +- .../ProcessMapPlanDrillingControllerTest.cs | 1174 ++++++++--------- .../Data/Defaults.cs | 4 +- 7 files changed, 575 insertions(+), 638 deletions(-) diff --git a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs index 006c26e5..98a2dc4f 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanBaseRequest.cs @@ -8,12 +8,6 @@ namespace AsbCloudApp.Requests; /// public class ProcessMapPlanBaseRequest: ChangeLogBaseRequest { - /// - /// Тип секции - /// - [Range(1, int.MaxValue, ErrorMessage = "Id секции - положительное число")] - public int? IdWellSectionType { get; set; } - /// /// Вернуть данные, которые поменялись с указанной даты /// @@ -42,7 +36,6 @@ public class ProcessMapPlanBaseRequestWithWell: ProcessMapPlanBaseRequest public ProcessMapPlanBaseRequestWithWell(ProcessMapPlanBaseRequest request, int idWell) { IdWell=idWell; - IdWellSectionType=request.IdWellSectionType; UpdateFrom = request.UpdateFrom; Moment = request.Moment; } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 9f802e2e..591c195c 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -134,9 +134,9 @@ namespace AsbCloudInfrastructure TypeAdapterConfig>.NewConfig() .Include>() - .Map(dest => dest, src => new ChangeLogDto() + .Map(dest => dest, src => new ChangeLogDto() { - Item = src.Adapt() + Item = src.Adapt() }); } diff --git a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs index 1c83500d..088518e9 100644 --- a/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs +++ b/AsbCloudInfrastructure/Repository/ChangeLogRepositoryAbstract.cs @@ -249,6 +249,7 @@ public abstract class ChangeLogRepositoryAbstract : ICh { var query = BuildQuery(request); var entities = await query + .Where(e => e.Obsolete == null) .OrderBy(e => e.Creation) .ThenBy(e => e.Obsolete) .ThenBy(e => e.Id) diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs index 5e351db7..3d968ddc 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs @@ -32,9 +32,6 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb .Include(e => e.WellSectionType) .Where(e => e.IdWell == request.IdWell); - if (request.IdWellSectionType.HasValue) - query = query.Where(e => e.IdWellSectionType == request.IdWellSectionType); - if (request.UpdateFrom.HasValue) { var from = request.UpdateFrom.Value.ToUniversalTime(); diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs index 93ce768b..51655328 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs @@ -5,15 +5,15 @@ using Refit; namespace AsbCloudWebApi.IntegrationTests.Clients; -public interface IProcessMapPlanDrillingClient +public interface IProcessMapPlanDrillingClient where TDto : ProcessMapPlanBaseDto { private const string BaseRoute = "/api/well/{idWell}/ProcessMapPlanDrilling"; [Post(BaseRoute)] - Task> InsertRange(int idWell, [Body] IEnumerable dtos); + Task> InsertRange(int idWell, [Body] IEnumerable dtos); [Post($"{BaseRoute}/replace")] - Task> ClearAndInsertRange(int idWell, [Body] IEnumerable dtos); + Task> ClearAndInsertRange(int idWell, [Body] IEnumerable dtos); [Delete(BaseRoute)] Task> DeleteRange(int idWell, [Body] IEnumerable ids); @@ -22,18 +22,24 @@ public interface IProcessMapPlanDrillingClient Task> Clear(int idWell); [Get(BaseRoute)] - Task>> Get(int idWell, ProcessMapPlanBaseRequest request); + Task>> Get(int idWell); + + [Get($"{BaseRoute}/history")] + Task>>> Get(int idWell, DateTimeOffset? moment); + + [Get("/api/telemetry/{uid}/ProcessMapPlanDrilling")] + Task>>> Get(string uid, DateTimeOffset? updateFrom); [Get($"{BaseRoute}/changeLog")] - Task>> GetChangeLog(int idWell, DateOnly? date); + Task>> GetChangeLog(int idWell, DateOnly? date); [Get($"{BaseRoute}/dates")] Task>> GetDatesChange(int idWell); [Put(BaseRoute)] - Task> UpdateOrInsertRange(int idWell, IEnumerable dtos); + Task> UpdateOrInsertRange(int idWell, IEnumerable dtos); [Multipart] [Post(BaseRoute + "/parse")] - Task>> Parse(int idWell, [AliasAs("file")] StreamPart stream); + Task>> Parse(int idWell, [AliasAs("file")] StreamPart stream); } diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs index 18bda7f0..cddd7781 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs @@ -1,618 +1,556 @@ -//using AsbCloudApp.Requests; -//using AsbCloudDb.Model.ProcessMapPlan; -//using AsbCloudWebApi.IntegrationTests.Clients; -//using Mapster; -//using Microsoft.EntityFrameworkCore; -//using System.Net; -//using System.Reflection; -//using AsbCloudDb.Model.ProcessMaps; -//using AsbCloudWebApi.IntegrationTests.Data; -//using Refit; -//using Xunit; -//using AsbCloudApp.Data.ProcessMaps; -//using AsbCloudDb.Model; -//using AsbCloudApp.Data.User; - -//namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan; - -//public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest -//{ -// private const int IdWell = 1; - -// private readonly ProcessMapPlanDrillingDto dto = new (){ -// Id = 0, -// Creation = new(), -// Obsolete = null, -// IdState = 0, -// IdPrevious = null, - -// IdWell = IdWell, -// Section = "Кондуктор", -// IdWellSectionType = 3, -// DepthStart = 0.5, -// DepthEnd = 1.5, - -// IdMode = 1, -// AxialLoadPlan = 2.718281, -// AxialLoadLimitMax = 3.1415926, -// DeltaPressurePlan = 4, -// DeltaPressureLimitMax = 5, -// TopDriveTorquePlan = 6, -// TopDriveTorqueLimitMax = 7, -// TopDriveSpeedPlan = 8, -// TopDriveSpeedLimitMax = 9, -// FlowPlan = 10, -// FlowLimitMax = 11, -// RopPlan = 12, -// UsageSaub = 13, -// UsageSpin = 14, -// Comment = "это тестовая запись", -// }; -// private readonly ProcessMapPlanDrilling entity = new () -// { -// Id = 0, -// IdAuthor = 1, -// IdEditor = null, -// Creation = DateTimeOffset.UtcNow, -// Obsolete = null, -// IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual, -// IdPrevious = null, - -// IdWell = IdWell, -// IdWellSectionType = 1, -// DepthStart = 0.5, -// DepthEnd = 1.5, - -// IdMode = 1, -// AxialLoadPlan = 2.718281, -// AxialLoadLimitMax = 3.1415926, -// DeltaPressurePlan = 4, -// DeltaPressureLimitMax = 5, -// TopDriveTorquePlan = 6, -// TopDriveTorqueLimitMax = 7, -// TopDriveSpeedPlan = 8, -// TopDriveSpeedLimitMax = 9, -// FlowPlan = 10, -// FlowLimitMax = 11, -// RopPlan = 12, -// UsageSaub = 13, -// UsageSpin = 14, -// Comment = "это тестовая запись", -// }; - -// private IProcessMapPlanDrillingClient client; - -// public ProcessMapPlanDrillingControllerTest(WebAppFactoryFixture factory) : base(factory) -// { -// dbContext.CleanupDbSet(); -// client = factory.GetAuthorizedHttpClient(string.Empty); -// } - -// [Fact] -// public async Task InsertRange_returns_success() -// { -// //arrange -// var expected = dto.Adapt(); - -// //act -// var response = await client.InsertRange(dto.IdWell, new[] { expected }); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.Equal(1, response.Content); - -// var entity = dbContext -// .Set() -// .Where(p => p.AxialLoadPlan == dto.AxialLoadPlan) -// .Where(p => p.AxialLoadLimitMax == dto.AxialLoadLimitMax) -// .Where(p => p.Comment == dto.Comment) -// .FirstOrDefault(p => p.IdWell == dto.IdWell); - -// Assert.NotNull(entity); - -// var actual = entity.Adapt(); -// Assert.Equal(ProcessMapPlanBase.IdStateActual, actual.IdState); - -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.IdState), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// nameof(ProcessMapPlanDrillingDto.Section) -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task InsertRange_returns_BadRequest_for_IdWellSectionType() -// { -// //arrange -// var badDto = dto.Adapt(); -// badDto.IdWellSectionType = int.MaxValue; - -// //act -// var response = await client.InsertRange(dto.IdWell, new[] { badDto }); - -// //assert -// Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); -// } - -// [Fact] -// public async Task InsertRange_returns_BadRequest_for_IdMode() -// { -// //arrange -// var badDto = dto.Adapt(); -// badDto.IdMode = int.MaxValue; - -// //act -// var response = await client.InsertRange(dto.IdWell, new[] { badDto }); - -// //assert -// Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); -// } - -// [Fact] -// public async Task ClearAndInsertRange_returns_success() -// { -// // arrange -// var dbset = dbContext.Set(); - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var startTime = DateTimeOffset.UtcNow; - -// // act -// var result = await client.ClearAndInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dto }); - -// // assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, result.StatusCode); -// Assert.Equal(2, result.Content); - -// var count = dbset.Count(); -// Assert.Equal(2, count); - -// var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); -// Assert.Equal(ProcessMapPlanBase.IdCleared, oldEntity.IdState); -// Assert.Equal(1, oldEntity.IdEditor); -// Assert.NotNull(oldEntity.Obsolete); -// Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); - -// var newEntity = dbset.First(p => p.Id != entry.Entity.Id); -// Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); -// Assert.Equal(1, newEntity.IdAuthor); -// Assert.Null(newEntity.IdEditor); -// Assert.Null(newEntity.Obsolete); -// Assert.Null(newEntity.IdPrevious); -// Assert.InRange(newEntity.Creation, startTime, doneTime); -// } - -// [Fact] -// public async Task UpdateOrInsertRange_returns_success() -// { -// // arrange -// var startTime = DateTimeOffset.UtcNow; - -// var dbset = dbContext.Set(); -// var user = dbContext.Set().First().Adapt(); -// user.Surname = "userSurname"; -// user.Email = "user@mail.domain"; - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var dtoUpdate = dto.Adapt(); -// dtoUpdate.IdWell = 0; -// dtoUpdate.Id = entry.Entity.Id; -// dtoUpdate.Comment = "nebuchadnezzar"; -// dtoUpdate.DeltaPressureLimitMax++; -// dtoUpdate.DeltaPressurePlan++; -// dtoUpdate.FlowPlan++; -// dtoUpdate.FlowLimitMax++; -// dtoUpdate.RopPlan++; -// dtoUpdate.AxialLoadPlan++; -// dtoUpdate.AxialLoadLimitMax++; -// dtoUpdate.DepthStart++; -// dtoUpdate.DepthEnd++; -// dtoUpdate.TopDriveSpeedPlan++; -// dtoUpdate.TopDriveSpeedLimitMax++; -// dtoUpdate.TopDriveTorquePlan++; -// dtoUpdate.TopDriveTorqueLimitMax++; -// dtoUpdate.Author = user; - -// var dtoInsert = dtoUpdate.Adapt(); -// dtoInsert.Id = 0; -// dtoInsert.Comment = "nebuchad"; -// dtoInsert.DeltaPressureLimitMax++; -// dtoInsert.DeltaPressurePlan++; -// dtoInsert.FlowPlan++; -// dtoInsert.FlowLimitMax++; -// dtoInsert.RopPlan++; -// dtoInsert.AxialLoadPlan++; -// dtoInsert.AxialLoadLimitMax++; -// dtoInsert.DepthStart++; -// dtoInsert.DepthEnd++; -// dtoInsert.TopDriveSpeedPlan++; -// dtoInsert.TopDriveSpeedLimitMax++; -// dtoInsert.TopDriveTorquePlan++; -// dtoInsert.TopDriveTorqueLimitMax++; -// dtoInsert.Author = user; - -// // act -// var result = await client.UpdateOrInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dtoUpdate, dtoInsert }); - -// // assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, result.StatusCode); -// Assert.Equal(3, result.Content); - -// var count = dbset.Count(); -// Assert.Equal(3, count); - -// var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); -// Assert.Equal(ProcessMapPlanBase.IdStateReplaced, oldEntity.IdState); -// Assert.Equal(1, oldEntity.IdEditor); -// Assert.NotNull(oldEntity.Obsolete); -// Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); - -// var newEntity = dbset.First(p => p.Comment == dtoUpdate.Comment); -// Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); -// Assert.Equal(1, newEntity.IdAuthor); -// Assert.Null(newEntity.IdEditor); -// Assert.Null(newEntity.Obsolete); -// Assert.Equal(oldEntity.Id, newEntity.IdPrevious); -// Assert.InRange(newEntity.Creation, startTime, doneTime); - -// var expected = dtoUpdate.Adapt(); -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrilling.Id), -// nameof(ProcessMapPlanDrilling.IdWell), -// nameof(ProcessMapPlanDrilling.Author), -// nameof(ProcessMapPlanDrilling.IdAuthor), -// nameof(ProcessMapPlanDrilling.Editor), -// nameof(ProcessMapPlanDrilling.Creation), -// }; -// MatchHelper.Match(expected, newEntity!, excludeProps); -// } - -// [Fact] -// public async Task DeleteRange_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var startTime = DateTimeOffset.UtcNow; - -// //act -// var response = await client.DeleteRange(dto.IdWell, new[] { entry.Entity.Id }); - -// //assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.Equal(1, response.Content); - -// var actual = dbContext -// .Set() -// .FirstOrDefault(p => p.Id == entry.Entity.Id); - -// Assert.NotNull(actual); -// Assert.Equal(ProcessMapPlanBase.IdStateDeleted, actual.IdState); -// Assert.Equal(1, actual.IdEditor); -// Assert.NotNull(actual.Obsolete); -// Assert.InRange(actual.Obsolete.Value, startTime, doneTime); -// } - - -// [Fact] -// public async Task Clear_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var entry = dbset.Add(entity); -// dbContext.SaveChanges(); -// entry.State = EntityState.Detached; - -// var startTime = DateTimeOffset.UtcNow; - -// //act -// var response = await client.Clear(dto.IdWell); - -// //assert -// var doneTime = DateTimeOffset.UtcNow; -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.Equal(1, response.Content); - -// var actual = dbContext -// .Set() -// .FirstOrDefault(p => p.Id == entry.Entity.Id); - -// Assert.NotNull(actual); -// Assert.Equal(ProcessMapPlanBase.IdCleared, actual.IdState); -// Assert.Equal(1, actual.IdEditor); -// Assert.NotNull(actual.Obsolete); -// Assert.InRange(actual.Obsolete.Value, startTime, doneTime); -// } - -// [Fact] -// public async Task GetDatesChange_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var entity2 = entity.Adapt(); -// entity2.Creation = entity.Creation.AddDays(1); -// dbset.Add(entity); -// dbset.Add(entity2); -// dbContext.SaveChanges(); -// var timezoneHours = Defaults.Timezone.Hours; -// var offset = TimeSpan.FromHours(timezoneHours); -// var dates = new[] { entity.Creation, entity2.Creation } -// .Select(d => d.ToOffset(offset)) -// .Select(d => new DateOnly(d.Year, d.Month, d.Day)); - -// //act -// var response = await client.GetDatesChange(dto.IdWell); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Equal(2, response.Content.Count()); -// Assert.All(response.Content, d => dates.Contains(d)); -// } - -// [Fact] -// public async Task Get_all_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entityDeleted = entity.Adapt(); -// entityDeleted.Creation = entity.Creation.AddDays(-1); -// entityDeleted.Obsolete = entity.Creation; -// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted.IdEditor = 1; -// dbset.Add(entityDeleted); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest(); -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Equal(2, response.Content.Count()); -// } - -// [Fact] -// public async Task Get_actual_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entityDeleted = entity.Adapt(); -// entityDeleted.Creation = entity.Creation.AddDays(-1); -// entityDeleted.Obsolete = entity.Creation; -// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted.IdEditor = 1; -// entityDeleted.Comment = "nothing"; -// dbset.Add(entityDeleted); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest { -// Moment = new DateTimeOffset(3000, 1, 1, 0, 0, 0, 0, TimeSpan.Zero) -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Single(response.Content); - -// var actual = response.Content.First()!; - -// var expected = entity.Adapt()!; -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task Get_at_moment_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// var now = DateTimeOffset.UtcNow; -// var entityDeleted = entity.Adapt(); -// entityDeleted.Creation = now; -// entityDeleted.Obsolete = now.AddMinutes(1); -// entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted.IdEditor = 1; -// entityDeleted.Comment = "nothing"; -// dbset.Add(entityDeleted); - -// var entityDeleted2 = entity.Adapt(); -// entityDeleted2.Creation = now.AddMinutes(1); -// entityDeleted2.Obsolete = now.AddMinutes(2); -// entityDeleted2.IdState = ProcessMapPlanBase.IdStateDeleted; -// entityDeleted2.IdEditor = 1; -// entityDeleted2.Comment = "nothing"; -// dbset.Add(entityDeleted2); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest -// { -// Moment = now.AddMinutes(0.5), -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Single(response.Content); -// } - -// [Fact] -// public async Task Get_section_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entity2 = entity.Adapt(); -// entity2.IdWellSectionType = 2; -// entity2.Comment = "IdWellSectionType = 2"; -// dbset.Add(entity2); - -// dbContext.SaveChanges(); - -// //act -// var request = new ProcessMapPlanBaseRequest -// { -// IdWellSectionType = 2, -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Single(response.Content); - -// var actual = response.Content.First()!; - -// var expected = entity2.Adapt()!; -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task Get_updated_returns_success() -// { -// //arrange -// var dbset = dbContext.Set(); - -// dbset.Add(entity); - -// var entity2 = entity.Adapt(); -// entity2.Creation = entity.Creation.AddHours(1); -// entity2.Comment = "IdWellSectionType = 2"; -// dbset.Add(entity2); - -// var entity3 = entity.Adapt(); -// entity3.Obsolete = entity.Creation.AddHours(1); -// entity3.Comment = "IdWellSectionType = 3"; -// dbset.Add(entity3); - -// dbContext.SaveChanges(); - -// var timezoneHours = Defaults.Timezone.Hours; -// var offset = TimeSpan.FromHours(timezoneHours); -// var updateFrom = entity.Creation.ToOffset(offset).AddHours(0.5); - -// //act -// var request = new ProcessMapPlanBaseRequest -// { -// UpdateFrom = updateFrom, -// }; -// var response = await client.Get(dto.IdWell, request); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); -// Assert.NotNull(response.Content); -// Assert.Equal(2, response.Content.Count()); - -// var actual = response.Content -// .First(p => p.Comment == entity2.Comment); - -// var expected = entity2.Adapt(); -// var excludeProps = new[] { -// nameof(ProcessMapPlanDrillingDto.Id), -// nameof(ProcessMapPlanDrillingDto.Author), -// nameof(ProcessMapPlanDrillingDto.Creation), -// }; -// MatchHelper.Match(expected, actual, excludeProps); -// } - -// [Fact] -// public async Task Parse_returns_success() -// { -// //arrange -// const string fileName = "ProcessMapPlanDrillingValid.xlsx"; -// var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - -// var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - -// //act -// var response = await client.Parse(IdWell, streamPart); - -// //assert -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); - -// var parserResult = response.Content; - -// Assert.NotNull(parserResult); -// Assert.Single(parserResult.Item); -// Assert.True(parserResult.IsValid); - -// var row = parserResult.Item.First(); -// var dtoActual = row.Item; - -// Assert.True(row.IsValid); - -// var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.IdWell) }; -// MatchHelper.Match(dto, dtoActual, excludeProps); -// } - -// [Fact] -// public async Task Parse_returns_success_for_result_with_warnings() -// { -// //arrange -// const string fileName = "ProcessMapPlanDrillingInvalid.xlsx"; -// var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - -// var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - -// //act -// var response = await client.Parse(IdWell, streamPart); - -// Assert.Equal(HttpStatusCode.OK, response.StatusCode); - -// var parserResult = response.Content; - -// Assert.NotNull(parserResult); -// Assert.False(parserResult.IsValid); -// Assert.Single(parserResult.Warnings); -// Assert.Single(parserResult.Item); - -// var row = parserResult.Item.First(); - -// Assert.False(row.IsValid); -// Assert.Equal(2, row.Warnings.Count()); -// } -//} \ No newline at end of file +using AsbCloudApp.Requests; +using AsbCloudDb.Model.ProcessMapPlan; +using AsbCloudWebApi.IntegrationTests.Clients; +using Mapster; +using Microsoft.EntityFrameworkCore; +using System.Net; +using System.Reflection; +using AsbCloudDb.Model.ProcessMaps; +using AsbCloudWebApi.IntegrationTests.Data; +using Refit; +using Xunit; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudDb.Model; +using AsbCloudApp.Data.User; +using AsbCloudApp.Data; + +namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan; + +public class ProcessMapPlanDrillingControllerTest : BaseIntegrationTest +{ + private const int IdWell = 1; + + private readonly ProcessMapPlanDrillingDto dto = new() + { + Id = 0, + + IdWell = IdWell, + Section = "Кондуктор", + IdWellSectionType = 3, + DepthStart = 0.5, + DepthEnd = 1.5, + + IdMode = 1, + AxialLoadPlan = 2.718281, + AxialLoadLimitMax = 3.1415926, + DeltaPressurePlan = 4, + DeltaPressureLimitMax = 5, + TopDriveTorquePlan = 6, + TopDriveTorqueLimitMax = 7, + TopDriveSpeedPlan = 8, + TopDriveSpeedLimitMax = 9, + FlowPlan = 10, + FlowLimitMax = 11, + RopPlan = 12, + UsageSaub = 13, + UsageSpin = 14, + Comment = "это тестовая запись", + }; + private readonly ProcessMapPlanDrilling entity = new() + { + Id = 0, + IdAuthor = 1, + IdEditor = null, + Creation = DateTimeOffset.UtcNow, + Obsolete = null, + IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual, + IdPrevious = null, + + IdWell = IdWell, + IdWellSectionType = 1, + DepthStart = 0.5, + DepthEnd = 1.5, + + IdMode = 1, + AxialLoadPlan = 2.718281, + AxialLoadLimitMax = 3.1415926, + DeltaPressurePlan = 4, + DeltaPressureLimitMax = 5, + TopDriveTorquePlan = 6, + TopDriveTorqueLimitMax = 7, + TopDriveSpeedPlan = 8, + TopDriveSpeedLimitMax = 9, + FlowPlan = 10, + FlowLimitMax = 11, + RopPlan = 12, + UsageSaub = 13, + UsageSpin = 14, + Comment = "это тестовая запись", + }; + + private IProcessMapPlanDrillingClient client; + + public ProcessMapPlanDrillingControllerTest(WebAppFactoryFixture factory) : base(factory) + { + dbContext.CleanupDbSet(); + client = factory.GetAuthorizedHttpClient>(string.Empty); + } + + [Fact] + public async Task InsertRange_returns_success() + { + //arrange + var expected = dto.Adapt(); + + //act + var response = await client.InsertRange(dto.IdWell, new[] { expected }); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(1, response.Content); + + var entity = dbContext + .Set() + .Where(p => p.AxialLoadPlan == dto.AxialLoadPlan) + .Where(p => p.AxialLoadLimitMax == dto.AxialLoadLimitMax) + .Where(p => p.Comment == dto.Comment) + .FirstOrDefault(p => p.IdWell == dto.IdWell); + + Assert.NotNull(entity); + + var actual = entity.Adapt>(); + Assert.Equal(ProcessMapPlanBase.IdStateActual, actual.IdState); + + var excludeProps = new[] { + nameof(ProcessMapPlanDrillingDto.Id), + nameof(ProcessMapPlanDrillingDto.Section) + }; + MatchHelper.Match(expected, actual.Item, excludeProps); + } + + [Fact] + public async Task InsertRange_returns_BadRequest_for_IdWellSectionType() + { + //arrange + var badDto = dto.Adapt(); + badDto.IdWellSectionType = int.MaxValue; + + //act + var response = await client.InsertRange(dto.IdWell, new[] { badDto }); + + //assert + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + [Fact] + public async Task InsertRange_returns_BadRequest_for_IdMode() + { + //arrange + var badDto = dto.Adapt(); + badDto.IdMode = int.MaxValue; + + //act + var response = await client.InsertRange(dto.IdWell, new[] { badDto }); + + //assert + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + [Fact] + public async Task ClearAndInsertRange_returns_success() + { + // arrange + var dbset = dbContext.Set(); + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var startTime = DateTimeOffset.UtcNow; + + // act + var result = await client.ClearAndInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dto }); + + // assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + Assert.Equal(2, result.Content); + + var count = dbset.Count(); + Assert.Equal(2, count); + + var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); + Assert.Equal(ProcessMapPlanBase.IdCleared, oldEntity.IdState); + Assert.Equal(1, oldEntity.IdEditor); + Assert.NotNull(oldEntity.Obsolete); + Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); + + var newEntity = dbset.First(p => p.Id != entry.Entity.Id); + Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); + Assert.Equal(1, newEntity.IdAuthor); + Assert.Null(newEntity.IdEditor); + Assert.Null(newEntity.Obsolete); + Assert.Null(newEntity.IdPrevious); + Assert.InRange(newEntity.Creation, startTime, doneTime); + } + + [Fact] + public async Task UpdateOrInsertRange_returns_success() + { + // arrange + var startTime = DateTimeOffset.UtcNow; + + var dbset = dbContext.Set(); + var user = dbContext.Set().First().Adapt(); + user.Surname = "userSurname"; + user.Email = "user@mail.domain"; + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var dtoUpdate = dto.Adapt(); + dtoUpdate.IdWell = 0; + dtoUpdate.Id = entry.Entity.Id; + dtoUpdate.Comment = "nebuchadnezzar"; + dtoUpdate.DeltaPressureLimitMax++; + dtoUpdate.DeltaPressurePlan++; + dtoUpdate.FlowPlan++; + dtoUpdate.FlowLimitMax++; + dtoUpdate.RopPlan++; + dtoUpdate.AxialLoadPlan++; + dtoUpdate.AxialLoadLimitMax++; + dtoUpdate.DepthStart++; + dtoUpdate.DepthEnd++; + dtoUpdate.TopDriveSpeedPlan++; + dtoUpdate.TopDriveSpeedLimitMax++; + dtoUpdate.TopDriveTorquePlan++; + dtoUpdate.TopDriveTorqueLimitMax++; + + var dtoInsert = dtoUpdate.Adapt(); + dtoInsert.Id = 0; + dtoInsert.Comment = "nebuchad"; + dtoInsert.DeltaPressureLimitMax++; + dtoInsert.DeltaPressurePlan++; + dtoInsert.FlowPlan++; + dtoInsert.FlowLimitMax++; + dtoInsert.RopPlan++; + dtoInsert.AxialLoadPlan++; + dtoInsert.AxialLoadLimitMax++; + dtoInsert.DepthStart++; + dtoInsert.DepthEnd++; + dtoInsert.TopDriveSpeedPlan++; + dtoInsert.TopDriveSpeedLimitMax++; + dtoInsert.TopDriveTorquePlan++; + dtoInsert.TopDriveTorqueLimitMax++; + + // act + var result = await client.UpdateOrInsertRange(entity.IdWell, new ProcessMapPlanDrillingDto[] { dtoUpdate, dtoInsert }); + + // assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + Assert.Equal(3, result.Content); + + var count = dbset.Count(); + Assert.Equal(3, count); + + var oldEntity = dbset.First(p => p.Id == entry.Entity.Id); + Assert.Equal(ProcessMapPlanBase.IdStateReplaced, oldEntity.IdState); + Assert.Equal(1, oldEntity.IdEditor); + Assert.NotNull(oldEntity.Obsolete); + Assert.InRange(oldEntity.Obsolete.Value, startTime, doneTime); + + var newEntity = dbset.First(p => p.Comment == dtoUpdate.Comment); + Assert.Equal(ProcessMapPlanBase.IdStateActual, newEntity.IdState); + Assert.Equal(1, newEntity.IdAuthor); + Assert.Null(newEntity.IdEditor); + Assert.Null(newEntity.Obsolete); + Assert.Equal(oldEntity.Id, newEntity.IdPrevious); + Assert.InRange(newEntity.Creation, startTime, doneTime); + + var expected = dtoUpdate.Adapt(); + var excludeProps = new[] { + nameof(ProcessMapPlanDrilling.Id), + nameof(ProcessMapPlanDrilling.IdWell), + nameof(ProcessMapPlanDrilling.Author), + nameof(ProcessMapPlanDrilling.IdAuthor), + nameof(ProcessMapPlanDrilling.Editor), + nameof(ProcessMapPlanDrilling.Creation), + }; + MatchHelper.Match(expected, newEntity!, excludeProps); + } + + [Fact] + public async Task DeleteRange_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var startTime = DateTimeOffset.UtcNow; + + //act + var response = await client.DeleteRange(dto.IdWell, new[] { entry.Entity.Id }); + + //assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(1, response.Content); + + var actual = dbContext + .Set() + .FirstOrDefault(p => p.Id == entry.Entity.Id); + + Assert.NotNull(actual); + Assert.Equal(ProcessMapPlanBase.IdStateDeleted, actual.IdState); + Assert.Equal(1, actual.IdEditor); + Assert.NotNull(actual.Obsolete); + Assert.InRange(actual.Obsolete.Value, startTime, doneTime); + } + + + [Fact] + public async Task Clear_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var entry = dbset.Add(entity); + dbContext.SaveChanges(); + entry.State = EntityState.Detached; + + var startTime = DateTimeOffset.UtcNow; + + //act + var response = await client.Clear(dto.IdWell); + + //assert + var doneTime = DateTimeOffset.UtcNow; + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(1, response.Content); + + var actual = dbContext + .Set() + .FirstOrDefault(p => p.Id == entry.Entity.Id); + + Assert.NotNull(actual); + Assert.Equal(ProcessMapPlanBase.IdCleared, actual.IdState); + Assert.Equal(1, actual.IdEditor); + Assert.NotNull(actual.Obsolete); + Assert.InRange(actual.Obsolete.Value, startTime, doneTime); + } + + [Fact] + public async Task GetDatesChange_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var entity2 = entity.Adapt(); + entity2.Creation = entity.Creation.AddDays(1); + dbset.Add(entity); + dbset.Add(entity2); + dbContext.SaveChanges(); + var timezoneHours = Defaults.Timezone.Hours; + var offset = TimeSpan.FromHours(timezoneHours); + var dates = new[] { entity.Creation, entity2.Creation } + .Select(d => d.ToOffset(offset)) + .Select(d => new DateOnly(d.Year, d.Month, d.Day)); + + //act + var response = await client.GetDatesChange(dto.IdWell); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(2, response.Content.Count()); + Assert.All(response.Content, d => dates.Contains(d)); + } + + [Fact] + public async Task Get_actual_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + dbset.Add(entity); + + var entityDeleted = entity.Adapt(); + entityDeleted.Creation = entity.Creation.AddDays(-1); + entityDeleted.Obsolete = entity.Creation; + entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; + entityDeleted.IdEditor = 1; + entityDeleted.Comment = "nothing"; + dbset.Add(entityDeleted); + + dbContext.SaveChanges(); + + var response = await client.Get(dto.IdWell); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Single(response.Content); + + var actual = response.Content.First()!; + + var expected = entity.Adapt()!; + var excludeProps = new[] { + nameof(ProcessMapPlanDrillingDto.Id), + }; + MatchHelper.Match(expected, actual, excludeProps); + } + + [Fact] + public async Task Get_at_moment_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + var now = DateTimeOffset.UtcNow; + var entityDeleted = entity.Adapt(); + entityDeleted.Creation = now; + entityDeleted.Obsolete = now.AddMinutes(1); + entityDeleted.IdState = ProcessMapPlanBase.IdStateDeleted; + entityDeleted.IdEditor = 1; + entityDeleted.Comment = "nothing"; + dbset.Add(entityDeleted); + + var entityDeleted2 = entity.Adapt(); + entityDeleted2.Creation = now.AddMinutes(1); + entityDeleted2.Obsolete = now.AddMinutes(2); + entityDeleted2.IdState = ProcessMapPlanBase.IdStateDeleted; + entityDeleted2.IdEditor = 1; + entityDeleted2.Comment = "nothing"; + dbset.Add(entityDeleted2); + + dbContext.SaveChanges(); + + //act + var response = await client.Get(dto.IdWell, now.AddMinutes(0.5)); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Single(response.Content); + } + + [Fact] + public async Task Get_by_updated_from_returns_success() + { + //arrange + var dbset = dbContext.Set(); + dbset.Add(entity); + + var entity2 = entity.Adapt(); + entity2.Obsolete = DateTimeOffset.UtcNow; + dbset.Add(entity2); + + dbContext.SaveChanges(); + + //act + var response = await client.Get(Defaults.RemoteUid, DateTimeOffset.UtcNow.AddHours(-1)); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(2, response.Content.Count()); + } + + [Fact] + public async Task Get_updated_returns_success() + { + //arrange + var dbset = dbContext.Set(); + + dbset.Add(entity); + + var entity2 = entity.Adapt(); + entity2.Creation = entity.Creation.AddHours(1); + entity2.Comment = "IdWellSectionType = 2"; + dbset.Add(entity2); + + var entity3 = entity.Adapt(); + entity3.Obsolete = entity.Creation.AddHours(1); + entity3.Comment = "IdWellSectionType = 3"; + dbset.Add(entity3); + + dbContext.SaveChanges(); + + var timezoneHours = Defaults.Timezone.Hours; + var offset = TimeSpan.FromHours(timezoneHours); + var updateFrom = entity.Creation.ToOffset(offset).AddHours(0.5); + + //act + var request = new ProcessMapPlanBaseRequest + { + UpdateFrom = updateFrom, + }; + var response = await client.Get(dto.IdWell); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(2, response.Content.Count()); + + var actual = response.Content + .First(p => p.Comment == entity2.Comment); + + var expected = entity2.Adapt(); + var excludeProps = new[] { + nameof(ProcessMapPlanDrillingDto.Id), + }; + MatchHelper.Match(expected, actual, excludeProps); + } + + [Fact] + public async Task Parse_returns_success() + { + //arrange + const string fileName = "ProcessMapPlanDrillingValid.xlsx"; + var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); + + var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); + + //act + var response = await client.Parse(IdWell, streamPart); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var parserResult = response.Content; + + Assert.NotNull(parserResult); + Assert.Single(parserResult.Item); + Assert.True(parserResult.IsValid); + + var row = parserResult.Item.First(); + var dtoActual = row.Item; + + Assert.True(row.IsValid); + + var excludeProps = new[] { nameof(ProcessMapPlanDrillingDto.IdWell) }; + MatchHelper.Match(dto, dtoActual, excludeProps); + } + + [Fact] + public async Task Parse_returns_success_for_result_with_warnings() + { + //arrange + const string fileName = "ProcessMapPlanDrillingInvalid.xlsx"; + var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); + + var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); + + //act + var response = await client.Parse(IdWell, streamPart); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var parserResult = response.Content; + + Assert.NotNull(parserResult); + Assert.False(parserResult.IsValid); + Assert.Single(parserResult.Warnings); + Assert.Single(parserResult.Item); + + var row = parserResult.Item.First(); + + Assert.False(row.IsValid); + Assert.Equal(2, row.Warnings.Count()); + } +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs index a3667662..ed2d87a0 100644 --- a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs +++ b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs @@ -11,6 +11,8 @@ namespace AsbCloudWebApi.IntegrationTests.Data Hours = 1 }; + public static string RemoteUid = "555-555-555"; + public static Deposit[] Deposits => new Deposit[] { new() @@ -39,7 +41,7 @@ namespace AsbCloudWebApi.IntegrationTests.Data Timezone = Timezone, Telemetry = new Telemetry { - RemoteUid = "555-555-555", + RemoteUid = RemoteUid, TimeZone = Timezone }, RelationCompaniesWells = new RelationCompanyWell[]