From b5f0c1db79f999e1425a5eb3a13a22255d6bd43e Mon Sep 17 00:00:00 2001 From: MonaHartdegen Date: Fri, 13 Dec 2019 14:59:45 +0100 Subject: [PATCH] added attribute (-related) factories; added functional test --- .../Database/Factories/AttributeFactory.php | 84 +++++++++++++ .../Factories/AttributeOptionFactory.php | 83 +++++++++++++ .../Providers/AttributeServiceProvider.php | 3 + tests/functional/Product/ProductCest.php | 113 ++++++++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 packages/Webkul/Attribute/src/Database/Factories/AttributeFactory.php create mode 100644 packages/Webkul/Attribute/src/Database/Factories/AttributeOptionFactory.php create mode 100644 tests/functional/Product/ProductCest.php diff --git a/packages/Webkul/Attribute/src/Database/Factories/AttributeFactory.php b/packages/Webkul/Attribute/src/Database/Factories/AttributeFactory.php new file mode 100644 index 000000000..95a538780 --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Factories/AttributeFactory.php @@ -0,0 +1,84 @@ +define(Attribute::class, function (Faker $faker, array $attributes) { + $types = [ + 'text', + 'textarea', + 'price', + 'boolean', + 'select', + 'multiselect', + 'datetime', + 'date', + 'image', + 'file', + 'checkbox', + ]; + + $locales = Locale::pluck('code')->all(); + + // array $attributes does not contain any locale code + if (count(array_diff_key(array_flip($locales), $attributes) ) === count($locales)) { + $localeCode = $locales[0]; + + $attributes[$localeCode] = [ + 'name' => $faker->word, + ]; + } + + return [ + 'admin_name' => $faker->word, + 'code' => $faker->word, + 'type' => array_rand($types), + 'validation' => '', + 'position' => $faker->randomDigit, + 'is_required' => false, + 'is_unique' => false, + 'value_per_locale' => false, + 'value_per_channel' => false, + 'is_filterable' => false, + 'is_configurable' => false, + 'is_user_defined' => true, + 'is_visible_on_front' => true, + 'swatch_type' => null, + 'use_in_flat' => true, + ]; +}); + +$factory->state(Attribute::class, 'validation_numeric', [ + 'validation' => 'numeric', +]); + +$factory->state(Attribute::class, 'validation_email', [ + 'validation' => 'email', +]); + +$factory->state(Attribute::class, 'validation_decimal', [ + 'validation' => 'decimal', +]); + +$factory->state(Attribute::class, 'validation_url', [ + 'validation' => 'url', +]); + +$factory->state(Attribute::class, 'required', [ + 'is_required' => true, +]); + +$factory->state(Attribute::class, 'unique', [ + 'is_unique' => true, +]); + +$factory->state(Attribute::class, 'filterable', [ + 'is_filterable' => true, +]); + +$factory->state(Attribute::class, 'configurable', [ + 'is_configurable' => true, +]); \ No newline at end of file diff --git a/packages/Webkul/Attribute/src/Database/Factories/AttributeOptionFactory.php b/packages/Webkul/Attribute/src/Database/Factories/AttributeOptionFactory.php new file mode 100644 index 000000000..2612fcc76 --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Factories/AttributeOptionFactory.php @@ -0,0 +1,83 @@ +define(AttributeOption::class, function (Faker $faker, array $attributes) { + + $locales = Locale::pluck('code')->all(); + + // array $attributes does not contain any locale code + if (count(array_diff_key(array_flip($locales), $attributes) ) === count($locales)) { + $localeCode = $locales[0]; + + $attributes[$localeCode] = [ + 'label' => $faker->word, + ]; + } + + return [ + 'admin_name' => $faker->word, + 'sort_order' => $faker->randomDigit, + 'attribute_id' => function () { + return factory(Attribute::class)->create()->id; + }, + 'swatch_value' => null, + ]; +}); + +$factory->defineAs(AttributeOption::class, 'swatch_color', function (Faker $faker, array $attributes) { + return [ + 'admin_name' => $faker->word, + 'sort_order' => $faker->randomDigit, + 'attribute_id' => function () { + return factory(Attribute::class) + ->create(['swatch_type' => 'color']) + ->id; + }, + 'swatch_value' => $faker->hexColor, + ]; +}); + +$factory->defineAs(AttributeOption::class, 'swatch_image', function (Faker $faker, array $attributes) { + return [ + 'admin_name' => $faker->word, + 'sort_order' => $faker->randomDigit, + 'attribute_id' => function () { + return factory(Attribute::class) + ->create(['swatch_type' => 'image']) + ->id; + }, + 'swatch_value' => '/tests/_data/ProductImageExampleForUpload.jpg', + ]; +}); + +$factory->defineAs(AttributeOption::class, 'swatch_dropdown', function (Faker $faker, array $attributes) { + return [ + 'admin_name' => $faker->word, + 'sort_order' => $faker->randomDigit, + 'attribute_id' => function () { + return factory(Attribute::class) + ->create(['swatch_type' => 'dropdown']) + ->id; + }, + 'swatch_value' => null, + ]; +}); + +$factory->defineAs(AttributeOption::class, 'swatch_text', function (Faker $faker, array $attributes) { + return [ + 'admin_name' => $faker->word, + 'sort_order' => $faker->randomDigit, + 'attribute_id' => function () { + return factory(Attribute::class) + ->create(['swatch_type' => 'text']) + ->id; + }, + 'swatch_value' => null, + ]; +}); \ No newline at end of file diff --git a/packages/Webkul/Attribute/src/Providers/AttributeServiceProvider.php b/packages/Webkul/Attribute/src/Providers/AttributeServiceProvider.php index fa312fe69..72a4daea1 100755 --- a/packages/Webkul/Attribute/src/Providers/AttributeServiceProvider.php +++ b/packages/Webkul/Attribute/src/Providers/AttributeServiceProvider.php @@ -2,6 +2,7 @@ namespace Webkul\Attribute\Providers; +use Illuminate\Database\Eloquent\Factory as EloquentFactory; use Illuminate\Support\ServiceProvider; class AttributeServiceProvider extends ServiceProvider @@ -14,6 +15,8 @@ class AttributeServiceProvider extends ServiceProvider public function boot() { $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); + + $this->app->make(EloquentFactory::class)->load(__DIR__ . '/../Database/Factories'); } /** diff --git a/tests/functional/Product/ProductCest.php b/tests/functional/Product/ProductCest.php new file mode 100644 index 000000000..c4e24f810 --- /dev/null +++ b/tests/functional/Product/ProductCest.php @@ -0,0 +1,113 @@ +faker = Factory::create(); + + $this->attributeBrand = $I->grabRecord(Attribute::class, [ + 'code' => 'brand', + 'admin_name' => 'Brand', + ]); + + $locales = Locale::pluck('code')->all(); + + $defaultAttributeOptionAttributes = [ + 'attribute_id' => $this->attributeBrand->id, + 'admin_name' => 'no-brand', + 'sort_order' => 0, + ]; + + foreach ($locales as $locale) { + $defaultAttributeOptionAttributes[$locale] = [ + 'label' => '', + ]; + } + + $this->attributeBrandDefaultOption = $I->have(AttributeOption::class, + $defaultAttributeOptionAttributes); + $this->attributeBrandOption = $I->have(AttributeOption::class, [ + 'attribute_id' => $this->attributeBrand->id, + ]); + + } + + public function selectEmptyAttributeOptionOnProductCreation(FunctionalTester $I) + { + $I->loginAsAdmin(); + + $I->amOnAdminRoute('admin.catalog.products.create'); + $I->see(__('admin::app.catalog.products.add-title'), 'h1'); + + $I->selectOption('select#type', 'simple'); + + $attributeFamily = $I->grabRecord(AttributeFamily::class, [ + 'code' => 'default', + ]); + + $I->selectOption('select#attribute_family_id', $attributeFamily->id); + + $sku = $this->faker->randomNumber(3); + + $I->fillField('sku', $sku); + $I->click(__('admin::app.catalog.products.save-btn-title')); + + $I->seeInSource('Product created successfully.'); + + $I->seeCurrentRouteIs('admin.catalog.products.edit'); + + $productTitle = $this->faker->word; + $productUrlKey = $this->faker->slug; + + $I->fillField('name', $productTitle); + $I->fillField('url_key', $productUrlKey); + $I->selectOption($this->attributeBrand->code, + $this->attributeBrandDefaultOption->id); + $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->click(__('admin::app.catalog.products.save-btn-title')); + + $I->seeInSource('Product updated successfully.'); + $I->seeCurrentRouteIs('admin.catalog.products.index'); + + $product = $I->grabRecord(Product::class, [ + 'sku' => $sku, + 'type' => 'simple', + 'attribute_family_id' => $attributeFamily->id, + ]); + + $I->seeRecord(ProductAttributeValue::class, [ + 'product_id' => $product->id, + 'attribute_id' => $this->attributeBrand->id, + 'integer_value' => $this->attributeBrandDefaultOption->id, + 'text_value' => null, + ]); + } +}