Убраны предупреждения сборки бэкенда
Tests / frontend-test (pull_request) Successful in 50s
Tests / backend-test (pull_request) Successful in 9m38s

NU1903: транзитивная Microsoft.OpenApi 2.0.0 (GHSA-v5pm-xwqc-g5wc, high)
запиннена на 2.7.5 — первая исправленная версия; работает через уже
включённый CentralPackageTransitivePinningEnabled, как и Newtonsoft.Json.

NU1510: убран PackageReference Microsoft.Extensions.Http из Infrastructure —
пакет приходит из общего фреймворка по FrameworkReference
Microsoft.AspNetCore.App, AddHttpClient продолжает работать.

ASPDEPR005: KnownNetworks -> KnownIPNetworks.

CS8604 (x5): Warning имеет тип string?, и Shouldly не сужает его после
ShouldNotBeNull — значение сохраняется в локальную переменную.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-08-24 17:02:30 +05:00
parent 4c3d119db8
commit 0adb6d0e58
4 changed files with 22 additions and 13 deletions
+6 -1
View File
@@ -25,7 +25,12 @@
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.10" />
<!--
Только чтобы поднять транзитивную версию из Microsoft.AspNetCore.OpenApi (2.0.0
с уязвимостью GHSA-v5pm-xwqc-g5wc, исправлена в 2.7.5) — напрямую не используется.
Убрать, когда Microsoft.AspNetCore.OpenApi сам подтянет исправленную версию.
-->
<PackageVersion Include="Microsoft.OpenApi" Version="2.7.5" />
<PackageVersion Include="Moq" Version="4.20.72" />
<!-- Только чтобы поднять транзитивную версию из Hangfire.Core — напрямую не используется. -->
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
+1 -1
View File
@@ -40,7 +40,7 @@ builder.Services.Configure<ForwardedHeadersOptions>(options =>
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownIPNetworks.Clear();
options.KnownProxies.Clear();
});
@@ -13,7 +13,6 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" />
<PackageReference Include="Microsoft.Extensions.Http" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
<!-- Даёт доступ к IHttpContextAccessor из общего фреймворка ASP.NET Core (тот же тип, что в Api). -->
<FrameworkReference Include="Microsoft.AspNetCore.App" />
@@ -332,8 +332,9 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
resolved.IsSuccess.ShouldBeTrue();
resolved.Value.Steps.ShouldHaveSingleItem();
resolved.Value.Steps[0].ExecutorEmail.ShouldBeNull();
resolved.Value.Steps[0].Warning.ShouldNotBeNull();
resolved.Value.Steps[0].Warning.ShouldContain("departmentId");
var warning = resolved.Value.Steps[0].Warning;
warning.ShouldNotBeNull();
warning.ShouldContain("departmentId");
}
[Fact(DisplayName = "Резолв маршрута с шагом «Руководитель указанного отдела» и переданным departmentId — резолвится через портал")]
@@ -413,8 +414,9 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
resolved.IsSuccess.ShouldBeTrue();
resolved.Value.Steps.ShouldHaveSingleItem();
resolved.Value.Steps[0].ExecutorEmail.ShouldBeNull();
resolved.Value.Steps[0].Warning.ShouldNotBeNull();
resolved.Value.Steps[0].Warning.ShouldContain(targetDepartmentId.ToString());
var warning = resolved.Value.Steps[0].Warning;
warning.ShouldNotBeNull();
warning.ShouldContain(targetDepartmentId.ToString());
}
[Fact(DisplayName = "Резолв маршрута включает шаг с условием «больше», когда переданное значение поля его удовлетворяет")]
@@ -723,8 +725,9 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
resolved.IsSuccess.ShouldBeTrue();
resolved.Value.Steps.ShouldHaveSingleItem();
resolved.Value.Steps[0].ExecutorEmail.ShouldBeNull();
resolved.Value.Steps[0].Warning.ShouldNotBeNull();
resolved.Value.Steps[0].Warning.ShouldContain("руководитель");
var warning = resolved.Value.Steps[0].Warning;
warning.ShouldNotBeNull();
warning.ShouldContain("руководитель");
}
[Fact(DisplayName = "Резолв шага с должностью возвращает warning, если сотрудник по должности не найден")]
@@ -751,8 +754,9 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
resolved.IsSuccess.ShouldBeTrue();
resolved.Value.Steps.ShouldHaveSingleItem();
resolved.Value.Steps[0].ExecutorEmail.ShouldBeNull();
resolved.Value.Steps[0].Warning.ShouldNotBeNull();
resolved.Value.Steps[0].Warning.ShouldContain("должности");
var warning = resolved.Value.Steps[0].Warning;
warning.ShouldNotBeNull();
warning.ShouldContain("должности");
}
[Fact(DisplayName = "Резолв шага с ролью в проекте возвращает warning, если исполнитель с такой ролью не найден")]
@@ -779,8 +783,9 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
resolved.IsSuccess.ShouldBeTrue();
resolved.Value.Steps.ShouldHaveSingleItem();
resolved.Value.Steps[0].ExecutorEmail.ShouldBeNull();
resolved.Value.Steps[0].Warning.ShouldNotBeNull();
resolved.Value.Steps[0].Warning.ShouldContain("роль");
var warning = resolved.Value.Steps[0].Warning;
warning.ShouldNotBeNull();
warning.ShouldContain("роль");
}
[Fact(DisplayName = "Резолв маршрута откатывается на маршрут без отдела, если точного совпадения по отделу нет")]