From 76dbdb42dd26149ed069d2a29a5519dbdfcb35d2 Mon Sep 17 00:00:00 2001 From: Annika Wolff Date: Tue, 1 Sep 2020 10:50:16 +0200 Subject: [PATCH] fix adding multiple booking products to cart --- .../BookingProduct/src/Type/Booking.php | 13 +- tests/unit/Checkout/Cart/CartCest.php | 215 ++++++++++++++++- tests/unit/Checkout/CartCest.php | 226 ------------------ 3 files changed, 220 insertions(+), 234 deletions(-) delete mode 100644 tests/unit/Checkout/CartCest.php diff --git a/packages/Webkul/BookingProduct/src/Type/Booking.php b/packages/Webkul/BookingProduct/src/Type/Booking.php index 5e4696434..eddd8731b 100644 --- a/packages/Webkul/BookingProduct/src/Type/Booking.php +++ b/packages/Webkul/BookingProduct/src/Type/Booking.php @@ -200,6 +200,7 @@ class Booking extends Virtual continue; } + $data['quantity'] = $qty; $data['booking']['ticket_id'] = $ticketId; $cartProducts = parent::prepareForCart($data); @@ -232,17 +233,15 @@ class Booking extends Virtual */ public function compareOptions($options1, $options2) { - if ($this->product->id != $options2['product_id']) { + if ($this->product->id !== $options2['product_id']) { return false; } - if (isset($options1['booking']) && isset($options2['booking'])) { - return $options1['booking'] == $options2['booking']; - } elseif (! isset($options1['booking'])) { - return false; - } elseif (! isset($options2['booking'])) { - return false; + if (isset($options1['booking'], $options2['booking'])) { + return true; } + + return false; } /** diff --git a/tests/unit/Checkout/Cart/CartCest.php b/tests/unit/Checkout/Cart/CartCest.php index 8a11cf4b4..0baad7700 100644 --- a/tests/unit/Checkout/Cart/CartCest.php +++ b/tests/unit/Checkout/Cart/CartCest.php @@ -2,11 +2,17 @@ namespace Tests\Unit\Checkout\Cart; +use Codeception\Example; +use Exception; use Faker\Factory; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Event; use UnitTester; +use Webkul\BookingProduct\Models\BookingProduct; +use Webkul\BookingProduct\Models\BookingProductEventTicket; use Webkul\Core\Helpers\Laravel5Helper; +use Webkul\Customer\Models\Customer; +use Webkul\Product\Models\ProductDownloadableLink; class CartCest { @@ -17,8 +23,9 @@ class CartCest private $virtualProduct2; private $downloadableProduct1; private $downloadableProduct2; + private $customer; - public function _before(UnitTester $I) + public function _before(UnitTester $I): void { $this->faker = Factory::create(); @@ -56,6 +63,8 @@ class CartCest $this->downloadableProduct1 = $I->haveProduct(Laravel5Helper::DOWNLOADABLE_PRODUCT); $this->downloadableProduct2 = $I->haveProduct(Laravel5Helper::DOWNLOADABLE_PRODUCT); + + $this->customer = $I->have(Customer::class); } public function testCartWithInactiveProducts(UnitTester $I) @@ -135,6 +144,210 @@ class CartCest $I->assertEquals(5, cart()->getCart()->items()->find($cartItemId)->quantity); } + /** + * @param UnitTester $I + * @param Example $scenario + * + * @throws Exception + * + * @dataProvider getMergeCartScenarios + */ + public function testMergeCart(UnitTester $I, Example $scenario): void + { + $product1 = $I->haveProduct($scenario['product_type1']); + $product2 = $I->haveProduct($scenario['product_type2']); + + if ($scenario['product_type1'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { + $downloadableLink1 = ProductDownloadableLink::query()->where('product_id', $product1->id)->firstOrFail(); + $I->assertNotNull($downloadableLink1); + } + if ($scenario['product_type1'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { + $bookingProduct = BookingProduct::query()->where('product_id', $product1->id)->firstOrFail(); + $I->assertNotNull($bookingProduct); + $bookingTicket1 = BookingProductEventTicket::query()->where('booking_product_id', + $bookingProduct->id)->firstOrFail(); + $I->assertNotNull($bookingTicket1); + } + + if ($scenario['product_type2'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { + $downloadableLink2 = ProductDownloadableLink::query()->where('product_id', $product2->id)->firstOrFail(); + $I->assertNotNull($downloadableLink2); + } + if ($scenario['product_type2'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { + $bookingProduct = BookingProduct::query()->where('product_id', $product2->id)->firstOrFail(); + $I->assertNotNull($bookingProduct); + $bookingTicket2 = BookingProductEventTicket::query()->where('booking_product_id', + $bookingProduct->id)->firstOrFail(); + $I->assertNotNull($bookingTicket2); + } + + $I->comment("Check, I'm a guest"); + $this->cleanUp(); + $I->assertFalse(auth()->guard('customer')->check()); + $I->assertNull(cart()->getCart()); + + $data = [ + '_token' => session('_token'), + 'quantity' => 1, + 'product_id' => $product1->id, + ]; + if ($scenario['product_type1'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { + $data['links'] = [$downloadableLink1->id]; + } + if ($scenario['product_type1'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { + $data['booking'] = ['qty' => [$bookingTicket1->id => 1]]; + } + + $I->comment('A guest is adding a first product of type ' . $product1->type . ' to cart'); + cart()->addProduct($product1->id, $data); + $I->assertEquals(1, cart()->getCart()->items->count()); + + $I->comment('Guest is logging in...then guest is a known customer.'); + auth()->guard('customer')->onceUsingId($this->customer->id); + Event::dispatch('customer.after.login', $this->customer['email']); + $I->comment("Let us assume that the customer's shopping cart was empty. The individual product from the guest's shopping cart is transferred to the customer's shopping cart."); + $I->assertEquals(1, cart()->getCart()->items->count()); + + auth()->guard('customer')->logout(); + $data = [ + '_token' => session('_token'), + 'quantity' => 1, + 'product_id' => $product2->id, + ]; + if ($scenario['product_type2'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { + $data['links'] = [$downloadableLink2->id]; + } + if ($scenario['product_type2'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { + $data['booking'] = ['qty' => [$bookingTicket2->id => 1]]; + } + + $I->comment('Guest is adding a product of type ' . $product2->type . ' to cart.'); + cart()->addProduct($product2->id, $data); + $I->assertEquals(1, cart()->getCart()->items->count()); + + $I->comment('And will be logged in.'); + auth()->guard('customer')->onceUsingId($this->customer->id); + + Event::dispatch('customer.after.login', $this->customer['email']); + $I->assertEquals(2, cart()->getCart()->items->count()); + + auth()->guard('customer')->logout(); + $data = [ + '_token' => session('_token'), + 'quantity' => 2, + 'product_id' => $product1->id, + ]; + if ($scenario['product_type1'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { + $data['links'] = [$downloadableLink1->id]; + } + if ($scenario['product_type1'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { + $data['booking'] = ['qty' => [$bookingTicket1->id => 2]]; + } + + $I->comment('Again, guest is adding another product of type ' . $product1->type . '.'); + $I->assertNull(cart()->getCart()); + cart()->addProduct($product1->id, $data); + $I->assertEquals(1, cart()->getCart()->items->count()); + $I->assertEquals(2, cart()->getCart()->items_qty); + + $I->comment('And will be logged in.'); + auth()->guard('customer')->onceUsingId($this->customer->id); + + Event::dispatch('customer.after.login', $this->customer['email']); + $I->assertEquals(2, cart()->getCart()->items->count()); + $I->assertEquals(4, cart()->getCart()->items_qty); + + $this->cleanUp(); + $I->comment('=== DONE: Added ' . $product1->type . ' to ' . $product2->type . ' ==='); + } + + private function getMergeCartScenarios(): array + { + return [ + [ + 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, + 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, + 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, + 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, + 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, + 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, + 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, + 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, + 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + ], + [ + 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, + 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, + ], + ]; + } + + private function cleanUp(): void + { + $cart = cart()->getCart(); + + if ($cart) { + foreach ($cart->items as $item) { + cart()->removeItem($item->id); + } + } + + session()->forget('cart'); + + auth()->guard('customer')->logout(); + + session()->forget('cart'); + } + /** * @param int $productId * diff --git a/tests/unit/Checkout/CartCest.php b/tests/unit/Checkout/CartCest.php deleted file mode 100644 index f2d380861..000000000 --- a/tests/unit/Checkout/CartCest.php +++ /dev/null @@ -1,226 +0,0 @@ -customer = $I->have(Customer::class); - } - - /** - * @param UnitTester $I - * @param Example $scenario - * - * @throws Exception - * - * @dataProvider getMergeCartScenarios - */ - public function testMergeCart(UnitTester $I, Example $scenario): void - { - $product1 = $I->haveProduct($scenario['product_type1']); - $product2 = $I->haveProduct($scenario['product_type2']); - - if ($scenario['product_type1'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { - $downloadableLink1 = ProductDownloadableLink::query()->where('product_id', $product1->id)->firstOrFail(); - $I->assertNotNull($downloadableLink1); - } - if ($scenario['product_type1'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { - $bookingProduct = BookingProduct::query()->where('product_id', $product1->id)->firstOrFail(); - $I->assertNotNull($bookingProduct); - $bookingTicket1 = BookingProductEventTicket::query()->where('booking_product_id', - $bookingProduct->id)->firstOrFail(); - $I->assertNotNull($bookingTicket1); - } - - if ($scenario['product_type2'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { - $downloadableLink2 = ProductDownloadableLink::query()->where('product_id', $product2->id)->firstOrFail(); - $I->assertNotNull($downloadableLink2); - } - if ($scenario['product_type2'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { - $bookingProduct = BookingProduct::query()->where('product_id', $product2->id)->firstOrFail(); - $I->assertNotNull($bookingProduct); - $bookingTicket2 = BookingProductEventTicket::query()->where('booking_product_id', - $bookingProduct->id)->firstOrFail(); - $I->assertNotNull($bookingTicket2); - } - - $I->comment("Check, I'm a guest"); - $I->assertFalse(auth()->guard('customer')->check()); - $I->assertNull(cart()->getCart()); - - $data = [ - '_token' => session('_token'), - 'quantity' => 1, - 'product_id' => $product1->id, - ]; - if ($scenario['product_type1'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { - $data['links'] = [$downloadableLink1->id]; - } - if ($scenario['product_type1'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { - $data['booking'] = ['qty' => [$bookingTicket1->id => 1]]; - } - - $I->comment('A guest is adding a first product of type ' . $product1->type . ' to cart'); - cart()->addProduct($product1->id, $data); - $I->assertEquals(1, cart()->getCart()->items->count()); - - $I->comment('Guest is logging in...then guest is a known customer.'); - auth()->guard('customer')->onceUsingId($this->customer->id); - Event::dispatch('customer.after.login', $this->customer['email']); - $I->comment("Let us assume that the customer's shopping cart was empty. The individual product from the guest's shopping cart is transferred to the customer's shopping cart."); - $I->assertEquals(1, cart()->getCart()->items->count()); - - auth()->guard('customer')->logout(); - $data = [ - '_token' => session('_token'), - 'quantity' => 1, - 'product_id' => $product2->id, - ]; - if ($scenario['product_type2'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { - $data['links'] = [$downloadableLink2->id]; - } - if ($scenario['product_type2'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { - $data['booking'] = ['qty' => [$bookingTicket2->id => 1]]; - } - - $I->comment('Guest is adding a product of type ' . $product2->type . ' to cart.'); - cart()->addProduct($product2->id, $data); - $I->assertEquals(1, cart()->getCart()->items->count()); - - $I->comment('And will be logged in.'); - auth()->guard('customer')->onceUsingId($this->customer->id); - - Event::dispatch('customer.after.login', $this->customer['email']); - $I->assertEquals(2, cart()->getCart()->items->count()); - - auth()->guard('customer')->logout(); - $data = [ - '_token' => session('_token'), - 'quantity' => 2, - 'product_id' => $product1->id, - ]; - if ($scenario['product_type1'] === Laravel5Helper::DOWNLOADABLE_PRODUCT) { - $data['links'] = [$downloadableLink1->id]; - } - if ($scenario['product_type1'] === Laravel5Helper::BOOKING_EVENT_PRODUCT) { - $data['booking'] = ['qty' => [$bookingTicket1->id => 1]]; - } - - $I->comment('Again, guest is adding another product of type ' . $product1->type . '.'); - $I->assertNull(cart()->getCart()); - cart()->addProduct($product1->id, $data); - $I->assertEquals(1, cart()->getCart()->items->count()); - $I->assertEquals(2, cart()->getCart()->items_qty); - - $I->comment('And will be logged in.'); - auth()->guard('customer')->onceUsingId($this->customer->id); - - Event::dispatch('customer.after.login', $this->customer['email']); - $I->assertEquals(2, cart()->getCart()->items->count()); - $I->assertEquals(4, cart()->getCart()->items_qty); - - $this->cleanUp(); - $I->comment('=== DONE: Added ' . $product1->type . ' to ' . $product2->type . ' ==='); - } - - private function getMergeCartScenarios(): array - { - return [ - [ - 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, - 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, - 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, - 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, - 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, - 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, - 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - 'product_type2' => Laravel5Helper::SIMPLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::SIMPLE_PRODUCT, - 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - 'product_type2' => Laravel5Helper::VIRTUAL_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::VIRTUAL_PRODUCT, - 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - 'product_type2' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - ], - [ - 'product_type1' => Laravel5Helper::DOWNLOADABLE_PRODUCT, - 'product_type2' => Laravel5Helper::BOOKING_EVENT_PRODUCT, - ], - ]; - } - - private function cleanUp(): void - { - $cart = cart()->getCart(); - - if ($cart) { - foreach ($cart->items as $item) { - cart()->removeItem($item->id); - } - } - - session()->forget('cart'); - - auth()->guard('customer')->logout(); - - session()->forget('cart'); - } -} \ No newline at end of file