/**
  * Initialize data for configurable product
  *
  * @param Helper $subject
  * @param ProductInterface $product
  * @return ProductInterface
  * @throws \InvalidArgumentException
  *
  * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  */
 public function afterInitialize(Helper $subject, ProductInterface $product)
 {
     $attributes = $this->request->getParam('attributes');
     $productData = $this->request->getPost('product', []);
     if ($product->getTypeId() !== ConfigurableProduct::TYPE_CODE || empty($attributes)) {
         return $product;
     }
     $setId = $this->request->getPost('new-variations-attribute-set-id');
     if ($setId) {
         $product->setAttributeSetId($setId);
     }
     $extensionAttributes = $product->getExtensionAttributes();
     $product->setNewVariationsAttributeSetId($setId);
     $configurableOptions = [];
     if (!empty($productData['configurable_attributes_data'])) {
         $configurableOptions = $this->optionsFactory->create((array) $productData['configurable_attributes_data']);
     }
     $extensionAttributes->setConfigurableProductOptions($configurableOptions);
     $this->setLinkedProducts($product, $extensionAttributes);
     $product->setCanSaveConfigurableAttributes((bool) $this->request->getPost('affect_configurable_product_attributes'));
     $product->setExtensionAttributes($extensionAttributes);
     return $product;
 }
 /**
  * @covers Configurable::afterInitialize
  */
 public function testAfterInitializeWithAttributesAndWithoutVariations()
 {
     $attributes = [['attribute_id' => 90, 'values' => [['value_index' => 12], ['value_index' => 13]]]];
     $valueMap = [['new-variations-attribute-set-id', null, 24], ['associated_product_ids', [], []], ['product', [], ['configurable_attributes_data' => $attributes]]];
     $paramValueMap = [['variations-matrix', [], []], ['attributes', null, $attributes]];
     $this->product->expects(static::once())->method('getTypeId')->willReturn(ConfigurableProduct::TYPE_CODE);
     $this->request->expects(static::any())->method('getPost')->willReturnMap($valueMap);
     $this->request->expects(static::any())->method('getParam')->willReturnMap($paramValueMap);
     $extensionAttributes = $this->getMockBuilder(ProductExtensionAttributes::class)->disableOriginalConstructor()->setMethods(['setConfigurableProductOptions', 'setConfigurableProductLinks'])->getMockForAbstractClass();
     $this->product->expects(static::once())->method('getExtensionAttributes')->willReturn($extensionAttributes);
     $this->optionFactory->expects(static::once())->method('create')->with($attributes)->willReturn($attributes);
     $extensionAttributes->expects(static::once())->method('setConfigurableProductOptions')->with($attributes);
     $this->variationHandler->expects(static::never())->method('generateSimpleProducts');
     $extensionAttributes->expects(static::once())->method('setConfigurableProductLinks');
     $this->product->expects(static::once())->method('setExtensionAttributes')->with($extensionAttributes);
     $this->plugin->afterInitialize($this->subject, $this->product);
 }
 /**
  * @covers \Magento\ConfigurableProduct\Helper\Product\Options\Factory::create
  */
 public function testCreate()
 {
     $attributeId = 90;
     $valueIndex = 12;
     $item = ['attribute_id' => $attributeId, 'values' => [['value_index' => $valueIndex]]];
     $data = [$item];
     $attribute = $this->getMockBuilder(Attribute::class)->disableOriginalConstructor()->setMethods(['setValues', 'setData', '__wakeup'])->getMock();
     $this->attributeFactory->expects(static::once())->method('create')->willReturn($attribute);
     $eavAttribute = $this->getMockBuilder(EavAttribute::class)->disableOriginalConstructor()->getMock();
     $this->productAttributeRepository->expects(static::once())->method('get')->with($attributeId)->willReturn($eavAttribute);
     $this->configurable->expects(static::once())->method('canUseAttribute')->with($eavAttribute)->willReturn(true);
     $option = $this->getMock(OptionValueInterface::class);
     $option->expects(static::once())->method('setValueIndex')->with($valueIndex)->willReturnSelf();
     $this->optionValueFactory->expects(static::once())->method('create')->willReturn($option);
     $attribute->expects(static::once())->method('setData')->with($item);
     $attribute->expects(static::once())->method('setValues')->with([$option]);
     $result = $this->factory->create($data);
     static::assertSame([$attribute], $result);
 }