create(); $store = StoreModel::factory()->create(['level_id' => $level->id]); $product = ProductModel::factory()->create([ 'status' => ProductModel::STATUS_ON, 'cost_price' => $price, ]); $special = HomeSpecialModel::create([ 'product_id' => $product->id, 'sort' => $sort, 'status' => HomeSpecialModel::STATUS_NORMAL, ]); return [$store, $product, $level, $special]; } /** 游客:返回推荐商品,price=null,成本价不输出 */ public function test_guest_sees_specials_with_null_price(): void { [, $product] = $this->makeSpecial(); $data = $this->getJson('/mini/special/list')->assertOk()->json('data'); $this->assertSame(1, $data['total']); $row = $data['data'][0]; $this->assertSame($product->name, $row['name']); $this->assertNull($row['price'], '未登录不显示价格'); $this->assertArrayNotHasKey('cost_price', $row, '成本价不得输出到小程序端'); } /** 登录门店:按等级上浮比例换算价(成本价 20 上浮 30% = 26.00) */ public function test_store_sees_level_price(): void { [$store, $product, $level] = $this->makeSpecial('20.00'); $level->update(['percent' => 30]); $this->actingAsMiniStore($store); $row = $this->getJson('/mini/special/list')->assertOk()->json('data.data.0'); $this->assertSame($product->id, $row['id']); $this->assertSame('26.00', $row['price']); } /** 停用推荐与下架商品的推荐不展示 */ public function test_disabled_special_and_off_shelf_product_excluded(): void { [, $productOn] = $this->makeSpecial(); $offProduct = ProductModel::factory()->create(['status' => ProductModel::STATUS_OFF]); HomeSpecialModel::create(['product_id' => $offProduct->id, 'sort' => 0, 'status' => 1]); $disabledProduct = ProductModel::factory()->create(['status' => ProductModel::STATUS_ON]); HomeSpecialModel::create(['product_id' => $disabledProduct->id, 'sort' => 0, 'status' => 0]); $data = $this->getJson('/mini/special/list')->assertOk()->json('data'); $this->assertSame(1, $data['total']); $this->assertSame($productOn->id, $data['data'][0]['id']); } /** 按推荐排序 sort 升序(越小越靠前) */ public function test_specials_sorted_by_sort_asc(): void { [, $productB] = $this->makeSpecial('5.00', 5); [, $productA] = $this->makeSpecial('6.00', 1); $rows = $this->getJson('/mini/special/list')->assertOk()->json('data.data'); $this->assertSame($productA->id, $rows[0]['id'], 'sort=1 应排在 sort=5 前'); $this->assertSame($productB->id, $rows[1]['id']); } /** 登录门店:购物车行 ID 与数量随行输出(供列表直接加减) */ public function test_cart_quantity_attached_for_store(): void { [$store, $product] = $this->makeSpecial(); CartModel::create([ 'store_id' => $store->id, 'product_id' => $product->id, 'quantity' => '2.00', ]); $this->actingAsMiniStore($store); $row = $this->getJson('/mini/special/list')->assertOk()->json('data.data.0'); $this->assertGreaterThan(0, $row['cart_id']); $this->assertSame('2.00', $row['cart_quantity']); } }