forked from ddrilling/AsbCloudServer
refactor integrationTests
This commit is contained in:
parent
6178061b49
commit
9a2762ba60
@ -10,31 +10,14 @@ namespace AsbCloudWebApi.IntegrationTests;
|
|||||||
|
|
||||||
public abstract class BaseIntegrationTest : IClassFixture<WebAppFactoryFixture>
|
public abstract class BaseIntegrationTest : IClassFixture<WebAppFactoryFixture>
|
||||||
{
|
{
|
||||||
private readonly IServiceScope scope;
|
protected readonly IServiceScope scope;
|
||||||
private readonly HttpClient httpClient;
|
|
||||||
|
|
||||||
protected readonly IAsbCloudDbContext dbContext;
|
protected readonly IAsbCloudDbContext dbContext;
|
||||||
|
protected readonly WebAppFactoryFixture factory;
|
||||||
|
|
||||||
protected IAdminDepositClient adminDepositClient;
|
protected BaseIntegrationTest(WebAppFactoryFixture factory)
|
||||||
|
|
||||||
protected BaseIntegrationTest(WebAppFactoryFixture factory)
|
|
||||||
{
|
{
|
||||||
scope = factory.Services.CreateScope();
|
scope = factory.Services.CreateScope();
|
||||||
httpClient = factory.CreateClient();
|
|
||||||
|
|
||||||
dbContext = scope.ServiceProvider.GetRequiredService<IAsbCloudDbContext>();
|
dbContext = scope.ServiceProvider.GetRequiredService<IAsbCloudDbContext>();
|
||||||
|
this.factory = factory;
|
||||||
var jwtToken = ApiTokenHelper.GetAdminUserToken();
|
}
|
||||||
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken);
|
|
||||||
|
|
||||||
var jsonSerializerOptions = new JsonSerializerOptions
|
|
||||||
{
|
|
||||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
|
||||||
PropertyNameCaseInsensitive = true
|
|
||||||
};
|
|
||||||
|
|
||||||
var refitSettings = new RefitSettings(new SystemTextJsonContentSerializer(jsonSerializerOptions));
|
|
||||||
|
|
||||||
adminDepositClient = RestService.For<IAdminDepositClient>(httpClient, refitSettings);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -24,4 +24,4 @@ public interface IAdminDepositClient
|
|||||||
|
|
||||||
[Delete(BaseRoute + "/{id}")]
|
[Delete(BaseRoute + "/{id}")]
|
||||||
Task<IApiResponse<int>> DeleteAsync(int id);
|
Task<IApiResponse<int>> DeleteAsync(int id);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
using AsbCloudApp.Data.ProcessMapPlan;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Refit;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.IntegrationTests.Clients;
|
||||||
|
|
||||||
|
public interface IProcessMapPlanDrillingClient
|
||||||
|
{
|
||||||
|
private const string BaseRoute = "/api/well/{idWell}/ProcessMapPlanDrilling";
|
||||||
|
|
||||||
|
[Post(BaseRoute)]
|
||||||
|
Task<IApiResponse<int>> InsertRangeAsync(int idWell, IEnumerable<ProcessMapPlanDrillingDto> dtos);
|
||||||
|
|
||||||
|
[Post($"{BaseRoute}/replace")]
|
||||||
|
Task<IApiResponse<int>> ClearAndInsertRangeAsync(int idWell, IEnumerable<ProcessMapPlanDrillingDto> dtos);
|
||||||
|
|
||||||
|
[Delete(BaseRoute)]
|
||||||
|
Task<IApiResponse<int>> DeleteRangeAsync(int idWell, IEnumerable<int> ids);
|
||||||
|
|
||||||
|
[Get(BaseRoute)]
|
||||||
|
Task<IApiResponse<IEnumerable<ProcessMapPlanDrillingDto>>> GetAsync(int idWell, [FromQuery] ProcessMapPlanBaseRequest request);
|
||||||
|
|
||||||
|
[Get($"{BaseRoute}/changeLog")]
|
||||||
|
Task<IApiResponse<IEnumerable<ProcessMapPlanDrillingDto>>> GetChangeLogAsync(int idWell, [FromQuery] DateOnly? date);
|
||||||
|
|
||||||
|
[Get($"{BaseRoute}/dates")]
|
||||||
|
Task<IApiResponse<IEnumerable<DateOnly>>> GetDatesChangeAsync(int idWell);
|
||||||
|
|
||||||
|
[Put(BaseRoute)]
|
||||||
|
Task<IApiResponse<int>> UpdateRangeAsync(int idWell, IEnumerable<ProcessMapPlanDrillingDto> dtos);
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using AsbCloudApp.Data;
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudWebApi.IntegrationTests.Clients;
|
||||||
using AsbCloudWebApi.IntegrationTests.TestFakers;
|
using AsbCloudWebApi.IntegrationTests.TestFakers;
|
||||||
using Mapster;
|
using Mapster;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
@ -9,19 +10,22 @@ namespace AsbCloudWebApi.IntegrationTests.Controllers;
|
|||||||
|
|
||||||
public class AdminDepositControllerTests : BaseIntegrationTest
|
public class AdminDepositControllerTests : BaseIntegrationTest
|
||||||
{
|
{
|
||||||
public AdminDepositControllerTests(WebAppFactoryFixture factory)
|
protected IAdminDepositClient client;
|
||||||
: base(factory)
|
|
||||||
{
|
public AdminDepositControllerTests(WebAppFactoryFixture factory)
|
||||||
}
|
: base(factory)
|
||||||
|
{
|
||||||
|
client = factory.GetAuthorizedHttpClient<IAdminDepositClient>();
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task InsertAsync_ReturnsSuccess_WhenNewItemIsValid()
|
public async Task InsertAsync_ReturnsSuccess_WhenNewItemIsValid()
|
||||||
{
|
{
|
||||||
//arrange
|
//arrange
|
||||||
var expectedDto = DepositTestFaker.GetDeposit().Adapt<DepositBaseDto>();
|
var expectedDto = EntitiesFaker.Deposit.Generate().Adapt<DepositBaseDto>();
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await adminDepositClient.InsertAsync(expectedDto);
|
var response = await client.InsertAsync(expectedDto);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
@ -38,10 +42,10 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
public async Task InsertRangeAsync_ReturnsSuccess_WhenAllNewItemsIsValid()
|
public async Task InsertRangeAsync_ReturnsSuccess_WhenAllNewItemsIsValid()
|
||||||
{
|
{
|
||||||
//arrange
|
//arrange
|
||||||
var dto = DepositTestFaker.GetDeposit().Adapt<DepositBaseDto>();
|
var dto = EntitiesFaker.Deposit.Generate().Adapt<DepositBaseDto>();
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var responce = await adminDepositClient.InsertRangeAsync(new[] { dto });
|
var responce = await client.InsertRangeAsync(new[] { dto });
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.OK, responce.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, responce.StatusCode);
|
||||||
@ -58,10 +62,10 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
public async Task UpdateAsync_ReturnsBadRequest_WhenUpdatedItemHasInvalidId()
|
public async Task UpdateAsync_ReturnsBadRequest_WhenUpdatedItemHasInvalidId()
|
||||||
{
|
{
|
||||||
//arrange
|
//arrange
|
||||||
var dto = DepositTestFaker.GetDeposit().Adapt<DepositBaseDto>();
|
var dto = EntitiesFaker.Deposit.Generate().Adapt<DepositBaseDto>();
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await adminDepositClient.UpdateAsync(dto);
|
var response = await client.UpdateAsync(dto);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
|
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
|
||||||
@ -71,8 +75,8 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
public async Task UpdateAsync_ReturnsSuccess_WhenUpdatedItemIsValid()
|
public async Task UpdateAsync_ReturnsSuccess_WhenUpdatedItemIsValid()
|
||||||
{
|
{
|
||||||
//arrange
|
//arrange
|
||||||
var dto = DepositTestFaker.GetDeposit().Adapt<DepositBaseDto>();
|
var dto = EntitiesFaker.Deposit.Generate().Adapt<DepositBaseDto>();
|
||||||
var insertResponse = await adminDepositClient.InsertAsync(dto);
|
var insertResponse = await client.InsertAsync(dto);
|
||||||
|
|
||||||
dto.Id = insertResponse.Content;
|
dto.Id = insertResponse.Content;
|
||||||
dto.Caption = "Test";
|
dto.Caption = "Test";
|
||||||
@ -85,7 +89,7 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
};
|
};
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await adminDepositClient.UpdateAsync(dto);
|
var response = await client.UpdateAsync(dto);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
@ -101,22 +105,17 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
public async Task GetOrDefaultAsync_ReturnsSuccess_WhenIdIsValid()
|
public async Task GetOrDefaultAsync_ReturnsSuccess_WhenIdIsValid()
|
||||||
{
|
{
|
||||||
//arrange
|
//arrange
|
||||||
var dto = DepositTestFaker.GetDeposit().Adapt<DepositBaseDto>();
|
var entity = await dbContext.Deposits.FirstAsync();
|
||||||
var insertResponse = await adminDepositClient.InsertAsync(dto);
|
var expected = entity.Adapt<DepositBaseDto>();
|
||||||
var id = insertResponse.Content;
|
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await adminDepositClient.GetOrDefaultAsync(id);
|
var response = await client.GetOrDefaultAsync(entity.Id);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
Assert.NotNull(response.Content);
|
Assert.NotNull(response.Content);
|
||||||
|
|
||||||
var entity = await dbContext.Deposits.FirstOrDefaultAsync(d => d.Id == response.Content.Id);
|
MatchHelper.Match(expected, response.Content);
|
||||||
var deposit = entity?.Adapt<DepositBaseDto>();
|
|
||||||
|
|
||||||
var excludeProps = new[] { nameof(DepositBaseDto.Id) };
|
|
||||||
MatchHelper.Match(dto, deposit, excludeProps);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -126,7 +125,7 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
const int id = 0;
|
const int id = 0;
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var responce = await adminDepositClient.GetOrDefaultAsync(id);
|
var responce = await client.GetOrDefaultAsync(id);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.NoContent, responce.StatusCode);
|
Assert.Equal(HttpStatusCode.NoContent, responce.StatusCode);
|
||||||
@ -136,7 +135,7 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
public async Task GetAllAsync_ReturnsSuccess()
|
public async Task GetAllAsync_ReturnsSuccess()
|
||||||
{
|
{
|
||||||
//act
|
//act
|
||||||
var response = await adminDepositClient.GetAllAsync();
|
var response = await client.GetAllAsync();
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
@ -156,12 +155,12 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
public async Task DeleteAsync_ReturnsSuccess_WhenIdIsValid()
|
public async Task DeleteAsync_ReturnsSuccess_WhenIdIsValid()
|
||||||
{
|
{
|
||||||
//arrange
|
//arrange
|
||||||
var dto = DepositTestFaker.GetDeposit().Adapt<DepositBaseDto>();
|
var dto = EntitiesFaker.Deposit.Generate().Adapt<DepositBaseDto>();
|
||||||
var insertResponse = await adminDepositClient.InsertAsync(dto);
|
var insertResponse = await client.InsertAsync(dto);
|
||||||
var id = insertResponse.Content;
|
var id = insertResponse.Content;
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await adminDepositClient.DeleteAsync(id);
|
var response = await client.DeleteAsync(id);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
@ -178,7 +177,7 @@ public class AdminDepositControllerTests : BaseIntegrationTest
|
|||||||
const int id = 0;
|
const int id = 0;
|
||||||
|
|
||||||
//act
|
//act
|
||||||
var response = await adminDepositClient.DeleteAsync(id);
|
var response = await client.DeleteAsync(id);
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
|
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
|
||||||
|
@ -0,0 +1,82 @@
|
|||||||
|
using AsbCloudApp.Data.ProcessMapPlan;
|
||||||
|
using AsbCloudDb.Model.ProcessMaps;
|
||||||
|
using AsbCloudWebApi.IntegrationTests.Clients;
|
||||||
|
using Mapster;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Net;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.IntegrationTests.Controllers;
|
||||||
|
|
||||||
|
public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
|
||||||
|
{
|
||||||
|
private IProcessMapPlanDrillingClient client;
|
||||||
|
|
||||||
|
readonly ProcessMapPlanDrillingDto dto = new (){
|
||||||
|
Id = 0,
|
||||||
|
IdAuthor = 0,
|
||||||
|
IdEditor = null,
|
||||||
|
Creation = new(),
|
||||||
|
Obsolete = null,
|
||||||
|
IdState = 0,
|
||||||
|
IdPrevious = null,
|
||||||
|
|
||||||
|
IdWell = 1,
|
||||||
|
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 = "это тестовая запись",
|
||||||
|
};
|
||||||
|
|
||||||
|
public ProcessMapPlanDrillingControllerTest(WebAppFactoryFixture factory) : base(factory)
|
||||||
|
{
|
||||||
|
client = factory.GetAuthorizedHttpClient<IProcessMapPlanDrillingClient>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task InsertRangeAsync_ReturnsSuccess_WhenNewItemIsValid()
|
||||||
|
{
|
||||||
|
//arrange
|
||||||
|
var expected = dto;
|
||||||
|
|
||||||
|
//act
|
||||||
|
var response = await client.InsertRangeAsync(dto.IdWell, new[] { expected });
|
||||||
|
|
||||||
|
//assert
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
Assert.Equal(1, response.Content);
|
||||||
|
|
||||||
|
var entity = await dbContext.Set<ProcessMapPlanDrilling>()
|
||||||
|
.Where(p => p.AxialLoadPlan == dto.AxialLoadPlan)
|
||||||
|
.Where(p => p.AxialLoadLimitMax == dto.AxialLoadLimitMax)
|
||||||
|
.Where(p => p.Comment == dto.Comment)
|
||||||
|
.Where(p => p.IdWell == dto.IdWell)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
Assert.NotNull(entity);
|
||||||
|
|
||||||
|
var actual = entity.Adapt<ProcessMapPlanDrillingDto>();
|
||||||
|
|
||||||
|
var excludeProps = new[] {
|
||||||
|
nameof(ProcessMapPlanDrillingDto.Id),
|
||||||
|
nameof(ProcessMapPlanDrillingDto.IdAuthor),
|
||||||
|
nameof(ProcessMapPlanDrillingDto.Creation),
|
||||||
|
};
|
||||||
|
MatchHelper.Match(expected, actual, excludeProps);
|
||||||
|
}
|
||||||
|
}
|
63
AsbCloudWebApi.IntegrationTests/Data/Defaults.cs
Normal file
63
AsbCloudWebApi.IntegrationTests/Data/Defaults.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
using AsbCloudDb.Model;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.IntegrationTests.Data
|
||||||
|
{
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2211:Поля, не являющиеся константами, не должны быть видимыми", Justification = "<Ожидание>")]
|
||||||
|
public static class Defaults
|
||||||
|
{
|
||||||
|
public static Deposit[] Deposits = new Deposit[] {
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
Caption = "Deposit1",
|
||||||
|
Latitude = 10,
|
||||||
|
Longitude = 20,
|
||||||
|
Timezone = new SimpleTimezone{
|
||||||
|
Hours = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static Cluster[] Clusters = new Cluster[] {
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
IdDeposit = Deposits[0].Id,
|
||||||
|
Caption = "Cluster1",
|
||||||
|
Latitude = 10,
|
||||||
|
Longitude = 20,
|
||||||
|
Timezone = new SimpleTimezone{
|
||||||
|
Hours = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static Well[] Wells = new Well[] {
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
IdCluster = Clusters[0].Id,
|
||||||
|
IdWellType = 1,
|
||||||
|
IdState = 1,
|
||||||
|
Caption = "Well1",
|
||||||
|
Latitude = 10,
|
||||||
|
Longitude = 20,
|
||||||
|
IdTelemetry = null,
|
||||||
|
Timezone = new SimpleTimezone{
|
||||||
|
Hours = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static RelationCompanyWell[] RelationsCompanyWell = new RelationCompanyWell[]
|
||||||
|
{
|
||||||
|
new(){IdCompany= 1, IdWell = Wells[0].Id},
|
||||||
|
};
|
||||||
|
|
||||||
|
public static RelationUserUserRole[] RelationsUserUserRole = new RelationUserUserRole[]
|
||||||
|
{
|
||||||
|
new(){ IdUserRole= 1, IdUser = 1}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,25 +0,0 @@
|
|||||||
using AsbCloudDb.Model;
|
|
||||||
using Bogus;
|
|
||||||
|
|
||||||
namespace AsbCloudWebApi.IntegrationTests.TestFakers;
|
|
||||||
|
|
||||||
public static class DepositTestFaker
|
|
||||||
{
|
|
||||||
public static Deposit GetDeposit() =>
|
|
||||||
GetDepositFaker().Generate();
|
|
||||||
|
|
||||||
public static IEnumerable<Deposit> GetDeposits(int count) =>
|
|
||||||
GetDepositFaker().Generate(count);
|
|
||||||
|
|
||||||
private static Faker<Deposit> GetDepositFaker() =>
|
|
||||||
new Faker<Deposit>()
|
|
||||||
.RuleFor(d => d.Id, 0)
|
|
||||||
.RuleFor(d => d.Caption, f => f.Random.String2(1, 50))
|
|
||||||
.RuleFor(d => d.Latitude, f => f.Random.Int(-90, 90))
|
|
||||||
.RuleFor(d => d.Longitude, f => f.Random.Int(-180, 180))
|
|
||||||
.RuleFor(d => d.Timezone, f => new SimpleTimezone
|
|
||||||
{
|
|
||||||
Hours = f.Random.Int(1, 12),
|
|
||||||
IsOverride = f.Random.Bool()
|
|
||||||
});
|
|
||||||
}
|
|
40
AsbCloudWebApi.IntegrationTests/TestFakers/EntitiesFaker.cs
Normal file
40
AsbCloudWebApi.IntegrationTests/TestFakers/EntitiesFaker.cs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
using AsbCloudDb.Model;
|
||||||
|
using Bogus;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.IntegrationTests.TestFakers;
|
||||||
|
|
||||||
|
public static class EntitiesFaker
|
||||||
|
{
|
||||||
|
public static Faker<Deposit> Deposit { get; } = new Faker<Deposit>()
|
||||||
|
.RuleFor(d => d.Id, 0)
|
||||||
|
.RuleFor(d => d.Caption, f => f.Random.String2(1, 50))
|
||||||
|
.RuleFor(d => d.Latitude, f => f.Random.Double(-90, 90))
|
||||||
|
.RuleFor(d => d.Longitude, f => f.Random.Double(-180, 180))
|
||||||
|
.RuleFor(d => d.Timezone, f => new SimpleTimezone
|
||||||
|
{
|
||||||
|
Hours = f.Random.Int(1, 12),
|
||||||
|
IsOverride = f.Random.Bool()
|
||||||
|
});
|
||||||
|
|
||||||
|
public static Faker<Cluster> Cluster { get; } = new Faker<Cluster>()
|
||||||
|
.RuleFor(d => d.Id, 0)
|
||||||
|
.RuleFor(d => d.Caption, f => f.Random.String2(1, 50))
|
||||||
|
.RuleFor(d => d.Latitude, f => f.Random.Double(-90, 90))
|
||||||
|
.RuleFor(d => d.Longitude, f => f.Random.Double(-180, 180))
|
||||||
|
.RuleFor(d => d.Timezone, f => new SimpleTimezone
|
||||||
|
{
|
||||||
|
Hours = f.Random.Int(1, 12),
|
||||||
|
IsOverride = f.Random.Bool()
|
||||||
|
});
|
||||||
|
|
||||||
|
public static Faker<Well> Well { get; } = new Faker<Well>()
|
||||||
|
.RuleFor(d => d.Id, 0)
|
||||||
|
.RuleFor(d => d.Caption, f => f.Random.String2(1, 50))
|
||||||
|
.RuleFor(d => d.Latitude, f => f.Random.Double(-90, 90))
|
||||||
|
.RuleFor(d => d.Longitude, f => f.Random.Double(-180, 180))
|
||||||
|
.RuleFor(d => d.Timezone, f => new SimpleTimezone
|
||||||
|
{
|
||||||
|
Hours = f.Random.Int(1, 12),
|
||||||
|
IsOverride = f.Random.Bool()
|
||||||
|
});
|
||||||
|
}
|
@ -6,6 +6,10 @@ using Microsoft.AspNetCore.Mvc.Testing;
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using ProtoBuf.Serializers;
|
||||||
|
using Refit;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Text.Json;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace AsbCloudWebApi.IntegrationTests;
|
namespace AsbCloudWebApi.IntegrationTests;
|
||||||
@ -13,12 +17,20 @@ namespace AsbCloudWebApi.IntegrationTests;
|
|||||||
public class WebAppFactoryFixture : WebApplicationFactory<Startup>,
|
public class WebAppFactoryFixture : WebApplicationFactory<Startup>,
|
||||||
IAsyncLifetime
|
IAsyncLifetime
|
||||||
{
|
{
|
||||||
|
private static readonly JsonSerializerOptions jsonSerializerOptions = new()
|
||||||
|
{
|
||||||
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||||
|
PropertyNameCaseInsensitive = true
|
||||||
|
};
|
||||||
|
|
||||||
|
private static readonly RefitSettings refitSettings = new RefitSettings(new SystemTextJsonContentSerializer(jsonSerializerOptions));
|
||||||
|
|
||||||
protected override void ConfigureWebHost(IWebHostBuilder builder)
|
protected override void ConfigureWebHost(IWebHostBuilder builder)
|
||||||
{
|
{
|
||||||
var configuration = new ConfigurationBuilder()
|
var configuration = new ConfigurationBuilder()
|
||||||
.AddJsonFile("appsettings.json")
|
.AddJsonFile("appsettings.json")
|
||||||
.Build();
|
.Build();
|
||||||
var connectionString = configuration.GetConnectionString("TestConnection");
|
var connectionString = configuration.GetConnectionString("TestConnection")!;
|
||||||
|
|
||||||
builder.ConfigureServices(services =>
|
builder.ConfigureServices(services =>
|
||||||
{
|
{
|
||||||
@ -37,19 +49,41 @@ public class WebAppFactoryFixture : WebApplicationFactory<Startup>,
|
|||||||
using var scope = Services.CreateScope();
|
using var scope = Services.CreateScope();
|
||||||
var scopedServices = scope.ServiceProvider;
|
var scopedServices = scope.ServiceProvider;
|
||||||
var dbContext = scopedServices.GetRequiredService<AsbCloudDbContext>();
|
var dbContext = scopedServices.GetRequiredService<AsbCloudDbContext>();
|
||||||
|
dbContext.Database.EnsureDeleted();
|
||||||
dbContext.Database.EnsureCreatedAndMigrated();
|
dbContext.Database.EnsureCreatedAndMigrated();
|
||||||
|
await FillBaseDatasets(dbContext);
|
||||||
dbContext.Deposits.AddRange(DepositTestFaker.GetDeposits(15));
|
|
||||||
await dbContext.SaveChangesAsync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public new async Task DisposeAsync()
|
private static async Task FillBaseDatasets(AsbCloudDbContext dbContext)
|
||||||
|
{
|
||||||
|
dbContext.AddRange(Data.Defaults.Deposits);
|
||||||
|
dbContext.AddRange(Data.Defaults.Clusters);
|
||||||
|
dbContext.AddRange(Data.Defaults.Wells);
|
||||||
|
dbContext.AddRange(Data.Defaults.RelationsCompanyWell);
|
||||||
|
await dbContext.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public new async Task DisposeAsync()
|
||||||
{
|
{
|
||||||
using var scope = Services.CreateScope();
|
using var scope = Services.CreateScope();
|
||||||
var scopedServices = scope.ServiceProvider;
|
var scopedServices = scope.ServiceProvider;
|
||||||
var dbContext = scopedServices.GetRequiredService<AsbCloudDbContext>();
|
var dbContext = scopedServices.GetRequiredService<AsbCloudDbContext>();
|
||||||
|
|
||||||
await dbContext.Database.EnsureDeletedAsync();
|
await dbContext.Database.EnsureDeletedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HttpClient GetAuthorizedHttpClient()
|
||||||
|
{
|
||||||
|
var httpClient = CreateClient();
|
||||||
|
var jwtToken = ApiTokenHelper.GetAdminUserToken();
|
||||||
|
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken);
|
||||||
|
return httpClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetAuthorizedHttpClient<T>()
|
||||||
|
{
|
||||||
|
var httpClient = GetAuthorizedHttpClient();
|
||||||
|
return RestService.For<T>(httpClient, refitSettings);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
2
AsbCloudWebApi.IntegrationTests/readme.md
Normal file
2
AsbCloudWebApi.IntegrationTests/readme.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Статья от ms https://learn.microsoft.com/ru-ru/aspnet/core/test/integration-tests?view=aspnetcore-6.0
|
||||||
|
refit https://github.com/reactiveui/refit
|
Loading…
Reference in New Issue
Block a user