OrderTest.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. namespace Tests\Unit\Models;
  3. use App\Models\Dictionary\Area;
  4. use App\Models\Dictionary\District;
  5. use App\Models\File;
  6. use App\Models\MafOrder;
  7. use App\Models\Order;
  8. use App\Models\Product;
  9. use App\Models\ProductSKU;
  10. use App\Models\Reclamation;
  11. use App\Models\User;
  12. use Illuminate\Foundation\Testing\RefreshDatabase;
  13. use Tests\TestCase;
  14. class OrderTest extends TestCase
  15. {
  16. use RefreshDatabase;
  17. public function test_status_constants_exist(): void
  18. {
  19. $this->assertEquals(1, Order::STATUS_NEW);
  20. $this->assertEquals(2, Order::STATUS_NOT_READY);
  21. $this->assertEquals(3, Order::STATUS_READY_NO_MAF);
  22. $this->assertEquals(4, Order::STATUS_READY_TO_MOUNT);
  23. $this->assertEquals(5, Order::STATUS_IN_MOUNT);
  24. $this->assertEquals(6, Order::STATUS_DUTY);
  25. $this->assertEquals(7, Order::STATUS_READY_TO_HAND_OVER);
  26. $this->assertEquals(8, Order::STATUS_NOT_HANDED_OVER_WITH_NOTES);
  27. $this->assertEquals(9, Order::STATUS_HANDED_OVER_WITH_NOTES);
  28. $this->assertEquals(10, Order::STATUS_HANDED_OVER);
  29. $this->assertEquals(11, Order::STATUS_NO_MAF);
  30. $this->assertEquals(12, Order::STATUS_PROBLEM);
  31. }
  32. public function test_status_names_array_contains_all_statuses(): void
  33. {
  34. $this->assertArrayHasKey(Order::STATUS_NEW, Order::STATUS_NAMES);
  35. $this->assertArrayHasKey(Order::STATUS_HANDED_OVER, Order::STATUS_NAMES);
  36. $this->assertArrayHasKey(Order::STATUS_PROBLEM, Order::STATUS_NAMES);
  37. $this->assertEquals('Новая', Order::STATUS_NAMES[Order::STATUS_NEW]);
  38. $this->assertEquals('Сдана', Order::STATUS_NAMES[Order::STATUS_HANDED_OVER]);
  39. }
  40. public function test_status_colors_array_exists(): void
  41. {
  42. $this->assertArrayHasKey(Order::STATUS_NEW, Order::STATUS_COLOR);
  43. $this->assertArrayHasKey(Order::STATUS_HANDED_OVER, Order::STATUS_COLOR);
  44. $this->assertEquals('success', Order::STATUS_COLOR[Order::STATUS_HANDED_OVER]);
  45. $this->assertEquals('danger', Order::STATUS_COLOR[Order::STATUS_PROBLEM]);
  46. }
  47. public function test_year_defaults_to_current_year_on_create(): void
  48. {
  49. $district = District::factory()->create();
  50. $area = Area::factory()->create(['district_id' => $district->id]);
  51. $user = User::factory()->create();
  52. $order = Order::create([
  53. 'name' => 'Test Order',
  54. 'user_id' => $user->id,
  55. 'district_id' => $district->id,
  56. 'area_id' => $area->id,
  57. 'object_address' => 'Test Address',
  58. 'order_status_id' => Order::STATUS_NEW,
  59. ]);
  60. $this->assertEquals((int) date('Y'), $order->year);
  61. }
  62. public function test_common_name_attribute_combines_address_area_district(): void
  63. {
  64. $district = District::factory()->create(['shortname' => 'ЦАО']);
  65. $area = Area::factory()->create([
  66. 'name' => 'Тверской',
  67. 'district_id' => $district->id,
  68. ]);
  69. $order = Order::factory()->create([
  70. 'object_address' => 'ул. Пушкина, д. 10',
  71. 'district_id' => $district->id,
  72. 'area_id' => $area->id,
  73. ]);
  74. $this->assertStringContainsString('ул. Пушкина, д. 10', $order->common_name);
  75. $this->assertStringContainsString('Тверской', $order->common_name);
  76. $this->assertStringContainsString('ЦАО', $order->common_name);
  77. }
  78. public function test_relations_exist(): void
  79. {
  80. $order = Order::factory()->create();
  81. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\BelongsTo::class, $order->user());
  82. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\BelongsTo::class, $order->district());
  83. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\BelongsTo::class, $order->area());
  84. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\BelongsTo::class, $order->brigadier());
  85. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\HasMany::class, $order->products_sku());
  86. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\HasMany::class, $order->reclamations());
  87. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\BelongsToMany::class, $order->photos());
  88. $this->assertInstanceOf(\Illuminate\Database\Eloquent\Relations\BelongsToMany::class, $order->documents());
  89. }
  90. public function test_is_all_maf_connected_returns_empty_when_all_connected(): void
  91. {
  92. $order = Order::factory()->create();
  93. $product = Product::factory()->create();
  94. $mafOrder = MafOrder::factory()->create(['product_id' => $product->id]);
  95. ProductSKU::factory()->create([
  96. 'order_id' => $order->id,
  97. 'product_id' => $product->id,
  98. 'maf_order_id' => $mafOrder->id,
  99. ]);
  100. $errors = $order->isAllMafConnected();
  101. $this->assertEmpty($errors);
  102. }
  103. public function test_is_all_maf_connected_returns_errors_when_not_connected(): void
  104. {
  105. $order = Order::factory()->create();
  106. $product = Product::factory()->create(['article' => 'TEST-001']);
  107. ProductSKU::factory()->create([
  108. 'order_id' => $order->id,
  109. 'product_id' => $product->id,
  110. 'maf_order_id' => null, // Not connected
  111. ]);
  112. $errors = $order->isAllMafConnected();
  113. $this->assertNotEmpty($errors);
  114. $this->assertStringContainsString('TEST-001', $errors[0]);
  115. }
  116. public function test_can_create_handover_checks_required_fields(): void
  117. {
  118. $order = Order::factory()->create();
  119. $product = Product::factory()->create([
  120. 'article' => 'TEST-001',
  121. 'passport_name' => null, // Missing
  122. ]);
  123. ProductSKU::factory()->create([
  124. 'order_id' => $order->id,
  125. 'product_id' => $product->id,
  126. 'maf_order_id' => null,
  127. 'passport_id' => null,
  128. 'rfid' => null,
  129. ]);
  130. $errors = $order->canCreateHandover();
  131. $this->assertNotEmpty($errors);
  132. // Should have multiple errors for missing fields
  133. $this->assertGreaterThan(1, count($errors));
  134. }
  135. public function test_can_create_handover_requires_photos(): void
  136. {
  137. $order = Order::factory()->create();
  138. // Order without photos
  139. $errors = $order->canCreateHandover();
  140. $this->assertContains('Не загружены фотографии!', $errors);
  141. }
  142. public function test_fillable_attributes(): void
  143. {
  144. $order = new Order();
  145. $fillable = $order->getFillable();
  146. $this->assertContains('year', $fillable);
  147. $this->assertContains('name', $fillable);
  148. $this->assertContains('user_id', $fillable);
  149. $this->assertContains('district_id', $fillable);
  150. $this->assertContains('area_id', $fillable);
  151. $this->assertContains('object_address', $fillable);
  152. $this->assertContains('order_status_id', $fillable);
  153. $this->assertContains('installation_date', $fillable);
  154. $this->assertContains('brigadier_id', $fillable);
  155. }
  156. public function test_appends_include_required_attributes(): void
  157. {
  158. $order = new Order();
  159. $this->assertContains('common_name', $order->appends);
  160. $this->assertContains('products_with_count', $order->appends);
  161. }
  162. public function test_soft_deletes_trait_is_used(): void
  163. {
  164. $order = Order::factory()->create();
  165. $order->delete();
  166. $this->assertSoftDeleted($order);
  167. $this->assertNotNull($order->deleted_at);
  168. }
  169. public function test_order_can_have_reclamations(): void
  170. {
  171. $order = Order::factory()->create();
  172. Reclamation::factory()->count(3)->create([
  173. 'order_id' => $order->id,
  174. ]);
  175. $this->assertCount(3, $order->reclamations);
  176. }
  177. public function test_order_can_have_brigadier(): void
  178. {
  179. $brigadier = User::factory()->brigadier()->create();
  180. $order = Order::factory()->withBrigadier($brigadier)->create();
  181. $order->refresh();
  182. $this->assertEquals($brigadier->id, $order->brigadier_id);
  183. $this->assertEquals($brigadier->id, $order->brigadier->id);
  184. }
  185. }