fix: poprawny koszt transportu na /koszyk-podsumowanie

Na podstronie /koszyk-podsumowanie transport z flaga delivery_free=1
byl pokazywany zawsze za 0,00 zl, niezaleznie od wartosci koszyka.
Teraz kontroler wylicza transport_cost_effective i free_delivery_applies
uwzgledniajac prog settings.free_delivery, a szablon uzywa tych kluczy.

- Nowa chroniona metoda ShopBasketController::calculateTransportCostForSummary
- Dodane 6 testow jednostkowych (ShopBasketControllerSummaryViewTest)
- Suita: 834 testy / 2318 assertions OK

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jacek
2026-04-20 20:50:15 +02:00
parent 494cb580d3
commit eee22ef1c4
11 changed files with 577 additions and 21 deletions

View File

@@ -0,0 +1,120 @@
<?php
namespace Tests\Unit\front\Controllers;
use PHPUnit\Framework\TestCase;
use front\Controllers\ShopBasketController;
use Domain\Order\OrderRepository;
use Domain\PaymentMethod\PaymentMethodRepository;
class ShopBasketControllerSummaryViewTest extends TestCase
{
private $controller;
protected function setUp(): void
{
$orderRepository = $this->createMock(OrderRepository::class);
$paymentMethodRepository = $this->createMock(PaymentMethodRepository::class);
$this->controller = new ShopBasketController($orderRepository, $paymentMethodRepository);
}
/**
* Wywoluje chroniona metode calculateTransportCostForSummary przez Reflection.
*
* @param array|null $transport
* @param float $productsSummary
* @param float $freeDeliveryThreshold
* @return array
*/
private function invokeCalc($transport, $productsSummary, $freeDeliveryThreshold): array
{
$reflection = new \ReflectionClass(ShopBasketController::class);
$method = $reflection->getMethod('calculateTransportCostForSummary');
$method->setAccessible(true);
return $method->invoke($this->controller, $transport, $productsSummary, $freeDeliveryThreshold);
}
public function testTransportWithDeliveryFreeBelowThresholdShowsRealCost(): void
{
// AC-1: delivery_free=1, basket 150, threshold 300 -> cost 15.00
$transport = [
'id' => 4,
'cost' => 15.00,
'delivery_free' => 1,
];
$result = $this->invokeCalc($transport, 150.00, 300.00);
$this->assertFalse($result['free_delivery_applies']);
$this->assertSame(15.00, $result['transport_cost_effective']);
}
public function testTransportWithDeliveryFreeAboveThresholdShowsZero(): void
{
// AC-2: delivery_free=1, basket 350, threshold 300 -> cost 0.0, applies true
$transport = [
'id' => 4,
'cost' => 15.00,
'delivery_free' => 1,
];
$result = $this->invokeCalc($transport, 350.00, 300.00);
$this->assertTrue($result['free_delivery_applies']);
$this->assertSame(0.0, $result['transport_cost_effective']);
}
public function testTransportWithDeliveryFreeAtExactThresholdShowsZero(): void
{
// Boundary: basket == threshold should trigger free delivery
$transport = [
'id' => 4,
'cost' => 20.00,
'delivery_free' => 1,
];
$result = $this->invokeCalc($transport, 300.00, 300.00);
$this->assertTrue($result['free_delivery_applies']);
$this->assertSame(0.0, $result['transport_cost_effective']);
}
public function testTransportWithoutDeliveryFreeAlwaysShowsCost(): void
{
// AC-3: delivery_free=0, basket 500, threshold 300 -> cost 25.00, applies false
$transport = [
'id' => 5,
'cost' => 25.00,
'delivery_free' => 0,
];
$result = $this->invokeCalc($transport, 500.00, 300.00);
$this->assertFalse($result['free_delivery_applies']);
$this->assertSame(25.00, $result['transport_cost_effective']);
}
public function testNullTransportReturnsZeroAndDoesNotApply(): void
{
// Scenario: no transport selected yet (findActiveByIdCached zwrocil null)
$result = $this->invokeCalc(null, 500.00, 300.00);
$this->assertFalse($result['free_delivery_applies']);
$this->assertSame(0.0, $result['transport_cost_effective']);
}
public function testZeroFreeDeliveryThresholdDisablesFreeDelivery(): void
{
// Ochrona: jesli settings.free_delivery = 0, darmowa dostawa nie dziala nigdy
$transport = [
'id' => 4,
'cost' => 15.00,
'delivery_free' => 1,
];
$result = $this->invokeCalc($transport, 9999.00, 0.00);
$this->assertFalse($result['free_delivery_applies']);
$this->assertSame(15.00, $result['transport_cost_effective']);
}
}