правки

This commit is contained in:
gorbenko.pavel
2026-08-27 15:21:34 +05:00
parent cfc2b393bd
commit 554f9b2528
5 changed files with 96 additions and 16 deletions
@@ -33,6 +33,16 @@ public sealed class ReminderServiceTests : IClassFixture<PostgresDatabaseFixture
private static readonly DateTimeOffset Now = new(2026, 8, 12, 12, 0, 0, TimeSpan.Zero);
// GetOverdueAsync/GetProbationEndingAsync по-прежнему берут now параметром — их
// тесты ниже дают его напрямую. TimeProvider нужен только там, где ReminderService
// сам решает, «сейчас» сколько — то есть в GetRemindersAsync (см. её doc-комментарий).
private sealed class FixedTimeProvider(DateTimeOffset now) : TimeProvider
{
public override DateTimeOffset GetUtcNow() => now;
}
private static readonly TimeProvider Clock = new FixedTimeProvider(Now);
private readonly ServiceProvider _services;
private readonly RequestTypeService _requestTypeService;
@@ -124,6 +134,7 @@ public sealed class ReminderServiceTests : IClassFixture<PostgresDatabaseFixture
sharePoint.Object,
_services.GetRequiredService<ListPartitionRegistry>(),
Mock.Of<ITnsuPortalClient>(),
Clock,
Options.Create(new RemindersOptions()),
NullLogger<ReminderService>.Instance);
}
@@ -145,6 +156,32 @@ public sealed class ReminderServiceTests : IClassFixture<PostgresDatabaseFixture
reminder.RequestId.ShouldBe(1);
}
[Fact(DisplayName = "GetRemindersAsync без feed — обратная совместимость, как ApprovalOverdue")]
public async Task GetRemindersAsync_WithoutFeed_BehavesLikeApprovalOverdue()
{
var listUrl = await CreateTypeWithSlaAsync("Sla feed default", slaHours: 24);
var service = BuildService(listUrl,
[Row(10, 1, "На согласовании", "Согласование", date: Now.AddHours(-48).ToString("O"))]);
var result = await service.GetRemindersAsync(CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
result.Value.ShouldHaveSingleItem().ShouldBeOfType<ApprovalOverdueReminderDto>().HoursOverdue.ShouldBe(24);
}
[Fact(DisplayName = "GetRemindersAsync(feed: ProbationEnding) — просроченные шаги согласования игнорируются")]
public async Task GetRemindersAsync_ProbationEndingFeed_IgnoresApprovalOverdue()
{
var listUrl = await CreateTypeWithSlaAsync("Sla feed probation", slaHours: 24);
var service = BuildService(listUrl,
[Row(10, 1, "На согласовании", "Согласование", date: Now.AddHours(-48).ToString("O"))]);
var result = await service.GetRemindersAsync(ReminderFeed.ProbationEnding, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
result.Value.ShouldBeEmpty();
}
[Fact(DisplayName = "Срок ещё не вышел — напоминания нет")]
public async Task WithinSla_ReturnsNothing()
{
@@ -317,6 +354,7 @@ public sealed class ReminderServiceTests : IClassFixture<PostgresDatabaseFixture
sharePoint.Object,
_services.GetRequiredService<ListPartitionRegistry>(),
portalClient.Object,
Clock,
Options.Create(new RemindersOptions { RecruitingHirePageUrl = pageUrl, ProbationReminderDaysBeforeEnd = daysBeforeEnd }),
NullLogger<ReminderService>.Instance);
}
@@ -519,7 +557,7 @@ public sealed class ReminderServiceTests : IClassFixture<PostgresDatabaseFixture
fio, dismissalDate: null, candidateEmail: "partition@tnsu.kz", managerEmail: "manager@tnsu.kz");
var service = new ReminderService(
db, sharePoint.Object, partitionRegistry, portalClient.Object,
db, sharePoint.Object, partitionRegistry, portalClient.Object, Clock,
Options.Create(new RemindersOptions { RecruitingHirePageUrl = pageUrl }),
NullLogger<ReminderService>.Instance);