126 lines
3.9 KiB
PHP
126 lines
3.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Security\RequiredCheck;
|
|
|
|
use App\RequiredTeamerCheck\RecurringDeadlines;
|
|
use Carbon\CarbonImmutable;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class RecurringDeadlinesTest extends TestCase
|
|
{
|
|
protected function setUp(): void
|
|
{
|
|
CarbonImmutable::setTestNow();
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
CarbonImmutable::setTestNow();
|
|
}
|
|
|
|
public function testAnEmptyScheduleIsNeverDue(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines([]);
|
|
|
|
$this->assertFalse($deadlines->isDue(null, new \DateTimeImmutable('2020-01-01'), CarbonImmutable::parse('2026-08-10')));
|
|
$this->assertNull($deadlines->getCurrentDeadline(CarbonImmutable::parse('2026-08-10')));
|
|
}
|
|
|
|
public function testIsNotDueBeforeTheFirstDeadlineEvenWhenNeverConfirmed(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertFalse($deadlines->isDue(
|
|
null,
|
|
new \DateTimeImmutable('2025-11-05 12:00:00'),
|
|
CarbonImmutable::parse('2026-01-10 12:00:00'),
|
|
));
|
|
}
|
|
|
|
public function testIsDueAfterTheFirstDeadlineWhenNeverConfirmed(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertTrue($deadlines->isDue(
|
|
null,
|
|
new \DateTimeImmutable('2025-11-05 12:00:00'),
|
|
CarbonImmutable::parse('2026-01-20 12:00:00'),
|
|
));
|
|
}
|
|
|
|
public function testIsNotDueWhenConfirmedAfterTheCurrentDeadline(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertFalse($deadlines->isDue(
|
|
new \DateTimeImmutable('2026-01-16 10:00:00'),
|
|
new \DateTimeImmutable('2025-11-05 12:00:00'),
|
|
CarbonImmutable::parse('2026-05-20 12:00:00'),
|
|
));
|
|
}
|
|
|
|
public function testIsDueWhenTheConfirmationPredatesTheCurrentDeadline(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertTrue($deadlines->isDue(
|
|
new \DateTimeImmutable('2026-02-01 10:00:00'),
|
|
new \DateTimeImmutable('2025-11-05 12:00:00'),
|
|
CarbonImmutable::parse('2026-07-20 12:00:00'),
|
|
));
|
|
}
|
|
|
|
public function testIsNotDueWhenRegisteredAfterTheFirstDeadline(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertFalse($deadlines->isDue(
|
|
null,
|
|
new \DateTimeImmutable('2026-03-01 10:00:00'),
|
|
CarbonImmutable::parse('2026-05-20 12:00:00'),
|
|
));
|
|
}
|
|
|
|
public function testIsNotDueWhenRegisteredAfterTheSecondDeadline(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertFalse($deadlines->isDue(
|
|
null,
|
|
new \DateTimeImmutable('2026-10-01 10:00:00'),
|
|
CarbonImmutable::parse('2026-11-20 12:00:00'),
|
|
));
|
|
}
|
|
|
|
public function testIsDueWhenRegisteredBeforeAllCurrentYearDeadlines(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertTrue($deadlines->isDue(
|
|
null,
|
|
new \DateTimeImmutable('2025-10-01 10:00:00'),
|
|
CarbonImmutable::parse('2026-11-20 12:00:00'),
|
|
));
|
|
}
|
|
|
|
public function testAMissingRegistrationDateDoesNotExempt(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertTrue($deadlines->isDue(null, null, CarbonImmutable::parse('2026-01-20 12:00:00')));
|
|
}
|
|
|
|
public function testGetCurrentDeadlineReturnsTheMostRecentlyPassedOne(): void
|
|
{
|
|
$deadlines = new RecurringDeadlines(['01-15', '07-15']);
|
|
|
|
$this->assertSame(
|
|
'2026-07-15',
|
|
$deadlines->getCurrentDeadline(CarbonImmutable::parse('2026-08-10'))?->format('Y-m-d'),
|
|
);
|
|
$this->assertNull($deadlines->getCurrentDeadline(CarbonImmutable::parse('2026-01-10')));
|
|
}
|
|
}
|