правки
This commit is contained in:
+39
-1
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user