OrderTest.php 8.3 KB

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