create(); $store = StoreModel::factory()->create(['level_id' => $level->id]); $product = ProductModel::factory()->create([ 'status' => ProductModel::STATUS_ON, 'cost_price' => $price, ]); return [$store, $product, UserModel::factory()->forStore($store->id)->create(), $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_user_sees_level_price(): void { [, $product, $user] = $this->makeStoreWithProduct('6.50'); $this->actingAsMiniUser($user); $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 { [, $product, $user, $level] = $this->makeStoreWithProduct(); $level->update(['percent' => 30]); $product->update(['cost_price' => '20.00']); $this->actingAsMiniUser($user); $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_user_sees_level_price(): void { [, $product, $user] = $this->makeStoreWithProduct('7.00'); $this->actingAsMiniUser($user); $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']); } }