withPrices(2, 100)->create(); $this->assertEquals(2, $product->prices()->count()); $this->assertFalse($product->isOnSale()); $this->assertNotNull($product->defaultPrice()->first()); $this->assertEquals(100, $product->getCurrentPrice()); } /** @test */ public function it_returns_sale_price_when_on_sale() { $product = Product::factory() ->withPrices(2, 100) ->onSale( sale_price: 80, sale_start: now()->subDay(), sale_end: now()->addDay(), ) ->create(); $this->assertEquals(80, $product->getCurrentPrice()); } /** @test */ public function it_returns_regular_price_when_sale_has_ended() { $product = Product::factory()->create([ 'regular_price' => 100, 'sale_price' => 80, 'sale_start' => now()->subDays(7), 'sale_end' => now()->subDay(), ]); $this->assertEquals(100, $product->getCurrentPrice()); } /** @test */ public function it_returns_regular_price_when_sale_hasnt_started() { $product = Product::factory()->create([ 'regular_price' => 100, 'sale_price' => 80, 'sale_start' => now()->addDay(), 'sale_end' => now()->addWeek(), ]); $this->assertEquals(100, $product->getCurrentPrice()); } /** @test */ public function it_calculates_discount_percentage() { $product = Product::factory()->create([ 'regular_price' => 100, 'sale_price' => 75, ]); $discount = (($product->regular_price - $product->sale_price) / $product->regular_price) * 100; $this->assertEquals(25, $discount); } }