Files
xin-procurement/tests/Feature/MiniProductTest.php
T

107 lines
4.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace Tests\Feature;
use App\Models\CustomerLevelModel;
use App\Models\ProductModel;
use App\Models\StoreModel;
/**
* 小程序商品:商品详情接口(免登录浏览,登录门店按等级上浮比例显示换算价);
* 商品列表回归:登录门店场景曾数组误用对象访问 + 价格缺失导致 500
* (门店即用户:登录主体为 StoreModel
*/
class MiniProductTest extends ProcurementTestCase
{
/**
* 造门店 + 上架商品(成本价即售价,等级上浮 0%)
*
* @return array{0: StoreModel, 1: ProductModel, 2: CustomerLevelModel}
*/
private function makeStoreWithProduct(string $price = '5.00'): array
{
$level = CustomerLevelModel::factory()->create();
$store = StoreModel::factory()->create(['level_id' => $level->id]);
$product = ProductModel::factory()->create([
'status' => ProductModel::STATUS_ON,
'cost_price' => $price,
]);
return [$store, $product, $level];
}
/** 商品详情:未登录浏览 price=null,基础字段完整 */
public function test_product_detail_guest_sees_null_price(): void
{
[, $product] = $this->makeStoreWithProduct();
$data = $this->getJson("/mini/product/{$product->id}")->assertOk()->json('data');
$this->assertSame($product->name, $data['name']);
$this->assertSame($product->spec, $data['spec']);
$this->assertSame($product->unit, $data['unit']);
$this->assertNull($data['price'], '未登录不显示价格');
$this->assertArrayNotHasKey('cost_price', $data, '成本价不得输出到小程序端');
}
/** 商品详情:登录门店按等级显示固定价 */
public function test_product_detail_store_sees_level_price(): void
{
[$store, $product] = $this->makeStoreWithProduct('6.50');
$this->actingAsMiniStore($store);
$data = $this->getJson("/mini/product/{$product->id}")->assertOk()->json('data');
$this->assertSame('6.50', $data['price']);
}
/** 商品详情:按门店等级上浮比例换算(成本价上浮 30%) */
public function test_product_detail_percent_price_calculated_from_cost(): void
{
[$store, $product, $level] = $this->makeStoreWithProduct();
$level->update(['percent' => 30]);
$product->update(['cost_price' => '20.00']);
$this->actingAsMiniStore($store);
$data = $this->getJson("/mini/product/{$product->id}")->assertOk()->json('data');
$this->assertSame('26.00', $data['price'], '20 元上浮 30% = 26.00');
}
/** 商品详情:下架/不存在拒绝 */
public function test_product_detail_off_shelf_or_missing_rejected(): void
{
[, $product] = $this->makeStoreWithProduct();
$product->update(['status' => ProductModel::STATUS_OFF]);
$this->getJson("/mini/product/{$product->id}")->assertJsonPath('success', false);
$this->getJson('/mini/product/99999')->assertJsonPath('success', false);
}
/** 商品列表:登录门店显示等级价(回归:曾数组误用对象访问导致 500) */
public function test_product_list_store_sees_level_price(): void
{
[$store, $product] = $this->makeStoreWithProduct('7.00');
$this->actingAsMiniStore($store);
$rows = $this->getJson('/mini/product/list')->assertOk()->json('data.data');
$row = collect($rows)->firstWhere('id', $product->id);
$this->assertNotNull($row);
$this->assertSame('7.00', $row['price']);
$this->assertArrayNotHasKey('cost_price', $row, '成本价不得输出到小程序端');
}
/** 商品列表:未登录 price=null */
public function test_product_list_guest_sees_null_price(): void
{
[, $product] = $this->makeStoreWithProduct();
$rows = $this->getJson('/mini/product/list')->assertOk()->json('data.data');
$row = collect($rows)->firstWhere('id', $product->id);
$this->assertNotNull($row);
$this->assertNull($row['price']);
}
}