forked from ddrilling/AsbCloudServer
133 lines
5.0 KiB
C#
133 lines
5.0 KiB
C#
using AsbCloudApp.Data;
|
||
using AsbCloudApp.Data.WellOperation;
|
||
using AsbCloudApp.Repositories;
|
||
using AsbCloudApp.Requests;
|
||
using AsbCloudApp.Services;
|
||
using AsbCloudDb.Model;
|
||
using AsbCloudInfrastructure.Services.WellOperationService.WellOperationService;
|
||
using Mapster;
|
||
using NSubstitute;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using Xunit;
|
||
|
||
namespace AsbCloudWebApi.Tests.Services;
|
||
public class WellOperationServiceTest
|
||
{
|
||
private const int idWell = 1;
|
||
private readonly IWellOperationService wellOperationServiceMock = Substitute.For<IWellOperationService>();
|
||
private readonly IWellOperationRepository wellOperationRepositoryMock = Substitute.For<IWellOperationRepository>();
|
||
private readonly IWellService wellServiceMock = Substitute.For<IWellService>();
|
||
private readonly IWellOperationCategoryRepository wellOperationCategoryRepositoryMock = Substitute.For<IWellOperationCategoryRepository>();
|
||
|
||
private readonly SimpleTimezoneDto timeZone = new SimpleTimezoneDto()
|
||
{
|
||
Hours = 5,
|
||
};
|
||
private readonly WellOperationBaseDto wellOperation = new WellOperationBaseDto()
|
||
{
|
||
IdWell = idWell,
|
||
Id = 1,
|
||
IdType = WellOperation.IdOperationTypeFact,
|
||
DepthStart = 1,
|
||
DepthEnd = 2,
|
||
DateStart = DateTimeOffset.UtcNow,
|
||
DurationHours = 3,
|
||
IdCategory = WellOperationCategory.NonProductiveTimeSubIds.FirstOrDefault(),
|
||
IdWellSectionType = 1
|
||
};
|
||
private readonly List<WellOperationBaseDto> wellOperations = new List<WellOperationBaseDto>();
|
||
|
||
private readonly IEnumerable<PlanFactPredictBase<WellOperationDto>> tvds = new List<PlanFactPredictBase<WellOperationDto>>()
|
||
{
|
||
new PlanFactPredictBase<WellOperationDto>()
|
||
{
|
||
Fact = new WellOperationDto(),
|
||
Plan = new WellOperationDto(),
|
||
Predict = new WellOperationDto()
|
||
}
|
||
};
|
||
|
||
|
||
public WellOperationServiceTest()
|
||
{
|
||
//wellOperationServiceMock.GetTvdAsync(Arg.Any<int>(), Arg.Any<CancellationToken>())
|
||
// .Returns(tvds);
|
||
wellServiceMock
|
||
.GetTimezone(Arg.Any<int>())
|
||
.Returns(timeZone);
|
||
|
||
//фактическая операция, у которой нет плановой для сопоставления
|
||
var wellOperation1 = wellOperation.Adapt<WellOperationBaseDto>();
|
||
|
||
//фактическая операция, у которой есть плановая для сопоставления
|
||
var wellOperation2 = wellOperation1.Adapt<WellOperationBaseDto>();
|
||
wellOperation2.Id = wellOperation1.Id + 1;
|
||
wellOperation2.IdPlan = wellOperation1.Id;
|
||
wellOperation2.IdType = WellOperation.IdOperationTypeFact;
|
||
wellOperation2.DateStart = wellOperation1.DateStart.AddDays(1);
|
||
|
||
//плановая операция
|
||
var wellOperation3 = wellOperation1.Adapt<WellOperationBaseDto>();
|
||
wellOperation3.Id = wellOperation1.Id + 2;
|
||
wellOperation3.IdType = WellOperation.IdOperationTypePlan;
|
||
wellOperation3.DateStart = wellOperation1.DateStart.AddDays(2);
|
||
|
||
wellOperations.Add(wellOperation1);
|
||
wellOperations.Add(wellOperation2);
|
||
wellOperations.Add(wellOperation3);
|
||
|
||
wellOperationRepositoryMock.GetAll(Arg.Any<WellOperationRepositoryRequest>(), Arg.Any<CancellationToken>())
|
||
.Returns(wellOperations);
|
||
wellOperationServiceMock = new WellOperationService(wellServiceMock, wellOperationRepositoryMock, wellOperationCategoryRepositoryMock);
|
||
}
|
||
|
||
[Fact]
|
||
public async Task GetTvdAsync_ShouldReturn_Success()
|
||
{
|
||
var factOperations = wellOperations
|
||
.Where(o => o.IdType == WellOperation.IdOperationTypeFact);
|
||
|
||
//act
|
||
var data = await wellOperationServiceMock.GetTvdAsync(idWell, CancellationToken.None);
|
||
|
||
var actualFactNptHours = data
|
||
.Where(o => o.Fact != null)
|
||
.Select(o => o.Fact!.NptHours)
|
||
.ToArray();
|
||
|
||
var factOperationsWithNpt = factOperations
|
||
.Where(o => WellOperationCategory.NonProductiveTimeSubIds.Contains(o.IdCategory));
|
||
|
||
var expectedFactNptHours = factOperations
|
||
.Select(dto =>
|
||
{
|
||
var nptHours = factOperationsWithNpt
|
||
.Where(o => o.DateStart <= dto.DateStart)
|
||
.Sum(e => e.DurationHours);
|
||
return nptHours;
|
||
});
|
||
|
||
var actualFactDays = data
|
||
.Where(o => o.Fact != null)
|
||
.Select(o => o.Fact!.Day)
|
||
.ToArray();
|
||
|
||
var firstWellOperation = factOperations.MinBy(e => e.DateStart)!;
|
||
|
||
var expectedFactDays = factOperations
|
||
.Select(dto =>
|
||
{
|
||
var day = (dto.DateStart - firstWellOperation.DateStart).TotalDays;
|
||
return day;
|
||
});
|
||
|
||
//assert
|
||
Assert.Equal(expectedFactNptHours, actualFactNptHours);
|
||
Assert.Equal(expectedFactDays, actualFactDays);
|
||
}
|
||
}
|