function it_throws_an_exception_if_reference_data_does_not_exist($attrValidatorHelper, $repositoryResolver, ObjectRepository $repository, ProductInterface $product, AttributeInterface $attribute)
 {
     $attribute->getReferenceDataName()->willReturn('customMaterials');
     $attribute->getCode()->willReturn('lace_fabric');
     $attrValidatorHelper->validateLocale(Argument::cetera())->shouldBeCalled();
     $attrValidatorHelper->validateScope(Argument::cetera())->shouldBeCalled();
     $repositoryResolver->resolve('customMaterials')->willReturn($repository);
     $repository->findOneBy(['code' => 'hulk_retriever'])->willReturn(null);
     $exception = InvalidArgumentException::validEntityCodeExpected('lace_fabric', 'code', 'No reference data "customMaterials" with code "hulk_retriever" has been found', 'setter', 'reference data', 'hulk_retriever');
     $this->shouldThrow($exception)->during('setAttributeData', [$product, $attribute, 'hulk_retriever', ['locale' => 'fr_FR', 'scope' => 'mobile']]);
 }
 /**
  * {@inheritdoc}
  *
  * Expected data input format: "option_code"
  */
 public function setAttributeData(ProductInterface $product, AttributeInterface $attribute, $data, array $options = [])
 {
     $options = $this->resolver->resolve($options);
     $this->checkLocaleAndScope($attribute, $options['locale'], $options['scope'], 'text');
     $this->checkData($attribute, $data);
     if (null === $data) {
         $option = null;
     } else {
         $option = $this->getOption($attribute, $data);
         if (null === $option) {
             throw InvalidArgumentException::validEntityCodeExpected($attribute->getCode(), 'code', 'The option does not exist', 'setter', 'simple select', $data);
         }
     }
     $this->setOption($product, $attribute, $option, $options['locale'], $options['scope']);
 }
 /**
  * {@inheritdoc}
  */
 public function setAttributeData(ProductInterface $product, AttributeInterface $attribute, $data, array $options = [])
 {
     $this->checkLocaleAndScope($attribute, $options['locale'], $options['scope'], 'reference data');
     $this->checkData($attribute, $data);
     if (empty($data)) {
         $referenceData = null;
     } else {
         $repository = $this->repositoryResolver->resolve($attribute->getReferenceDataName());
         $referenceData = $repository->findOneBy(['code' => $data]);
         if (null === $referenceData) {
             throw InvalidArgumentException::validEntityCodeExpected($attribute->getCode(), 'code', sprintf('No reference data "%s" with code "%s" has been found', $attribute->getReferenceDataName(), $data), 'setter', 'reference data', $data);
         }
     }
     $this->setReferenceData($attribute, $product, $referenceData, $options['locale'], $options['scope']);
 }
 /**
  * @param AttributeInterface $attribute
  * @param string             $value
  *
  * @return int
  */
 protected function valueCodesToIds(AttributeInterface $attribute, $value)
 {
     try {
         $value = $this->idsResolver->resolve($attribute->getReferenceDataName(), $value);
     } catch (\LogicException $e) {
         throw InvalidArgumentException::validEntityCodeExpected($attribute->getCode(), 'code', $e->getMessage(), 'setter', 'reference data', implode(',', $value));
     }
     return $value;
 }
 function it_throws_an_error_if_the_attribute_data_option_does_not_exist(AttributeInterface $attribute, ProductInterface $product)
 {
     $attribute->getCode()->willReturn('attributeCode');
     $data = 'unknown code';
     $this->shouldThrow(InvalidArgumentException::validEntityCodeExpected('attributeCode', 'code', 'The option does not exist', 'setter', 'simple select', $data))->duringSetAttributeData($product, $attribute, $data, ['locale' => 'fr_FR', 'scope' => 'mobile']);
 }