setMainScope($scopeA); $user->setMainScope($scopeB); // 1. check getMainScope get now scopeB, not scopeA self::assertSame($scopeB, $user->getMainScope()); // 2. get scopeA history, check endDate is not null self::assertNotNull( $user ->getMainScopeHistories() ->filter(fn (User\UserScopeHistory $userScopeHistory) => $userScopeHistory->getScope() === $scopeA) ->first()->getEndDate() ); } public function testUserJobHistory() { $user = new User(); $jobA = new UserJob(); $jobB = new UserJob(); $user->setUserJob($jobA); $user->setUserJob($jobB); // 1. check getUserJob get now jobB, not jobA self::assertSame($jobB, $user->getUserJob()); // 2. get jobA history, check endDate is not null self::assertNotNull( $user ->getUserJobHistories() ->filter(fn (User\UserJobHistory $userJobHistory) => $userJobHistory->getJob() === $jobA) ->first()->getEndDate() ); } public function testIsAbsent() { $user = new User(); // Absent: today is within absence period $absenceStart = new \DateTimeImmutable('-1 day'); $absenceEnd = new \DateTimeImmutable('+1 day'); $user->setAbsenceStart($absenceStart); $user->setAbsenceEnd($absenceEnd); self::assertTrue($user->isAbsent(), 'Should be absent when now is between start and end'); // Absent: end is null $user->setAbsenceStart(new \DateTimeImmutable('-2 days')); $user->setAbsenceEnd(null); self::assertTrue($user->isAbsent(), 'Should be absent when started and no end'); // Not absent: absenceStart is in the future $user->setAbsenceStart(new \DateTimeImmutable('+2 days')); $user->setAbsenceEnd(null); self::assertFalse($user->isAbsent(), 'Should not be absent if start is in the future'); // Not absent: absenceEnd is in the past $user->setAbsenceStart(new \DateTimeImmutable('-5 days')); $user->setAbsenceEnd(new \DateTimeImmutable('-1 day')); self::assertFalse($user->isAbsent(), 'Should not be absent if end is in the past'); // Not absent: both are null $user->setAbsenceStart(null); $user->setAbsenceEnd(null); self::assertFalse($user->isAbsent(), 'Should not be absent if start is null'); } }