mock(ConfigService::class, function ($mock) { $mock->shouldReceive('isStore')->andReturn(false); }); $row = [ 'key' => 'tala18', 'name' => 'گرم ۱۸ tala.ir', 'price' => 165_000_000, 'profit' => 58_400, ]; $feed = [$row]; $this->mock(ZaarboxPriceService::class, function ($mock) use ($feed, $row) { $mock->shouldReceive('cachedPriceList')->with(false)->once()->andReturn($feed); $mock->shouldReceive('findFeedRow')->with($feed, 'tala18')->andReturn($row); $mock->shouldReceive('resolveReferenceProviderTotal')->with($row)->andReturn(165_058_400); $mock->shouldReceive('computeAdjustedProductPrice')->andReturn(165_058_400); }); $product = new Product([ 'id' => 13, 'reading_method' => 'tala18', 'use_last_price_if_zero' => false, 'price' => 0, 'active' => true, ]); app(ProductDisplayPriceService::class)->enrichForApi(collect([$product])); $this->assertSame(165_058_400, (int) $product->price); $this->assertTrue($product->getAttribute('reference_provider_active')); } public function test_reference_product_with_zero_provider_and_toggle_off_stays_unpriced(): void { $this->mock(ConfigService::class, function ($mock) { $mock->shouldReceive('isStore')->andReturn(false); }); $row = [ 'key' => 'tala18', 'name' => 'گرم ۱۸ tala.ir', 'price' => 0, 'profit' => 58_400, ]; $feed = [$row]; $this->mock(ZaarboxPriceService::class, function ($mock) use ($feed, $row) { $mock->shouldReceive('cachedPriceList')->with(false)->once()->andReturn($feed); $mock->shouldReceive('findFeedRow')->with($feed, 'tala18')->andReturn($row); $mock->shouldReceive('resolveReferenceProviderTotal')->with($row)->andReturn(0); }); $product = new Product([ 'id' => 13, 'reading_method' => 'tala18', 'use_last_price_if_zero' => false, 'price' => 99_000_000, 'active' => true, ]); $service = app(ProductDisplayPriceService::class); $service->enrichForApi(collect([$product])); $this->assertSame(0, (int) $product->price); $this->assertFalse($product->getAttribute('reference_provider_active')); $this->assertFalse($service->resolveCustomerShow($product)); } public function test_reference_product_with_zero_provider_and_toggle_on_uses_stored_fallback(): void { if (! Product::hasUseLastPriceIfZeroColumn()) { $this->markTestSkipped('use_last_price_if_zero column not present'); } $this->mock(ConfigService::class, function ($mock) { $mock->shouldReceive('isStore')->andReturn(false); $mock->shouldReceive('isProductWithinTradingHours')->andReturn(true); $mock->shouldReceive('getBool')->with('show_last_price', false)->andReturn(false); }); $row = [ 'key' => 'tala18', 'name' => 'گرم ۱۸ tala.ir', 'price' => 0, 'profit' => 0, ]; $feed = [$row]; $this->mock(ZaarboxPriceService::class, function ($mock) use ($feed, $row) { $mock->shouldReceive('cachedPriceList')->with(false)->once()->andReturn($feed); $mock->shouldReceive('findFeedRow')->with($feed, 'tala18')->andReturn($row); $mock->shouldReceive('resolveReferenceProviderTotal')->with($row)->andReturn(0); $mock->shouldReceive('computeAdjustedProductPrice')->andReturn(0); }); $product = new Product([ 'id' => 13, 'reading_method' => 'tala18', 'use_last_price_if_zero' => true, 'price' => 150_000_000, 'active' => true, ]); $service = app(ProductDisplayPriceService::class); $service->enrichForApi(collect([$product])); $this->assertSame(150_000_000, (int) $product->price); $this->assertTrue($product->getAttribute('reference_provider_active')); $this->assertTrue($service->resolveCustomerShow($product)); } public function test_missing_feed_with_toggle_off_zeros_reference_product(): void { $this->mock(ConfigService::class, function ($mock) { $mock->shouldReceive('isStore')->andReturn(false); }); $this->mock(ZaarboxPriceService::class, function ($mock) { $mock->shouldReceive('cachedPriceList')->with(false)->once()->andReturn(null); }); $product = new Product([ 'id' => 13, 'reading_method' => 'tala18', 'use_last_price_if_zero' => false, 'price' => 120_000_000, 'active' => true, ]); app(ProductDisplayPriceService::class)->enrichForApi(collect([$product])); $this->assertSame(0, (int) $product->price); $this->assertFalse($product->getAttribute('reference_provider_active')); } }