/**
  * test testIsActionAllowed().
  */
 public function testIsActionAllowed()
 {
     $authManager = new RecruitmentAuthManager();
     $app = JobApplication::getJobApplication(1);
     $app5 = JobApplication::getJobApplication(5);
     // Different users
     $admin = new authorize(null, authorize::YES);
     $hiring = new authorize('011', authorize::NO);
     $first = new authorize(13, authorize::NO);
     $second = new authorize(14, authorize::NO);
     $manager = new authorize(15, authorize::NO);
     $nonManager = new authorize(16, authorize::NO);
     $director = new authorize(17, authorize::NO);
     $otherDirector = new authorize(18, authorize::NO);
     /* SUBMITTED */
     $app->setStatus(JobApplication::STATUS_SUBMITTED);
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_FIRST_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SCHEDULE_FIRST_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_FIRST_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     /* FIRST INTERVIEW SCHEDULED (scheduled) */
     $app->setStatus(JobApplication::STATUS_FIRST_INTERVIEW_SCHEDULED);
     $event = $app->getEventOfType(JobApplicationEvent::EVENT_SCHEDULE_FIRST_INTERVIEW);
     $event->setStatus(JobApplicationEvent::STATUS_INTERVIEW_SCHEDULED);
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_FIRST_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertTrue($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     /* FIRST INTERVIEW SCHEDULED (finished) */
     $event = $app->getEventOfType(JobApplicationEvent::EVENT_SCHEDULE_FIRST_INTERVIEW);
     $event->setStatus(JobApplicationEvent::STATUS_INTERVIEW_FINISHED);
     $expected = array(JobApplication::ACTION_REJECT, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW);
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_FIRST_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertTrue($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertTrue($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     /* SECOND INTERVIEW SCHEDULED (scheduled) */
     $app->setStatus(JobApplication::STATUS_SECOND_INTERVIEW_SCHEDULED);
     $event = $app->getEventOfType(JobApplicationEvent::EVENT_SCHEDULE_SECOND_INTERVIEW);
     $event->setStatus(JobApplicationEvent::STATUS_INTERVIEW_SCHEDULED);
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertTrue($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     /* SECOND INTERVIEW SCHEDULED (finished) */
     $event = $app->getEventOfType(JobApplicationEvent::EVENT_SCHEDULE_SECOND_INTERVIEW);
     $event->setStatus(JobApplicationEvent::STATUS_INTERVIEW_FINISHED);
     $expected = array(JobApplication::ACTION_REJECT, JobApplication::ACTION_OFFER_JOB);
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertTrue($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertTrue($authManager->isActionAllowed($second, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     // Job Offered
     $app->setStatus(JobApplication::STATUS_JOB_OFFERED);
     $expected = array(JobApplication::ACTION_MARK_OFFER_DECLINED, JobApplication::ACTION_SEEK_APPROVAL);
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_MARK_OFFER_DECLINED));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_MARK_OFFER_DECLINED));
     $this->assertTrue($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_MARK_OFFER_DECLINED));
     $this->assertTrue($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_MARK_OFFER_DECLINED));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     // Offer Declined
     $app->setStatus(JobApplication::STATUS_OFFER_DECLINED);
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     // Pending approval
     $app5->setStatus(JobApplication::STATUS_PENDING_APPROVAL);
     $this->assertFalse($authManager->isActionAllowed($otherDirector, $app5, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($otherDirector, $app5, JobApplication::ACTION_REJECT));
     $this->assertTrue($authManager->isActionAllowed($director, $app5, JobApplication::ACTION_APPROVE));
     $this->assertTrue($authManager->isActionAllowed($director, $app5, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app5, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app5, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($admin, $app5, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app5, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app5, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app5, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($second, $app5, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($second, $app5, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($first, $app5, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($first, $app5, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app5, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app5, JobApplication::ACTION_SEEK_APPROVAL));
     // Hired
     $app->setStatus(JobApplication::STATUS_HIRED);
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
     // Rejected
     $app->setStatus(JobApplication::STATUS_REJECTED);
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_APPROVE));
     $this->assertFalse($authManager->isActionAllowed($director, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($admin, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($hiring, $app, JobApplication::ACTION_SEEK_APPROVAL));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($second, $app, JobApplication::ACTION_OFFER_JOB));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($first, $app, JobApplication::ACTION_REJECT));
     $this->assertFalse($authManager->isActionAllowed($manager, $app, JobApplication::ACTION_SCHEDULE_SECOND_INTERVIEW));
     $this->assertFalse($authManager->isActionAllowed($nonManager, $app, JobApplication::ACTION_SEEK_APPROVAL));
 }