104 lines
3.5 KiB
PHP
104 lines
3.5 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
namespace Tests\Feature;
|
|||
|
|
|
|||
|
|
use App\Modules\Core\Models\User;
|
|||
|
|
use App\Modules\Inventory\Models\InventoryTransferOrder;
|
|||
|
|
use App\Modules\Inventory\Models\Product;
|
|||
|
|
use App\Modules\Inventory\Models\Warehouse;
|
|||
|
|
use App\Modules\Inventory\Imports\InventoryTransferItemImport;
|
|||
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|||
|
|
use Illuminate\Http\UploadedFile;
|
|||
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|||
|
|
use Tests\TestCase;
|
|||
|
|
|
|||
|
|
class InventoryTransferImportTest extends TestCase
|
|||
|
|
{
|
|||
|
|
use RefreshDatabase;
|
|||
|
|
|
|||
|
|
protected $user;
|
|||
|
|
protected $fromWarehouse;
|
|||
|
|
protected $toWarehouse;
|
|||
|
|
protected $order;
|
|||
|
|
protected $product;
|
|||
|
|
|
|||
|
|
protected function setUp(): void
|
|||
|
|
{
|
|||
|
|
parent::setUp();
|
|||
|
|
$this->user = User::create([
|
|||
|
|
'name' => 'Test User',
|
|||
|
|
'username' => 'testuser',
|
|||
|
|
'email' => 'test@example.com',
|
|||
|
|
'password' => bcrypt('password'),
|
|||
|
|
]);
|
|||
|
|
$this->actingAs($this->user);
|
|||
|
|
|
|||
|
|
$this->fromWarehouse = Warehouse::create([
|
|||
|
|
'code' => 'W1',
|
|||
|
|
'name' => 'From Warehouse',
|
|||
|
|
'type' => 'standard',
|
|||
|
|
]);
|
|||
|
|
$this->toWarehouse = Warehouse::create([
|
|||
|
|
'code' => 'W2',
|
|||
|
|
'name' => 'To Warehouse',
|
|||
|
|
'type' => 'standard',
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$this->order = InventoryTransferOrder::create([
|
|||
|
|
'doc_no' => 'TO' . time(),
|
|||
|
|
'from_warehouse_id' => $this->fromWarehouse->id,
|
|||
|
|
'to_warehouse_id' => $this->toWarehouse->id,
|
|||
|
|
'status' => 'draft',
|
|||
|
|
'created_by' => $this->user->id,
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$this->product = Product::create([
|
|||
|
|
'code' => 'P001',
|
|||
|
|
'name' => 'Test Product',
|
|||
|
|
'status' => 'enabled',
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** @test */
|
|||
|
|
public function it_can_import_items_with_chinese_headers()
|
|||
|
|
{
|
|||
|
|
// 建立假 Excel,使用中文標題
|
|||
|
|
$content = [
|
|||
|
|
['商品代碼', '批號', '數量', '備註'],
|
|||
|
|
['P001', 'BATCH001', '10', 'Imported Via Test'],
|
|||
|
|
['P001', '', '5', 'Batch should be NO-BATCH'],
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// 這裡我們直接呼叫 Import 類別來測試,避免多層模擬
|
|||
|
|
$import = new InventoryTransferItemImport($this->order);
|
|||
|
|
|
|||
|
|
// 我們模擬 Maatwebsite\Excel 傳入的 Collection
|
|||
|
|
// 注意:Excel 預設會將標題 slugify。如果 "商品代碼" 被 slugify,我們的 Import 類別會在那邊掛掉。
|
|||
|
|
// 所以這個測試可以幫我們確認 keys 是否如預期。
|
|||
|
|
|
|||
|
|
// 如果 WithHeadingRow 是用 slug 處理,那 keys 會是 slug 化的版本。
|
|||
|
|
// 但如果我們在 Import 類別中直接讀取 $row['商品代碼'],我們得確定它真的在那裡。
|
|||
|
|
|
|||
|
|
$rows = collect([
|
|||
|
|
collect(['商品代碼' => 'P001', '批號' => 'BATCH001', '數量' => '10', '備註' => 'Imported Via Test']),
|
|||
|
|
collect(['商品代碼' => 'P001', '批號' => '', '數量' => '5', '備註' => 'Batch should be NO-BATCH']),
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$import->collection($rows);
|
|||
|
|
|
|||
|
|
$this->assertDatabaseHas('inventory_transfer_items', [
|
|||
|
|
'transfer_order_id' => $this->order->id,
|
|||
|
|
'product_id' => $this->product->id,
|
|||
|
|
'batch_number' => 'BATCH001',
|
|||
|
|
'quantity' => 10,
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$this->assertDatabaseHas('inventory_transfer_items', [
|
|||
|
|
'transfer_order_id' => $this->order->id,
|
|||
|
|
'product_id' => $this->product->id,
|
|||
|
|
'batch_number' => 'NO-BATCH',
|
|||
|
|
'quantity' => 5,
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
}
|