test: add coupon-order integration tests
This commit is contained in:
1 parent
7a954edb71
commit
8da8322ede
1 file changed
+69
@@ -0,0 +1,69 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Bazaar\Tests;
|
||||||
|
|
||||||
|
use Bazaar\Core\Session;
|
||||||
|
use Bazaar\Repositories\CouponRepository;
|
||||||
|
use Bazaar\Repositories\OrderRepository;
|
||||||
|
use Bazaar\Repositories\ProductRepository;
|
||||||
|
use Bazaar\Repositories\UserRepository;
|
||||||
|
use Bazaar\Services\Cart;
|
||||||
|
use Bazaar\Services\CouponService;
|
||||||
|
use Bazaar\Services\OrderService;
|
||||||
|
|
||||||
|
final class CouponOrderTest extends DatabaseTestCase
|
||||||
|
{
|
||||||
|
private CouponRepository $coupons;
|
||||||
|
private CouponService $couponService;
|
||||||
|
private OrderRepository $orders;
|
||||||
|
private ProductRepository $products;
|
||||||
|
private OrderService $service;
|
||||||
|
private int $userId;
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
$this->coupons = new CouponRepository($this->db);
|
||||||
|
$this->couponService = new CouponService($this->coupons);
|
||||||
|
$this->orders = new OrderRepository($this->db);
|
||||||
|
$this->products = new ProductRepository($this->db);
|
||||||
|
$this->service = new OrderService($this->db, $this->orders, $this->products, null, $this->coupons);
|
||||||
|
$this->userId = (new UserRepository($this->db))->create('coup@bazaar.test', 'hash', 'Coup');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDiscountReducesStoredTotalAndIsRedeemedOnPaid(): void
|
||||||
|
{
|
||||||
|
$couponId = $this->coupons->create([
|
||||||
|
'code' => 'TENOFF',
|
||||||
|
'type' => 'percent',
|
||||||
|
'value' => 10,
|
||||||
|
'minSubtotalCents' => 0,
|
||||||
|
'maxRedemptions' => 5,
|
||||||
|
'startsAt' => null,
|
||||||
|
'expiresAt' => null,
|
||||||
|
'isActive' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$productId = $this->seedProduct('Chair', 10000, 10);
|
||||||
|
$cart = new Cart(new Session(), $this->products);
|
||||||
|
$cart->add($productId, 1);
|
||||||
|
|
||||||
|
$evaluation = $this->couponService->evaluate('TENOFF', $cart->totalCents());
|
||||||
|
$this->assertTrue($evaluation->isValid());
|
||||||
|
$this->assertSame(1000, $evaluation->discountCents);
|
||||||
|
|
||||||
|
$orderId = $this->service->createFromCart($this->userId, $cart, 'usd', [
|
||||||
|
'discountCents' => $evaluation->discountCents,
|
||||||
|
'couponCode' => 'TENOFF',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$order = $this->orders->find($orderId);
|
||||||
|
$this->assertSame(9000, (int) $order['totalCents']);
|
||||||
|
$this->assertSame(1000, (int) $order['discountCents']);
|
||||||
|
$this->assertSame('TENOFF', $order['couponCode']);
|
||||||
|
$this->assertSame(0, (int) $this->coupons->find($couponId)['redeemedCount']);
|
||||||
|
|
||||||
|
$this->service->markPaid($orderId);
|
||||||
|
$this->assertSame(1, (int) $this->coupons->find($couponId)['redeemedCount']);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user