добавлены patch

This commit is contained in:
gorbenko.pavel
2026-07-27 09:15:28 +05:00
parent 5928377465
commit 8f92a9646d
24 changed files with 217 additions and 25 deletions
@@ -66,6 +66,33 @@ public sealed class RequestTypeServiceTests(PostgresDatabaseFixture fixture) : I
result.IsFailed.ShouldBeTrue();
}
[Fact(DisplayName = "Патч типа заявки меняет только переданное поле, остальные остаются прежними")]
public async Task PatchAsync_UpdatesOnlyProvidedFields()
{
// Arrange
var created = await _service.CreateAsync(new CreateRequestTypeRequest("Original name", "/original"), CancellationToken.None);
// Action
var patched = await _service.PatchAsync(
created.Value.Id, new PatchRequestTypeRequest(Name: "Patched name", PageUrl: null), CancellationToken.None);
// Assert
patched.IsSuccess.ShouldBeTrue();
patched.Value.Name.ShouldBe("Patched name");
patched.Value.PageUrl.ShouldBe("/original");
}
[Fact(DisplayName = "Патч несуществующего типа заявки возвращает неуспешный результат")]
public async Task PatchAsync_UnknownId_ReturnsFailedResult()
{
// Action
var result = await _service.PatchAsync(
999999, new PatchRequestTypeRequest(Name: "X", PageUrl: null), CancellationToken.None);
// Assert
result.IsFailed.ShouldBeTrue();
}
[Fact(DisplayName = "Удаление типа заявки убирает его из базы")]
public async Task DeleteAsync_RemovesEntity()
{
@@ -106,6 +106,29 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
updated.Value.RequiresControl.ShouldBeTrue();
}
[Fact(DisplayName = "Патч маршрута меняет только переданные поля, остальные остаются прежними")]
public async Task PatchAsync_UpdatesOnlyProvidedFields()
{
// Arrange
var requestTypeId = await CreateRequestTypeAsync("Patch route request");
var created = await _service.CreateAsync(
new CreateTemplateRouteRequest(RouteType.Sequential, requestTypeId, DepartmentId, CompanyId, ByProject: false, RequiresControl: false),
CancellationToken.None);
// Action
var patched = await _service.PatchAsync(
created.Value.Id,
new PatchTemplateRouteRequest(RouteType.Parallel, DepartmentId: null, CompanyId: null, ByProject: null, RequiresControl: true),
CancellationToken.None);
// Assert
patched.IsSuccess.ShouldBeTrue();
patched.Value.RouteType.ShouldBe(RouteType.Parallel);
patched.Value.RequiresControl.ShouldBeTrue();
patched.Value.CompanyId.ShouldBe(CompanyId);
patched.Value.DepartmentId.ShouldBe(DepartmentId);
}
[Fact(DisplayName = "Удаление маршрута убирает его из базы")]
public async Task DeleteAsync_RemovesEntity()
{
@@ -181,6 +181,30 @@ public sealed class TemplateRouteStepServiceTests : IClassFixture<PostgresDataba
updated.Value.AllowReassignToOtherApprovers.ShouldBeTrue();
}
[Fact(DisplayName = "Патч шага маршрута меняет только переданные поля, остальные остаются прежними")]
public async Task PatchAsync_UpdatesOnlyProvidedFields()
{
// Arrange
var routeId = await CreateRouteAsync("Route to patch step", byProject: false);
var created = await _service.CreateAsync(
routeId,
new CreateTemplateRouteStepRequest(1, "a@b.kz", "Engineer", ProjectRole.None, HeadType.None, RouteStepStatus.Approval, false),
CancellationToken.None);
// Action
var patched = await _service.PatchAsync(
routeId,
created.Value.Id,
new PatchTemplateRouteStepRequest(OrderNo: null, ExecutorEmail: "c@b.kz", Position: null, ProjectRole: null, HeadType: null, Status: RouteStepStatus.Execution, AllowReassignToOtherApprovers: null),
CancellationToken.None);
// Assert
patched.IsSuccess.ShouldBeTrue();
patched.Value.ExecutorEmail.ShouldBe("c@b.kz");
patched.Value.Position.ShouldBe("Engineer");
patched.Value.Status.ShouldBe(RouteStepStatus.Execution);
}
[Fact(DisplayName = "Удаление шага маршрута убирает его из базы")]
public async Task DeleteAsync_RemovesStep()
{
@@ -5,8 +5,6 @@ using Xunit;
namespace Tnsu.ApprovalRoute.IntegrationTests.Infrastructure;
// Отдельная БД на один xUnit-collection (= один тестовый класс) в общем инстансе Postgres.
// Тесты внутри класса делят эту БД; разные классы (разные коллекции) получают разные БД.
public sealed class PostgresDatabaseFixture : IAsyncLifetime
{
private readonly string _databaseName = $"tnsu_test_{Guid.NewGuid():N}";
@@ -7,8 +7,6 @@ using Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
namespace Tnsu.ApprovalRoute.IntegrationTests.Infrastructure;
// Собирает такой же DI-контейнер, как реальное приложение (те же extension-методы, что в Program.cs),
// но с тестовой БД, тестовым ICurrentUser и подменяемым (Moq) клиентом api.tnsu.kz.
internal static class TestServiceProviderFactory
{
public static ServiceProvider Build(