ReclamationTest.php 7.5 KB

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