diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46fc3a4aa..a9baec3c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,3 +54,9 @@ jobs: - name: Execute trigger tests run: set -e && vendor/bin/codecept run trigger + + - name: Persist test artifacts + uses: actions/upload-artifact@v1 + with: + name: test_artifacts + path: tests/_output diff --git a/tests/functional/Shop/GuestCheckoutCest.php b/tests/functional/Shop/GuestCheckoutCest.php index d6a66f732..ea712b673 100644 --- a/tests/functional/Shop/GuestCheckoutCest.php +++ b/tests/functional/Shop/GuestCheckoutCest.php @@ -1,6 +1,8 @@ faker = Factory::create(); $pConfigDefault = [ - 'productInventory' => ['qty' => $this->faker->randomNumber(2)], - 'attributeValues' => [ - 'status' => true, - 'new' => 1, + 'productInventory' => ['qty' => $this->faker->randomNumber(2)], + 'attributeValues' => [ + 'status' => true, + 'new' => 1, 'guest_checkout' => 0 ], ]; $pConfigGuestCheckout = [ - 'productInventory' => ['qty' => $this->faker->randomNumber(2)], - 'attributeValues' => [ - 'status' => true, - 'new' => 1, + 'productInventory' => ['qty' => $this->faker->randomNumber(2)], + 'attributeValues' => [ + 'status' => true, + 'new' => 1, 'guest_checkout' => 1 ], ]; @@ -38,53 +41,69 @@ class GuestCheckoutCest $this->productGuestCheckout->refresh(); } - public function testGuestCheckout(FunctionalTester $I) { + /** + * @param FunctionalTester $I + * @param Example $example + * + * @dataProvider guestCheckoutProvider + */ + public function testGuestCheckout(FunctionalTester $I, Example $example): void + { + $product = ($example['guest_product']) ? $this->productGuestCheckout : $this->productNoGuestCheckout; + $I->amGoingTo('try to add products to cart with guest checkout turned on or off'); - $scenarios = [ + $I->wantTo('test conjunction "' . $example['name'] . '" with globalConfig = ' . $example['globalConfig'] . ' && product config = ' . $product->getAttribute('guest_checkout')); + $I->setConfigData(['catalog.products.guest-checkout.allow-guest-checkout' => $example['globalConfig']]); + $I->assertEquals($example['globalConfig'], + core()->getConfigData('catalog.products.guest-checkout.allow-guest-checkout')); + $I->amOnRoute('shop.home.index'); + $I->see($product->name, '//div[@class="product-information"]/div[@class="product-name"]'); + $I->click(__('shop::app.products.add-to-cart'), + '//form[input[@name="product_id"][@value="' . $product->id . '"]]/button'); + $I->seeInSource(__('shop::app.checkout.cart.item.success')); + $I->amOnRoute('shop.checkout.cart.index'); + $I->see('Shopping Cart', '//div[@class="title"]'); + $I->makeHtmlSnapshot('guestCheckout_' . $example['globalConfig'] . '_' . $product->getAttribute('guest_checkout')); + $I->see($product->name, '//div[@class="item-title"]'); + $I->click(__('shop::app.checkout.cart.proceed-to-checkout'), + '//a[@href="' . route('shop.checkout.onepage.index') . '"]'); + $I->seeCurrentRouteIs($example['expectedRoute']); + $cart = Cart::getCart(); + $I->assertTrue(Cart::removeItem($cart->items[0]->id)); + } + + protected function guestCheckoutProvider(): array + { + return [ [ - 'name' => 'false / false', - 'globalConfig' => 0, - 'product' => $this->productNoGuestCheckout, + 'name' => 'false / false', + 'globalConfig' => 0, + 'guest_product' => false, + 'product' => $this->productNoGuestCheckout, 'expectedRoute' => 'customer.session.index' ], [ - 'name' => 'false / true', - 'globalConfig' => 0, - 'product' => $this->productGuestCheckout, + 'name' => 'false / true', + 'globalConfig' => 0, + 'guest_product' => true, + 'product' => $this->productGuestCheckout, 'expectedRoute' => 'customer.session.index' ], [ - 'name' => 'true / false', - 'globalConfig' => 1, - 'product' => $this->productNoGuestCheckout, + 'name' => 'true / false', + 'globalConfig' => 1, + 'guest_product' => false, + 'product' => $this->productNoGuestCheckout, 'expectedRoute' => 'customer.session.index' ], [ - 'name' => 'true / true', - 'globalConfig' => 1, - 'product' => $this->productGuestCheckout, + 'name' => 'true / true', + 'globalConfig' => 1, + 'guest_product' => true, + 'product' => $this->productGuestCheckout, 'expectedRoute' => 'shop.checkout.onepage.index' ], ]; - - foreach ($scenarios as $scenario) { - $I->wantTo('test conjunction "' . $scenario['name'] . '" with globalConfig = ' . $scenario['globalConfig'] . ' && product config = ' . $scenario['product']->getAttribute('guest_checkout')); - $I->setConfigData(['catalog.products.guest-checkout.allow-guest-checkout' => $scenario['globalConfig']]); - $I->assertEquals($scenario['globalConfig'], core()->getConfigData('catalog.products.guest-checkout.allow-guest-checkout')); - $I->amOnRoute('shop.home.index'); - $I->see($scenario['product']->name, '//div[@class="product-information"]/div[@class="product-name"]'); - $I->click(__('shop::app.products.add-to-cart'), - '//form[input[@name="product_id"][@value="' . $scenario['product']->id . '"]]/button'); - $I->seeInSource(__('shop::app.checkout.cart.item.success')); - $I->amOnRoute('shop.checkout.cart.index'); - $I->see('Shopping Cart', '//div[@class="title"]'); - $I->makeHtmlSnapshot('guestCheckout_'.$scenario['globalConfig'].'_'.$scenario['product']->getAttribute('guest_checkout')); - $I->see($scenario['product']->name, '//div[@class="item-title"]'); - $I->click( __('shop::app.checkout.cart.proceed-to-checkout'), '//a[@href="' . route('shop.checkout.onepage.index') . '"]'); - $I->seeCurrentRouteIs($scenario['expectedRoute']); - $cart = Cart::getCart(); - $I->assertTrue(Cart::removeItem($cart->items[0]->id)); - } } } \ No newline at end of file