From db00689a5c8057b9bb0596c57c85e0db6c209a28 Mon Sep 17 00:00:00 2001 From: Florian Bosdorff Date: Thu, 23 Jan 2020 13:11:47 +0100 Subject: [PATCH] add basic backend tests --- .../Factories/AttributeFamilyFactory.php | 15 +++ .../Factories/SubscriberListFactory.php | 14 +++ .../Factories/CustomerAddressFactory.php | 26 +++++ .../Database/Factories/CustomerFactory.php | 36 +++++++ .../Factories/CustomerGroupFactory.php | 15 +++ .../src/Providers/CustomerServiceProvider.php | 25 +++++ .../Factories/ProductReviewFactory.php | 20 ++++ .../Factories/InventorySourceFactory.php | 25 +++++ .../src/Database/Factories/InvoiceFactory.php | 61 +++++++++++ .../Factories/OrderAddressFactory.php | 34 ++++++ .../src/Database/Factories/OrderFactory.php | 65 +++++++++++ .../src/Database/Factories/RefundFactory.php | 16 +++ .../Database/Factories/ShipmentFactory.php | 22 ++++ .../src/Providers/SalesServiceProvider.php | 17 +++ tests/_support/Helper/DataMocker.php | 29 +++++ tests/functional.suite.yml | 1 + .../Admin/Catalog/AttributeCest.php | 102 ++++++++++++++++++ .../Admin/Catalog/AttributeFamilyCest.php | 86 +++++++++++++++ .../functional/Admin/Catalog/CategoryCest.php | 23 ++++ .../Catalog}/ProductCest.php | 37 +++++-- .../Admin/Customer/CustomerCest.php | 26 +++++ .../functional/Admin/Customer/GroupsCest.php | 25 +++++ .../Customer/NewsletterSubscriptionCest.php | 24 +++++ .../functional/Admin/Customer/ReviewCest.php | 26 +++++ tests/functional/Admin/Sales/InvoiceCest.php | 30 ++++++ tests/functional/Admin/Sales/OrderCest.php | 26 +++++ tests/functional/Admin/Sales/RefundCest.php | 23 ++++ .../functional/Admin/Sales/ShipmentsCest.php | 24 +++++ 28 files changed, 862 insertions(+), 11 deletions(-) create mode 100644 packages/Webkul/Attribute/src/Database/Factories/AttributeFamilyFactory.php create mode 100644 packages/Webkul/Core/src/Database/Factories/SubscriberListFactory.php create mode 100644 packages/Webkul/Customer/src/Database/Factories/CustomerAddressFactory.php create mode 100644 packages/Webkul/Customer/src/Database/Factories/CustomerFactory.php create mode 100644 packages/Webkul/Customer/src/Database/Factories/CustomerGroupFactory.php create mode 100644 packages/Webkul/Product/src/Database/Factories/ProductReviewFactory.php create mode 100644 packages/Webkul/Sales/src/Database/Factories/InventorySourceFactory.php create mode 100644 packages/Webkul/Sales/src/Database/Factories/InvoiceFactory.php create mode 100644 packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php create mode 100644 packages/Webkul/Sales/src/Database/Factories/OrderFactory.php create mode 100644 packages/Webkul/Sales/src/Database/Factories/RefundFactory.php create mode 100644 packages/Webkul/Sales/src/Database/Factories/ShipmentFactory.php create mode 100644 tests/_support/Helper/DataMocker.php create mode 100644 tests/functional/Admin/Catalog/AttributeCest.php create mode 100644 tests/functional/Admin/Catalog/AttributeFamilyCest.php create mode 100644 tests/functional/Admin/Catalog/CategoryCest.php rename tests/functional/{Product => Admin/Catalog}/ProductCest.php (69%) create mode 100644 tests/functional/Admin/Customer/CustomerCest.php create mode 100644 tests/functional/Admin/Customer/GroupsCest.php create mode 100644 tests/functional/Admin/Customer/NewsletterSubscriptionCest.php create mode 100644 tests/functional/Admin/Customer/ReviewCest.php create mode 100644 tests/functional/Admin/Sales/InvoiceCest.php create mode 100644 tests/functional/Admin/Sales/OrderCest.php create mode 100644 tests/functional/Admin/Sales/RefundCest.php create mode 100644 tests/functional/Admin/Sales/ShipmentsCest.php diff --git a/packages/Webkul/Attribute/src/Database/Factories/AttributeFamilyFactory.php b/packages/Webkul/Attribute/src/Database/Factories/AttributeFamilyFactory.php new file mode 100644 index 000000000..bf4eb0fc5 --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Factories/AttributeFamilyFactory.php @@ -0,0 +1,15 @@ +define(AttributeFamily::class, function (Faker $faker) { + return [ + 'name' => $faker->word(), + 'code' => $faker->word(), + 'is_user_defined' => rand(0, 1), + 'status' => 0, + ]; +}); diff --git a/packages/Webkul/Core/src/Database/Factories/SubscriberListFactory.php b/packages/Webkul/Core/src/Database/Factories/SubscriberListFactory.php new file mode 100644 index 000000000..947e8cf2e --- /dev/null +++ b/packages/Webkul/Core/src/Database/Factories/SubscriberListFactory.php @@ -0,0 +1,14 @@ +define(SubscribersList::class, function (Faker $faker) { + return [ + 'email' => $faker->safeEmail, + 'is_subscribed' => $faker->boolean, + 'channel_id' => 1, + ]; +}); diff --git a/packages/Webkul/Customer/src/Database/Factories/CustomerAddressFactory.php b/packages/Webkul/Customer/src/Database/Factories/CustomerAddressFactory.php new file mode 100644 index 000000000..37a59c419 --- /dev/null +++ b/packages/Webkul/Customer/src/Database/Factories/CustomerAddressFactory.php @@ -0,0 +1,26 @@ +define(CustomerAddress::class, function (Faker $faker) { + return [ + 'customer_id' => function () { + return factory(Customer::class)->create()->id; + }, + 'name' => $faker->name, + 'address1' => $faker->streetAddress, + 'country' => $faker->countryCode, + 'state' => $faker->state, + 'city' => $faker->city, + 'postcode' => $faker->postcode, + 'phone' => $faker->e164PhoneNumber, + 'default_address' => array_random([0, 1]), + ]; +}); + + + diff --git a/packages/Webkul/Customer/src/Database/Factories/CustomerFactory.php b/packages/Webkul/Customer/src/Database/Factories/CustomerFactory.php new file mode 100644 index 000000000..844cf4178 --- /dev/null +++ b/packages/Webkul/Customer/src/Database/Factories/CustomerFactory.php @@ -0,0 +1,36 @@ +define(Customer::class, function (Faker $faker) { + $now = date("Y-m-d H:i:s"); + $gender = array_rand(['male', 'female', 'other']); + $password = $faker->password; + return [ + 'first_name' => $faker->firstName($gender), + 'last_name' => $faker->lastName, + 'gender' => ucfirst($gender), + 'email' => $faker->email, + 'status' => 1, + 'password' => Hash::make($password), + 'customer_group_id' => 2, + 'is_verified' => 1, + 'created_at' => $now, + 'updated_at' => $now, + 'notes' => json_encode(array('plain_password' => $password)), + ]; +}); + +$factory->state(Customer::class, 'male', [ + 'gender' => 'Male', +]); + +$factory->state(Customer::class, 'female', [ + 'gender' => 'Female', +]); + + diff --git a/packages/Webkul/Customer/src/Database/Factories/CustomerGroupFactory.php b/packages/Webkul/Customer/src/Database/Factories/CustomerGroupFactory.php new file mode 100644 index 000000000..5c554880e --- /dev/null +++ b/packages/Webkul/Customer/src/Database/Factories/CustomerGroupFactory.php @@ -0,0 +1,15 @@ +define(CustomerGroup::class, function (Faker $faker) { + $name = ucfirst($faker->word); + return [ + 'name' => $name, + 'is_user_defined' => $faker->boolean, + 'code' => lcfirst($name), + ]; +}); diff --git a/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php b/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php index 7311c808c..f12f69d6e 100755 --- a/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php +++ b/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php @@ -2,6 +2,7 @@ namespace Webkul\Customer\Providers; +use Illuminate\Database\Eloquent\Factory as EloquentFactory; use Illuminate\Support\ServiceProvider; use Illuminate\Routing\Router; use Webkul\Customer\Http\Middleware\RedirectIfNotCustomer; @@ -16,4 +17,28 @@ class CustomerServiceProvider extends ServiceProvider $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); } + + /** + * Register services. + * + * @return void + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + public function register() + { + $this->registerEloquentFactoriesFrom(__DIR__ . '/../Database/Factories'); + } + + /** + * Register factories. + * + * @param string $path + * + * @return void + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function registerEloquentFactoriesFrom($path): void + { + $this->app->make(EloquentFactory::class)->load($path); + } } diff --git a/packages/Webkul/Product/src/Database/Factories/ProductReviewFactory.php b/packages/Webkul/Product/src/Database/Factories/ProductReviewFactory.php new file mode 100644 index 000000000..aa3cb85f1 --- /dev/null +++ b/packages/Webkul/Product/src/Database/Factories/ProductReviewFactory.php @@ -0,0 +1,20 @@ +define(ProductReview::class, function (Faker $faker, array $attributes) { + if (!array_key_exists('product_id', $attributes)) { + throw new InvalidArgumentException('product_id must be provided. You may use $I->haveProduct() to generate a product'); + } + + return [ + 'title' => $faker->words(5, true), + 'rating' => $faker->numberBetween(0, 10), + 'status' => 1, + 'comment' => $faker->sentence(20), + 'product_id' => $attributes['product_id'], + ]; +}); diff --git a/packages/Webkul/Sales/src/Database/Factories/InventorySourceFactory.php b/packages/Webkul/Sales/src/Database/Factories/InventorySourceFactory.php new file mode 100644 index 000000000..48594e2fa --- /dev/null +++ b/packages/Webkul/Sales/src/Database/Factories/InventorySourceFactory.php @@ -0,0 +1,25 @@ +define(InventorySource::class, function (Faker $faker) { + $code = $faker->unique()->word; + return [ + 'code' => $faker->unique()->word, + 'name' => $code, + 'description' => $faker->sentence, + 'contact_name' => $faker->name, + 'contact_email' => $faker->safeEmail, + 'contact_number' => $faker->phoneNumber, + 'country' => $faker->countryCode, + 'state' => $faker->state, + 'city' => $faker->city, + 'street' => $faker->streetAddress, + 'postcode' => $faker->postcode, + 'priority' => 0, + 'status' => 1, + ]; +}); diff --git a/packages/Webkul/Sales/src/Database/Factories/InvoiceFactory.php b/packages/Webkul/Sales/src/Database/Factories/InvoiceFactory.php new file mode 100644 index 000000000..18bdaf569 --- /dev/null +++ b/packages/Webkul/Sales/src/Database/Factories/InvoiceFactory.php @@ -0,0 +1,61 @@ +define(Invoice::class, function (Faker $faker, array $attributes) { + $subTotal = $faker->randomFloat(2); + $shippingAmount = $faker->randomFloat(2); + $taxAmount = $faker->randomFloat(2); + + if (!$attributes['order_id']) { + $attributes['order_id'] = function () { + return factory(Order::class)->create()->id; + }; + } + + if (!$attributes['order_address_id']) { + $attributes['order_address_id'] = function () use ($attributes) { + return factory(OrderAddress::class) + ->create(['order_id' => $attributes['order_id']]) + ->id; + }; + } + + return [ + 'email_sent' => 0, + 'total_qty' => $faker->randomNumber(), + 'base_currency_code' => 'EUR', + 'channel_currency_code' => 'EUR', + 'order_currency_code' => 'EUR', + 'sub_total' => $subTotal, + 'base_sub_total' => $subTotal, + 'grand_total' => $subTotal, + 'base_grand_total' => $subTotal, + 'shipping_amount' => $shippingAmount, + 'base_shipping_amount' => $shippingAmount, + 'tax_amount' => $taxAmount, + 'base_tax_amount' => $taxAmount, + 'discount_amount' => 0, + 'base_discount_amount' => 0, + 'order_id' => $attributes['order_id'], + 'order_address_id' => $attributes['order_address_id'], + ]; +}); + +$factory->state(Invoice::class, 'pending', [ + 'status' => 'pending', +]); + +$factory->state(Invoice::class, 'paid', [ + 'status' => 'paid', +]); + +$factory->state(Invoice::class, 'refunded', [ + 'status' => 'refunded', +]); + diff --git a/packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php b/packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php new file mode 100644 index 000000000..12f1004f6 --- /dev/null +++ b/packages/Webkul/Sales/src/Database/Factories/OrderAddressFactory.php @@ -0,0 +1,34 @@ +define(OrderAddress::class, function (Faker $faker) { + $customer = factory(Customer::class)->create(); + $customerAddress = factory(CustomerAddress::class)->create(); + + return [ + 'first_name' => $customer->first_name, + 'last_name' => $customer->last_name, + 'email' => $customer->email, + 'address1' => $customerAddress->address1, + 'country' => $customerAddress->country, + 'state' => $customerAddress->state, + 'city' => $customerAddress->city, + 'postcode' => $customerAddress->postcode, + 'phone' => $customerAddress->phone, + 'address_type' => 'billing', + 'order_id' => function () { + return factory(Order::class)->create()->id; + }, + ]; +}); + +$factory->state(OrderAddress::class, 'shipping', [ + 'address_type' => 'shipping', +]); \ No newline at end of file diff --git a/packages/Webkul/Sales/src/Database/Factories/OrderFactory.php b/packages/Webkul/Sales/src/Database/Factories/OrderFactory.php new file mode 100644 index 000000000..78dcae3ba --- /dev/null +++ b/packages/Webkul/Sales/src/Database/Factories/OrderFactory.php @@ -0,0 +1,65 @@ +define(Order::class, function (Faker $faker) { + $lastOrder = DB::table('orders') + ->orderBy('id', 'desc') + ->select('id') + ->first() + ->id ?? 0; + + + $customer = factory(Customer::class)->create(); + + return [ + 'increment_id' => $lastOrder + 1, + 'status' => 'pending', + 'channel_name' => 'Default', + 'is_guest' => 0, + 'customer_id' => $customer->id, + 'customer_email' => $customer->email, + 'customer_first_name' => $customer->first_name, + 'customer_last_name' => $customer->last_name, + 'is_gift' => 0, + 'total_item_count' => 1, + 'total_qty_ordered' => 1, + 'base_currency_code' => 'EUR', + 'channel_currency_code' => 'EUR', + 'order_currency_code' => 'EUR', + 'grand_total' => 0.0000, + 'base_grand_total' => 0.0000, + 'grand_total_invoiced' => 0.0000, + 'base_grand_total_invoiced' => 0.0000, + 'grand_total_refunded' => 0.0000, + 'base_grand_total_refunded' => 0.0000, + 'sub_total' => 0.0000, + 'base_sub_total' => 0.0000, + 'sub_total_invoiced' => 0.0000, + 'base_sub_total_invoiced' => 0.0000, + 'sub_total_refunded' => 0.0000, + 'base_sub_total_refunded' => 0.0000, + 'customer_type' => Customer::class, + 'channel_id' => 1, + 'channel_type' => Channel::class, + 'cart_id' => 0, + ]; +}); + +$factory->state(Order::class, 'pending', [ + 'status' => 'pending', +]); + +$factory->state(Order::class, 'completed', [ + 'status' => 'completed', +]); + +$factory->state(Order::class, 'closed', [ + 'status' => 'closed', +]); diff --git a/packages/Webkul/Sales/src/Database/Factories/RefundFactory.php b/packages/Webkul/Sales/src/Database/Factories/RefundFactory.php new file mode 100644 index 000000000..c4a5ba62a --- /dev/null +++ b/packages/Webkul/Sales/src/Database/Factories/RefundFactory.php @@ -0,0 +1,16 @@ +define(Refund::class, function (Faker $faker, array $attributes) { + return [ + 'order_id' => function () { + return factory(Order::class)->create()->id; + }, + ]; +}); + diff --git a/packages/Webkul/Sales/src/Database/Factories/ShipmentFactory.php b/packages/Webkul/Sales/src/Database/Factories/ShipmentFactory.php new file mode 100644 index 000000000..4332e18d3 --- /dev/null +++ b/packages/Webkul/Sales/src/Database/Factories/ShipmentFactory.php @@ -0,0 +1,22 @@ +define(Shipment::class, function (Faker $faker) { + $address = factory(OrderAddress::class)->create(); + + return [ + 'total_qty' => $faker->numberBetween(1, 20), + 'order_id' => $address->order_id, + 'order_address_id' => $address->id, + 'inventory_source_id' => function () { + return factory(InventorySource::class)->create()->id; + }, + ]; +}); + diff --git a/packages/Webkul/Sales/src/Providers/SalesServiceProvider.php b/packages/Webkul/Sales/src/Providers/SalesServiceProvider.php index b450176d9..a3d2a6003 100755 --- a/packages/Webkul/Sales/src/Providers/SalesServiceProvider.php +++ b/packages/Webkul/Sales/src/Providers/SalesServiceProvider.php @@ -2,6 +2,7 @@ namespace Webkul\Sales\Providers; +use Illuminate\Database\Eloquent\Factory as EloquentFactory; use Illuminate\Support\ServiceProvider; class SalesServiceProvider extends ServiceProvider @@ -15,11 +16,27 @@ class SalesServiceProvider extends ServiceProvider * Register services. * * @return void + * @throws \Illuminate\Contracts\Container\BindingResolutionException */ public function register() { + $this->registerEloquentFactoriesFrom(__DIR__ . '/../Database/Factories'); + $this->mergeConfigFrom( dirname(__DIR__) . '/Config/system.php', 'core' ); } + + /** + * Register factories. + * + * @param string $path + * + * @return void + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function registerEloquentFactoriesFrom($path): void + { + $this->app->make(EloquentFactory::class)->load($path); + } } \ No newline at end of file diff --git a/tests/_support/Helper/DataMocker.php b/tests/_support/Helper/DataMocker.php new file mode 100644 index 000000000..536e2dbef --- /dev/null +++ b/tests/_support/Helper/DataMocker.php @@ -0,0 +1,29 @@ +have(Attribute::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.catalog'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.attributes'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.catalog.attributes.index'); + $I->see($attribute->id, '//script[@type="text/x-template"]'); + $I->see($attribute->admin_name, '//script[@type="text/x-template"]'); + } + + public function testCreate(FunctionalTester $I): void + { + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.catalog.attributes.index'); + + $I->click('Add Attribute', '//*[contains(@class, "page-action")]'); + $I->seeCurrentRouteIs('admin.catalog.attributes.create'); + + $I->click('Save Attribute', '//*[contains(@class, "page-action")]'); + $I->seeFormHasErrors(); + + $testData = $this->fillForm($I); + $I->click('Save Attribute', '//*[contains(@class, "page-action")]'); + + $I->dontSeeFormErrors(); + $I->seeCurrentRouteIs('admin.catalog.attributes.index'); + $I->seeRecord(Attribute::class, $testData); + } + + public function testEdit(FunctionalTester $I): void + { + $attribute = $I->have(Attribute::class, ['use_in_flat' => 0]); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.catalog.attributes.index'); + + $route = route('admin.catalog.attributes.edit', ['id' => $attribute->id]); + $I->seeInSource($route); + $I->amOnPage($route); + $I->seeCurrentRouteIs('admin.catalog.attributes.edit'); + + $I->fillField('admin_name', ''); + $I->click('Save Attribute', '//*[contains(@class, "page-action")]'); + $I->seeFormHasErrors(); + + $testData = $this->fillForm($I, true); + $testData['id'] = $attribute->id; + $I->click('Save Attribute', '//*[contains(@class, "page-action")]'); + + $I->dontSeeFormErrors(); + $I->seeRecord(Attribute::class, $testData); + $I->seeCurrentRouteIs('admin.catalog.attributes.index'); + } + + /** + * @param FunctionalTester $I + * + * @param bool $skipType + * + * @return array with the test-data + */ + private function fillForm(FunctionalTester $I, bool $skipType = false): array + { + $testData = [ + 'code' => $I->fake()->word, + 'type' => $I->fake()->randomElement([ + 'text', + 'textarea', + 'price', + 'boolean', + 'select', + 'multiselect' + ]), + 'admin_name' => $I->fake()->word, + ]; + + $I->fillField('code', $testData['code']); + $I->fillField('admin_name', $testData['admin_name']); + + if ($skipType) { + unset($testData['type']); + } else { + $I->selectOption('type', $testData['type']); + } + + return $testData; + } +} diff --git a/tests/functional/Admin/Catalog/AttributeFamilyCest.php b/tests/functional/Admin/Catalog/AttributeFamilyCest.php new file mode 100644 index 000000000..9c17e02d6 --- /dev/null +++ b/tests/functional/Admin/Catalog/AttributeFamilyCest.php @@ -0,0 +1,86 @@ +have(AttributeFamily::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.catalog'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.attribute-families'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.catalog.families.index'); + $I->see($attributeFamily->id, '//script[@type="text/x-template"]'); + $I->see($attributeFamily->name, '//script[@type="text/x-template"]'); + } + + public function testCreate(FunctionalTester $I): void + { + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.catalog.families.index'); + + $I->click(__('admin::app.catalog.families.add-family-btn-title'), '//*[contains(@class, "page-action")]'); + $I->seeCurrentRouteIs('admin.catalog.families.create'); + + $I->click(__('admin::app.catalog.families.save-btn-title'), '//*[contains(@class, "page-action")]'); + $I->seeFormHasErrors(); + + $testData = $this->fillForm($I); + $I->click(__('admin::app.catalog.families.save-btn-title'), '//*[contains(@class, "page-action")]'); + + $I->dontSeeFormErrors(); + $I->seeCurrentRouteIs('admin.catalog.families.index'); + $I->seeRecord(AttributeFamily::class, $testData); + } + + public function testEdit(FunctionalTester $I): void + { + $attributeFamily = $I->have(AttributeFamily::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.catalog.families.index'); + + $route = route('admin.catalog.families.edit', ['id' => $attributeFamily->id]); + $I->seeInSource($route); + $I->amOnPage($route); + $I->seeCurrentRouteIs('admin.catalog.families.edit'); + + $I->fillField('name', ''); + $I->click(__('admin::app.catalog.families.save-btn-title'), '//*[contains(@class, "page-action")]'); + $I->seeFormHasErrors(); + + $testData = $this->fillForm($I); + $testData['id'] = $attributeFamily->id; + $I->click(__('admin::app.catalog.families.save-btn-title'), '//*[contains(@class, "page-action")]'); + + $I->dontSeeFormErrors(); + $I->seeRecord(AttributeFamily::class, $testData); + $I->seeCurrentRouteIs('admin.catalog.families.index'); + } + + /** + * @param FunctionalTester $I + * + * @return array with the test-data + */ + private function fillForm(FunctionalTester $I): array + { + $testData = [ + 'code' => $I->fake()->word, + 'name' => $I->fake()->word, + ]; + + $I->fillField('code', $testData['code']); + $I->fillField('name', $testData['name']); + + return $testData; + } +} diff --git a/tests/functional/Admin/Catalog/CategoryCest.php b/tests/functional/Admin/Catalog/CategoryCest.php new file mode 100644 index 000000000..a4dbaccda --- /dev/null +++ b/tests/functional/Admin/Catalog/CategoryCest.php @@ -0,0 +1,23 @@ +have(Category::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.catalog'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.categories'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.catalog.categories.index'); + $I->see($category->id, '//script[@type="text/x-template"]'); + $I->see($category->name, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Product/ProductCest.php b/tests/functional/Admin/Catalog/ProductCest.php similarity index 69% rename from tests/functional/Product/ProductCest.php rename to tests/functional/Admin/Catalog/ProductCest.php index f8f4b18bf..d666fd90a 100644 --- a/tests/functional/Product/ProductCest.php +++ b/tests/functional/Admin/Catalog/ProductCest.php @@ -1,7 +1,6 @@ faker = Factory::create(); @@ -55,22 +54,38 @@ class ProductCest } - public function selectEmptyAttributeOptionOnProductCreation(FunctionalTester $I) + public function testIndex(FunctionalTester $I): void + { + $product = $I->haveProduct([], ['simple']); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.catalog'), '//*[contains(@class, "navbar-left")]'); + $I->seeCurrentRouteIs('admin.catalog.products.index'); + $I->click(__('admin::app.layouts.products'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.catalog.products.index'); + $I->see($product->id, '//script[@type="text/x-template"]'); + $I->see($product->name, '//script[@type="text/x-template"]'); + } + + public function selectEmptyAttributeOptionOnProductCreation(FunctionalTester $I): void { $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.catalog.products.index'); - $I->amOnAdminRoute('admin.catalog.products.create'); - $I->see(__('admin::app.catalog.products.add-title'), 'h1'); + $I->click(__('admin::app.catalog.products.add-product-btn-title'), '//*[contains(@class, "page-action")]'); + $I->seeCurrentRouteIs('admin.catalog.products.create'); - $I->selectOption('select#type', 'simple'); + $I->selectOption('type', 'simple'); $attributeFamily = $I->grabRecord(AttributeFamily::class, [ 'code' => 'default', ]); - $I->selectOption('select#attribute_family_id', $attributeFamily->id); + $I->selectOption('attribute_family_id', $attributeFamily->id); - $sku = $this->faker->uuid; + $sku = $this->faker->randomNumber(3); $I->fillField('sku', $sku); $I->click(__('admin::app.catalog.products.save-btn-title')); @@ -89,8 +104,8 @@ class ProductCest $I->fillField('price', $this->faker->randomFloat(2)); $I->fillField('weight', $this->faker->randomDigit); - $I->fillField('#short_description', $this->faker->paragraph(1, true)); - $I->fillField('#description', $this->faker->paragraph(5, true)); + $I->fillField('short_description', $this->faker->paragraph(1, true)); + $I->fillField('description', $this->faker->paragraph(5, true)); $I->click(__('admin::app.catalog.products.save-btn-title')); diff --git a/tests/functional/Admin/Customer/CustomerCest.php b/tests/functional/Admin/Customer/CustomerCest.php new file mode 100644 index 000000000..4ac5d4bb6 --- /dev/null +++ b/tests/functional/Admin/Customer/CustomerCest.php @@ -0,0 +1,26 @@ +have(Customer::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.customers'), '//*[contains(@class, "navbar-left")]'); + $I->seeCurrentRouteIs('admin.customer.index'); + $I->click(__('admin::app.layouts.customers'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.customer.index'); + $I->see($customer->id, '//script[@type="text/x-template"]'); + $I->see($customer->name, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Admin/Customer/GroupsCest.php b/tests/functional/Admin/Customer/GroupsCest.php new file mode 100644 index 000000000..22db609e2 --- /dev/null +++ b/tests/functional/Admin/Customer/GroupsCest.php @@ -0,0 +1,25 @@ +have(CustomerGroup::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.customers'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.groups'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.groups.index'); + $I->see($group->id, '//script[@type="text/x-template"]'); + $I->see($group->name, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Admin/Customer/NewsletterSubscriptionCest.php b/tests/functional/Admin/Customer/NewsletterSubscriptionCest.php new file mode 100644 index 000000000..f52aef90d --- /dev/null +++ b/tests/functional/Admin/Customer/NewsletterSubscriptionCest.php @@ -0,0 +1,24 @@ +have(SubscribersList::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.customers'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.newsletter-subscriptions'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.customers.subscribers.index'); + $I->see($subscriber->id, '//script[@type="text/x-template"]'); + $I->see($subscriber->email, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Admin/Customer/ReviewCest.php b/tests/functional/Admin/Customer/ReviewCest.php new file mode 100644 index 000000000..bd04f1c81 --- /dev/null +++ b/tests/functional/Admin/Customer/ReviewCest.php @@ -0,0 +1,26 @@ +haveProduct([], ['simple']); + $review = $I->have(ProductReview::class, ['product_id' => $product->id]); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.customers'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.reviews'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.customer.review.index'); + $I->see($review->id, '//script[@type="text/x-template"]'); + $I->see($review->title, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Admin/Sales/InvoiceCest.php b/tests/functional/Admin/Sales/InvoiceCest.php new file mode 100644 index 000000000..7734db70c --- /dev/null +++ b/tests/functional/Admin/Sales/InvoiceCest.php @@ -0,0 +1,30 @@ +have(OrderAddress::class); + $invoice = $I->have(Invoice::class, + [ + 'order_id' => $orderAddress->order_id, + 'order_address_id' => $orderAddress->id + ]); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.sales'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.invoices'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.sales.invoices.index'); + $I->see($invoice->id, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Admin/Sales/OrderCest.php b/tests/functional/Admin/Sales/OrderCest.php new file mode 100644 index 000000000..f48aa0aa9 --- /dev/null +++ b/tests/functional/Admin/Sales/OrderCest.php @@ -0,0 +1,26 @@ +have(Order::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.sales'), '//*[contains(@class, "navbar-left")]'); + $I->seeCurrentRouteIs('admin.sales.orders.index'); + $I->click(__('admin::app.layouts.orders'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.sales.orders.index'); + $I->see($order->id, '//script[@type="text/x-template"]'); + $I->see($order->sub_total, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Admin/Sales/RefundCest.php b/tests/functional/Admin/Sales/RefundCest.php new file mode 100644 index 000000000..c9fbc943c --- /dev/null +++ b/tests/functional/Admin/Sales/RefundCest.php @@ -0,0 +1,23 @@ +have(Refund::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.sales'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.refunds'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.sales.refunds.index'); + $I->see($refund->id, '//script[@type="text/x-template"]'); + } +} diff --git a/tests/functional/Admin/Sales/ShipmentsCest.php b/tests/functional/Admin/Sales/ShipmentsCest.php new file mode 100644 index 000000000..541598868 --- /dev/null +++ b/tests/functional/Admin/Sales/ShipmentsCest.php @@ -0,0 +1,24 @@ +have(Shipment::class); + + $I->loginAsAdmin(); + $I->amOnAdminRoute('admin.dashboard.index'); + $I->click(__('admin::app.layouts.sales'), '//*[contains(@class, "navbar-left")]'); + $I->click(__('admin::app.layouts.shipments'), '//*[contains(@class, "aside-nav")]'); + + $I->seeCurrentRouteIs('admin.sales.shipments.index'); + $I->see($shipment->id, '//script[@type="text/x-template"]'); + $I->see($shipment->total_qty, '//script[@type="text/x-template"]'); + } +}