ReclamationTest.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace Tests\Unit\Models;
  3. use App\Models\Order;
  4. use App\Models\Reclamation;
  5. use App\Models\Reservation;
  6. use App\Models\Shortage;
  7. use App\Models\SparePart;
  8. use App\Models\SparePartOrder;
  9. use App\Models\User;
  10. use Illuminate\Foundation\Testing\RefreshDatabase;
  11. use Tests\TestCase;
  12. class ReclamationTest extends TestCase
  13. {
  14. use RefreshDatabase;
  15. protected $seed = true;
  16. // ==================== Status Constants ====================
  17. public function test_status_constants_are_defined(): void
  18. {
  19. $this->assertEquals(1, Reclamation::STATUS_NEW);
  20. $this->assertEquals(2, Reclamation::STATUS_WAIT);
  21. $this->assertEquals(3, Reclamation::STATUS_IN_WORK);
  22. $this->assertEquals(4, Reclamation::STATUS_SUBSCRIBE_ACT);
  23. $this->assertEquals(5, Reclamation::STATUS_DONE);
  24. $this->assertEquals(6, Reclamation::STATUS_SENT);
  25. $this->assertEquals(7, Reclamation::STATUS_DO_DOCS);
  26. $this->assertEquals(8, Reclamation::STATUS_HANDOVER_TO_CHECK);
  27. $this->assertEquals(9, Reclamation::STATUS_PAID);
  28. $this->assertEquals(10, Reclamation::STATUS_CLOSED_NO_PAY);
  29. }
  30. public function test_status_names_are_defined(): void
  31. {
  32. $this->assertArrayHasKey(Reclamation::STATUS_NEW, Reclamation::STATUS_NAMES);
  33. $this->assertEquals('Новая', Reclamation::STATUS_NAMES[Reclamation::STATUS_NEW]);
  34. $this->assertEquals('Оплачена', Reclamation::STATUS_NAMES[Reclamation::STATUS_PAID]);
  35. }
  36. // ==================== Relationships ====================
  37. public function test_reclamation_belongs_to_order(): void
  38. {
  39. // Arrange
  40. $reclamation = Reclamation::factory()->create();
  41. // Act & Assert
  42. $this->assertInstanceOf(Order::class, $reclamation->order);
  43. }
  44. public function test_reclamation_belongs_to_user(): void
  45. {
  46. // Arrange
  47. $user = User::factory()->create();
  48. $reclamation = Reclamation::factory()->create(['user_id' => $user->id]);
  49. // Act & Assert
  50. $this->assertInstanceOf(User::class, $reclamation->user);
  51. $this->assertEquals($user->id, $reclamation->user->id);
  52. }
  53. public function test_reclamation_belongs_to_brigadier(): void
  54. {
  55. // Arrange
  56. $brigadier = User::factory()->create();
  57. $reclamation = Reclamation::factory()->create(['brigadier_id' => $brigadier->id]);
  58. // Act & Assert
  59. $this->assertInstanceOf(User::class, $reclamation->brigadier);
  60. $this->assertEquals($brigadier->id, $reclamation->brigadier->id);
  61. }
  62. public function test_reclamation_has_many_spare_part_reservations(): void
  63. {
  64. // Arrange
  65. $reclamation = Reclamation::factory()->create();
  66. $sparePart = SparePart::factory()->create();
  67. $order = SparePartOrder::factory()
  68. ->inStock()
  69. ->forSparePart($sparePart)
  70. ->create();
  71. Reservation::factory()
  72. ->active()
  73. ->fromOrder($order)
  74. ->forReclamation($reclamation)
  75. ->count(3)
  76. ->create();
  77. // Act
  78. $reservations = $reclamation->sparePartReservations;
  79. // Assert
  80. $this->assertCount(3, $reservations);
  81. $this->assertInstanceOf(Reservation::class, $reservations->first());
  82. }
  83. public function test_reclamation_has_many_spare_part_shortages(): void
  84. {
  85. // Arrange
  86. $reclamation = Reclamation::factory()->create();
  87. $sparePart = SparePart::factory()->create();
  88. Shortage::factory()
  89. ->open()
  90. ->forSparePart($sparePart)
  91. ->forReclamation($reclamation)
  92. ->count(2)
  93. ->create();
  94. // Act
  95. $shortages = $reclamation->sparePartShortages;
  96. // Assert
  97. $this->assertCount(2, $shortages);
  98. $this->assertInstanceOf(Shortage::class, $shortages->first());
  99. }
  100. // ==================== Active Reservations ====================
  101. public function test_active_reservations_returns_only_active_status(): void
  102. {
  103. // Arrange
  104. $reclamation = Reclamation::factory()->create();
  105. $sparePart = SparePart::factory()->create();
  106. $order = SparePartOrder::factory()
  107. ->inStock()
  108. ->forSparePart($sparePart)
  109. ->create();
  110. Reservation::factory()
  111. ->active()
  112. ->fromOrder($order)
  113. ->forReclamation($reclamation)
  114. ->count(2)
  115. ->create();
  116. Reservation::factory()
  117. ->cancelled()
  118. ->fromOrder($order)
  119. ->forReclamation($reclamation)
  120. ->create();
  121. Reservation::factory()
  122. ->issued()
  123. ->fromOrder($order)
  124. ->forReclamation($reclamation)
  125. ->create();
  126. // Act
  127. $activeReservations = $reclamation->activeReservations;
  128. // Assert
  129. $this->assertCount(2, $activeReservations);
  130. $activeReservations->each(function ($reservation) {
  131. $this->assertEquals(Reservation::STATUS_ACTIVE, $reservation->status);
  132. });
  133. }
  134. // ==================== Open Shortages ====================
  135. public function test_open_shortages_returns_only_open_status(): void
  136. {
  137. // Arrange
  138. $reclamation = Reclamation::factory()->create();
  139. $sparePart = SparePart::factory()->create();
  140. Shortage::factory()
  141. ->open()
  142. ->forSparePart($sparePart)
  143. ->forReclamation($reclamation)
  144. ->count(2)
  145. ->create();
  146. Shortage::factory()
  147. ->closed()
  148. ->forSparePart($sparePart)
  149. ->forReclamation($reclamation)
  150. ->create();
  151. // Act
  152. $openShortages = $reclamation->openShortages;
  153. // Assert
  154. $this->assertCount(2, $openShortages);
  155. $openShortages->each(function ($shortage) {
  156. $this->assertEquals(Shortage::STATUS_OPEN, $shortage->status);
  157. });
  158. }
  159. // ==================== Factory ====================
  160. public function test_factory_creates_valid_reclamation(): void
  161. {
  162. // Act
  163. $reclamation = Reclamation::factory()->create();
  164. // Assert
  165. $this->assertDatabaseHas('reclamations', [
  166. 'id' => $reclamation->id,
  167. ]);
  168. $this->assertNotNull($reclamation->order_id);
  169. $this->assertNotNull($reclamation->user_id);
  170. }
  171. }