StudentStatusTest.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace Tests\Unit;
  3. use App\Models\Student;
  4. use App\Models\StudentContract;
  5. use Illuminate\Support\Carbon;
  6. use Illuminate\Database\Eloquent\Relations\HasMany;
  7. use Illuminate\Database\Eloquent\Builder;
  8. use Tests\TestCase;
  9. class StudentStatusTest extends TestCase
  10. {
  11. private function createStudentWithContracts($contracts)
  12. {
  13. $mockRelation = $this->getMockBuilder(HasMany::class)
  14. ->disableOriginalConstructor()
  15. ->onlyMethods(['__call'])
  16. ->getMock();
  17. $mockBuilder = $this->getMockBuilder(Builder::class)
  18. ->disableOriginalConstructor()
  19. ->getMock();
  20. $mockBuilder->method('get')->willReturn($contracts);
  21. $mockRelation->method('__call')
  22. ->with('latestVersion', [])
  23. ->willReturn($mockBuilder);
  24. $student = new class($mockRelation) extends Student {
  25. private $mockRelation;
  26. public function __construct($mockRelation = null) {
  27. parent::__construct();
  28. if ($mockRelation) {
  29. $this->mockRelation = $mockRelation;
  30. }
  31. }
  32. public function contracts(): HasMany
  33. {
  34. return $this->mockRelation;
  35. }
  36. };
  37. return $student;
  38. }
  39. public function test_student_without_contracts_is_lead(): void
  40. {
  41. $student = $this->createStudentWithContracts(collect([]));
  42. $this->assertSame(Student::STATUS_LEAD, $student->calculateStatus());
  43. }
  44. public function test_student_with_active_contract_in_future_is_active(): void
  45. {
  46. $contract = new StudentContract;
  47. $contract->status = 'active';
  48. $contract->end_date = Carbon::now()->addDays(10);
  49. $student = $this->createStudentWithContracts(collect([$contract]));
  50. $this->assertSame(Student::STATUS_ACTIVE, $student->calculateStatus());
  51. }
  52. public function test_student_with_active_contract_in_past_is_ex_student(): void
  53. {
  54. $contract = new StudentContract;
  55. $contract->status = 'active';
  56. $contract->end_date = Carbon::now()->subDays(10); // Expired
  57. $student = $this->createStudentWithContracts(collect([$contract]));
  58. $this->assertSame(Student::STATUS_EX_STUDENT, $student->calculateStatus());
  59. }
  60. public function test_student_with_frozen_contract_and_no_active_is_locked(): void
  61. {
  62. $contract = new StudentContract;
  63. $contract->status = 'frozen';
  64. $contract->end_date = Carbon::now()->addDays(10);
  65. $student = $this->createStudentWithContracts(collect([$contract]));
  66. $this->assertSame(Student::STATUS_LOCKED, $student->calculateStatus());
  67. }
  68. public function test_student_with_cancelled_contracts_only_is_ex_student(): void
  69. {
  70. $contract = new StudentContract;
  71. $contract->status = 'cancelled';
  72. $contract->end_date = Carbon::now()->addDays(10);
  73. $student = $this->createStudentWithContracts(collect([$contract]));
  74. $this->assertSame(Student::STATUS_EX_STUDENT, $student->calculateStatus());
  75. }
  76. }