Files
myep-team/tests/Security/RequiredCheck/RecurringDeadlinesTest.php
T

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')));
}
}