function it_provides_formatted_batch_config_for_the_job(GroupInterface $oroTshirt) { $oroTshirt->getCode()->willReturn('oro_tshirt'); $this->setGroup($oroTshirt); $this->setFilters([['id', 'IN', ['22', '7']]]); $this->getBatchConfig()->shouldReturn('{\\"filters\\":[[\\"id\\",\\"IN\\",[\\"22\\",\\"7\\"]]],\\"actions\\":{\\"field\\":\\"variant_group\\",\\"value\\":\\"oro_tshirt\\"}}'); }
function it_fails_if_the_group_code_is_not_found($groupRepository, ProductInterface $product, GroupInterface $pack, GroupTypeInterface $nonVariantType) { $groupRepository->findOneByIdentifier('not valid code')->willReturn(null); $pack->getType()->willReturn($nonVariantType); $nonVariantType->isVariant()->willReturn(false); $this->shouldThrow(InvalidArgumentException::expected('variant_group', 'existing variant group code', 'setter', 'variant_group', 'not valid code'))->during('setFieldData', [$product, 'variant_group', 'not valid code']); }
function it_normalizes_an_existing_product_into_mongodb_document($mongoFactory, $serializer, ProductInterface $product, \MongoId $mongoId, \MongoDate $mongoDate, Association $assoc1, Association $assoc2, CategoryInterface $category1, CategoryInterface $category2, GroupInterface $group1, GroupInterface $group2, ProductValueInterface $value1, ProductValueInterface $value2, FamilyInterface $family) { $mongoFactory->createMongoId('product1')->willReturn($mongoId); $mongoFactory->createMongoDate()->willReturn($mongoDate); $family->getId()->willReturn(36); $category1->getId()->willReturn(12); $category2->getId()->willReturn(34); $group1->getId()->willReturn(56); $group2->getId()->willReturn(78); $product->getId()->willReturn('product1'); $product->getCreated()->willReturn(null); $product->getFamily()->willReturn($family); $product->isEnabled()->willReturn(true); $product->getGroups()->willReturn([$group1, $group2]); $product->getCategories()->willReturn([$category1, $category2]); $product->getAssociations()->willReturn([$assoc1, $assoc2]); $product->getValues()->willReturn([$value1, $value2]); $context = ['_id' => $mongoId]; $serializer->normalize($product, 'mongodb_json')->willReturn(['data' => 'data', 'completenesses' => 'completenesses']); $serializer->normalize($value1, 'mongodb_document', $context)->willReturn('my_value_1'); $serializer->normalize($value2, 'mongodb_document', $context)->willReturn('my_value_2'); $serializer->normalize($assoc1, 'mongodb_document', $context)->willReturn('my_assoc_1'); $serializer->normalize($assoc2, 'mongodb_document', $context)->willReturn('my_assoc_2'); $this->normalize($product, 'mongodb_document')->shouldReturn(['_id' => $mongoId, 'created' => $mongoDate, 'updated' => $mongoDate, 'family' => 36, 'enabled' => true, 'groupIds' => [56, 78], 'categoryIds' => [12, 34], 'associations' => ['my_assoc_1', 'my_assoc_2'], 'values' => ['my_value_1', 'my_value_2'], 'normalizedData' => ['data' => 'data'], 'completenesses' => []]); }
function it_throws_an_error_if_type_is_unknown(GroupInterface $group) { $group->setCode('mycode')->shouldBeCalled(); $group->getId()->willReturn(null); $values = ['code' => 'mycode', 'type' => 'UNKNOWN']; $this->shouldThrow(new \InvalidArgumentException('Type "UNKNOWN" does not exist'))->during('update', [$group, $values, []]); }
/** * Bind products * * @param GroupInterface $group * @param array $appendProducts * @param array $removeProducts */ protected function bindProducts(GroupInterface $group, array $appendProducts, array $removeProducts) { foreach ($appendProducts as $product) { $group->addProduct($product); } foreach ($removeProducts as $product) { $group->removeProduct($product); } }
/** * Normalize the variant group values * * @param GroupInterface $group * @param string $format * @param array $context * * @return array */ protected function normalizeVariantGroupValues(GroupInterface $group, $format, array $context) { $valuesData = []; if ($group->getType()->isVariant() && null !== $group->getProductTemplate()) { $template = $group->getProductTemplate(); $valuesData = $template->getValuesData(); } return $valuesData; }
/** * @param VariantGroupAxis $constraint * @param GroupInterface $variantGroup */ protected function validateAttributeAxis(VariantGroupAxis $constraint, GroupInterface $variantGroup) { $allowedTypes = [AttributeTypes::OPTION_SIMPLE_SELECT, AttributeTypes::REFERENCE_DATA_SIMPLE_SELECT]; foreach ($variantGroup->getAxisAttributes() as $attribute) { if (!in_array($attribute->getAttributeType(), $allowedTypes)) { $this->addInvalidAxisViolation($constraint, $variantGroup->getCode(), $attribute->getCode()); } } }
function it_validates_products_with_one_variant_group($context, $onlyOneVariantGroup, ProductInterface $mug, GroupInterface $mugVariantGroup, GroupInterface $otherGroup, GroupTypeInterface $variantType, GroupTypeInterface $groupType) { $mug->getGroups()->willReturn([$mugVariantGroup, $otherGroup]); $mugVariantGroup->getType()->willReturn($variantType); $otherGroup->getType()->willReturn($groupType); $variantType->isVariant()->willReturn(true); $groupType->isVariant()->willReturn(false); $context->addViolation(Argument::any())->shouldNotBeCalled(); $this->validate($mug, $onlyOneVariantGroup); }
/** * Call when form is valid * * @param GroupInterface $group */ protected function onSuccess(GroupInterface $group) { $appendProducts = $this->form->get('appendProducts')->getData(); $removeProducts = $this->form->get('removeProducts')->getData(); $options = ['add_products' => $appendProducts, 'remove_products' => $removeProducts]; if ($group->getType()->isVariant()) { $options['copy_values_to_products'] = true; } $this->groupSaver->save($group, $options); }
function it_throws_an_error_if_axis_is_updated(GroupInterface $variantGroup) { $variantGroup->setCode('mycode')->shouldBeCalled(); $variantGroup->getId()->willReturn(42); $attribute = new Attribute(); $attribute->setCode('other'); $variantGroup->getAxisAttributes()->willReturn(new ArrayCollection([$attribute])); $values = ['code' => 'mycode', 'axis' => ['main_color']]; $this->shouldThrow(new \InvalidArgumentException('Attributes: This property cannot be changed.'))->during('update', [$variantGroup, $values, []]); }
/** * Get missing axis codes of a product given a variant group * * @param ProductInterface $product * @param GroupInterface $variantGroup * * @return array */ protected function getMissingAxisCodes(ProductInterface $product, GroupInterface $variantGroup) { $missingAxisCodes = []; foreach ($variantGroup->getAxisAttributes() as $attribute) { $value = $product->getValue($attribute->getCode()); if (null === $value || null === $value->getData()) { $missingAxisCodes[] = $attribute->getCode(); } } return $missingAxisCodes; }
function it_throws_an_exception_if_media_of_variant_group_is_not_found($normalizer, $denormalizer, ArrayCollection $productValuesCollection, ArrayCollection $mediaCollection, ProductMediaInterface $media, GroupInterface $variantGroup, ProductTemplateInterface $productTemplate, ProductValueInterface $productValue) { $variantGroup->getProductTemplate()->willReturn($productTemplate); $variantGroup->getCode()->willReturn('my_variant_group'); $productTemplate->getValuesData()->willReturn([$productValue]); $denormalizer->denormalize([$productValue], 'ProductValue[]', 'json')->willReturn($productValuesCollection); $productValuesCollection->filter(Argument::cetera())->willReturn($mediaCollection); $mediaCollection->toArray()->willReturn([$media]); $normalizer->normalize([$media], 'csv', ['field_name' => 'media', 'prepare_copy' => true, 'identifier' => 'my_variant_group'])->willThrow(new FileNotFoundException('upload/path/img.jpg')); $this->shouldThrow(new InvalidItemException('The file "upload/path/img.jpg" does not exist', ['item' => 'my_variant_group', 'uploadDirectory' => 'upload/path/']))->duringProcess($variantGroup); }
function it_returns_non_eligible_attributes($attributeRepository, GroupInterface $group, ProductTemplateInterface $template, AttributeInterface $length, AttributeInterface $name, AttributeInterface $color, AttributeInterface $identifier, Collection $collection) { $group->getProductTemplate()->willReturn($template); $group->getAxisAttributes()->willReturn($collection); $collection->toArray()->willReturn([$length]); $template->getValuesData()->willReturn(['name' => 'foo', 'color' => 'bar']); $attributeRepository->findOneByIdentifier('name')->willReturn($name); $attributeRepository->findOneByIdentifier('color')->willReturn($color); $attributeRepository->findBy(['unique' => true])->willReturn([$name, $identifier]); $attributes = [$length, $name, $color, $identifier]; $this->getNonEligibleAttributes($group)->shouldReturn($attributes); }
/** * Prepares media files present in the product template of the variant group for export. * Returns an array of files to be copied from 'filePath' to 'exportPath'. * * @param GroupInterface $group * * @throws InvalidItemException If a media file is not found * * @return array */ protected function prepareVariantGroupMedia(GroupInterface $group) { $mediaValues = $this->getProductTemplateMediaValues($group->getProductTemplate()); if (count($mediaValues) < 1) { return []; } try { return $this->normalizer->normalize($mediaValues, $this->format, ['field_name' => 'media', 'prepare_copy' => true, 'identifier' => $group->getCode()]); } catch (FileNotFoundException $e) { throw new InvalidItemException($e->getMessage(), ['item' => $group->getCode(), 'uploadDirectory' => $this->uploadDirectory]); } }
function it_provides_formatted_batch_config_for_the_job(GroupInterface $officeGroup, GroupInterface $bedroomGroup, ArrayCollection $groupCollection) { $officeGroup->getCode()->willReturn('office_room'); $bedroomGroup->getCode()->willReturn('bedroom'); $groupCollection->add($officeGroup); $groupCollection->add($bedroomGroup); $this->setGroups($groupCollection); $groupCollection->map(Argument::type('closure'))->willReturn($groupCollection); $groupCollection->toArray()->willReturn(['office_room', 'bedroom']); $this->setFilters([['id', 'IN', ['22', '7']]]); $this->getBatchConfig()->shouldReturn('{\\"filters\\":[[\\"id\\",\\"IN\\",[\\"22\\",\\"7\\"]]],\\"actions\\":[{\\"field\\":\\"groups\\",\\"value\\":[\\"office_room\\",\\"bedroom\\"]}]}'); }
/** * Validate variant group product template values * * @param GroupInterface $variantGroup * @param Constraint $constraint */ protected function validateProductTemplateValues(GroupInterface $variantGroup, Constraint $constraint) { $template = $variantGroup->getProductTemplate(); $valuesData = $template->getValuesData(); $forbiddenAttrCodes = $this->attributeRepository->findUniqueAttributeCodes(); foreach ($variantGroup->getAxisAttributes() as $axisAttribute) { $forbiddenAttrCodes[] = $axisAttribute->getCode(); } $invalidAttrCodes = array_intersect($forbiddenAttrCodes, array_keys($valuesData)); if (count($invalidAttrCodes) > 0) { $this->context->addViolation($constraint->message, array('%group%' => $variantGroup->getCode(), '%attributes%' => $this->formatValues($invalidAttrCodes))); } }
function it_does_not_copy_values_to_products_when_template_is_empty(GroupInterface $variantGroup, ProductTemplateInterface $productTemplate, Collection $productCollection, ProductInterface $productOne, ProductInterface $productTwo, $productTplApplier, $stepExecution) { $variantGroup->getId()->willReturn(42); $stepExecution->incrementSummaryInfo('update')->shouldBeCalled(); $variantGroup->getProductTemplate()->willReturn($productTemplate); $productTemplate->getValuesData()->willReturn([]); $variantGroup->getProducts()->willReturn($productCollection); $productCollection->isEmpty()->willReturn(false); $productCollection->toArray()->willReturn([$productOne, $productTwo]); $productCollection->count()->willReturn(2); $productTplApplier->apply($productTemplate, [$productOne, $productTwo])->shouldNotBeCalled(); $this->write([$variantGroup]); }
/** * {@inheritdoc} */ protected function normalizeVariantGroupValues(GroupInterface $group, $format, array $context) { if (!$group->getType()->isVariant() || null === $group->getProductTemplate()) { return []; } $valuesData = $group->getProductTemplate()->getValuesData(); $values = $this->valuesDenormalizer->denormalize($valuesData, 'ProductValue[]', 'json'); $normalizedValues = []; foreach ($values as $value) { $normalizedValues = array_replace($normalizedValues, $this->serializer->normalize($value, $format, ['entity' => 'product'] + $context)); } ksort($normalizedValues); return $normalizedValues; }
function it_saves_a_variant_group_and_copies_values_to_products($optionsResolver, $objectManager, $templateApplier, GroupInterface $group, GroupType $type, ProductInterface $product, ProductTemplateInterface $template, ArrayCollection $products) { $optionsResolver->resolveSaveOptions(['copy_values_to_products' => true])->willReturn(['flush' => true, 'copy_values_to_products' => true, 'add_products' => [], 'remove_products' => []]); $group->getType()->willReturn($type); $group->getCode()->willReturn('my_code'); $objectManager->persist($group)->shouldBeCalled(); $objectManager->flush()->shouldBeCalled(); $type->isVariant()->willReturn(true); $group->getProductTemplate()->willReturn($template); $group->getProducts()->willReturn($products); $products->toArray()->willReturn([$product]); $templateApplier->apply($template, [$product])->shouldBeCalled(); $this->save($group, ['copy_values_to_products' => true]); }
function it_adds_a_violation_when_validates_a_product_with_missing_value_for_an_axe_of_its_variant_group($context, ProductInterface $product, GroupInterface $tShirtVariantGroup, AttributeInterface $sizeAttribute, AttributeInterface $colorAttribute, ProductValueInterface $sizeValue, ProductValueInterface $identifierValue, HasVariantAxes $constraint, ConstraintViolationBuilderInterface $violation) { $tShirtVariantGroup->getCode()->willReturn('tshirt'); $tShirtVariantGroup->getAxisAttributes()->willReturn([$sizeAttribute, $colorAttribute]); $sizeAttribute->getCode()->willReturn('size'); $colorAttribute->getCode()->willReturn('color'); $product->getIdentifier()->willReturn($identifierValue); $product->getVariantGroup()->willReturn($tShirtVariantGroup); $product->getValue('size')->willReturn($sizeValue); $product->getValue('color')->willReturn(null); $sizeValue->getData()->willReturn('XL'); $context->buildViolation('The product "%product%" is in the variant group "%variant%" but it misses the following axes: %axes%.', ['%product%' => $identifierValue, '%variant%' => 'tshirt', '%axes%' => 'color'])->shouldBeCalled()->willReturn($violation); $this->validate($product, $constraint); }
function it_sets_groups_field($groupRepository, ProductInterface $product, GroupInterface $pack, GroupInterface $cross, GroupInterface $up, GroupTypeInterface $nonVariantType) { $groupRepository->findOneByIdentifier('pack')->willReturn($pack); $groupRepository->findOneByIdentifier('cross')->willReturn($cross); $product->getGroups()->willReturn([$up]); $up->getType()->willReturn($nonVariantType); $nonVariantType->isVariant()->willReturn(false); $product->removeGroup($up)->shouldBeCalled(); $pack->getType()->willReturn($nonVariantType); $nonVariantType->isVariant()->willReturn(false); $cross->getType()->willReturn($nonVariantType); $nonVariantType->isVariant()->willReturn(false); $product->addGroup($pack)->shouldBeCalled(); $product->addGroup($cross)->shouldBeCalled(); $this->setFieldData($product, 'groups', ['pack', 'cross']); }
/** * Get non eligible attributes to a product template * * @param GroupInterface $group * * @return AttributeInterface[] */ public function getNonEligibleAttributes(GroupInterface $variantGroup) { $attributes = $variantGroup->getAxisAttributes()->toArray(); $template = $variantGroup->getProductTemplate(); if (null !== $template) { foreach (array_keys($template->getValuesData()) as $attributeCode) { $attributes[] = $this->attributeRepository->findOneByIdentifier($attributeCode); } } $uniqueAttributes = $this->attributeRepository->findBy(['unique' => true]); foreach ($uniqueAttributes as $attribute) { if (!in_array($attribute, $attributes)) { $attributes[] = $attribute; } } return $attributes; }
function it_normalize_products($productNormalizer, $versionNormalizer, $versionManager, $localeManager, ProductInterface $mug, AssociationInterface $upsell, AssociationTypeInterface $groupType, GroupInterface $group, ArrayCollection $groups) { $productNormalizer->normalize($mug, 'json', [])->willReturn(['normalized_property' => 'a nice normalized property']); $mug->getId()->willReturn(12); $versionManager->getOldestLogEntry($mug)->willReturn('create_version'); $versionNormalizer->normalize('create_version', 'internal_api')->willReturn('normalized_create_version'); $versionManager->getNewestLogEntry($mug)->willReturn('update_version'); $versionNormalizer->normalize('update_version', 'internal_api')->willReturn('normalized_update_version'); $localeManager->getActiveCodes()->willReturn(['en_US', 'fr_FR']); $mug->getLabel('en_US')->willReturn('A nice Mug!'); $mug->getLabel('fr_FR')->willReturn('Un très beau Mug !'); $mug->getAssociations()->willReturn([$upsell]); $upsell->getAssociationType()->willReturn($groupType); $groupType->getCode()->willReturn('group'); $upsell->getGroups()->willReturn($groups); $groups->toArray()->willReturn([$group]); $group->getId()->willReturn(12); $this->normalize($mug, 'internal_api', [])->shouldReturn(['normalized_property' => 'a nice normalized property', 'meta' => ['id' => 12, 'created' => 'normalized_create_version', 'updated' => 'normalized_update_version', 'label' => ['en_US' => 'A nice Mug!', 'fr_FR' => 'Un très beau Mug !'], 'associations' => ['group' => ['groupIds' => [12]]]]]); }
function it_does_not_add_violation_when_validating_product_in_groups_with_unique_combination_of_axis_attributes($context, $productRepository, GroupInterface $tShirtVariantGroup, GroupTypeInterface $tShirtGroupType, ProductInterface $redTShirtProduct, AttributeInterface $sizeAttribute, AttributeInterface $colorAttribute, ProductValueInterface $sizeProductValue, ProductValueInterface $redColorProductValue, UniqueVariantAxis $uniqueVariantAxisConstraint) { $tShirtVariantGroup->getId()->willReturn(1); $tShirtVariantGroup->getLabel()->willReturn('TShirts'); $tShirtVariantGroup->getType()->willReturn($tShirtGroupType); $tShirtGroupType->isVariant()->willReturn(true); $tShirtVariantGroup->getAxisAttributes()->willReturn([$sizeAttribute, $colorAttribute]); $sizeAttribute->getCode()->willReturn('size'); $sizeAttribute->isBackendTypeReferenceData()->willReturn(false); $colorAttribute->getCode()->willReturn('color'); $colorAttribute->isBackendTypeReferenceData()->willReturn(false); $redTShirtProduct->getVariantGroup()->willReturn($tShirtVariantGroup); $redTShirtProduct->getId()->willReturn(1); $redTShirtProduct->getValue('size')->willReturn($sizeProductValue); $redTShirtProduct->getValue('color')->willReturn($redColorProductValue); $sizeProductValue->getOption()->willReturn('XL'); $redColorProductValue->getOption()->willReturn('Red'); $criteria = [['attribute' => $sizeAttribute, 'option' => 'XL'], ['attribute' => $colorAttribute, 'option' => 'Red']]; $productRepository->findAllForVariantGroup($tShirtVariantGroup, $criteria)->willReturn([]); $context->buildViolation()->shouldNotBeCalled(Argument::cetera()); $this->validate($redTShirtProduct, $uniqueVariantAxisConstraint); }
function it_normalizes_product_with_associations($filter, ProductInterface $product, AttributeInterface $skuAttribute, ProductValueInterface $sku, Association $myCrossSell, AssociationTypeInterface $crossSell, Association $myUpSell, AssociationTypeInterface $upSell, GroupInterface $associatedGroup1, GroupInterface $associatedGroup2, ProductInterface $associatedProduct1, ProductInterface $associatedProduct2, ProductValueInterface $skuAssocProduct1, ProductValueInterface $skuAssocProduct2, Collection $values, FamilyInterface $family, $serializer) { $family->getCode()->willReturn('shoes'); $skuAttribute->getCode()->willReturn('sku'); $skuAttribute->getAttributeType()->willReturn('pim_catalog_identifier'); $skuAttribute->isLocalizable()->willReturn(false); $skuAttribute->isScopable()->willReturn(false); $sku->getAttribute()->willReturn($skuAttribute); $sku->getData()->willReturn('sku-001'); $crossSell->getCode()->willReturn('cross_sell'); $myCrossSell->getAssociationType()->willReturn($crossSell); $myCrossSell->getGroups()->willReturn([]); $myCrossSell->getProducts()->willReturn([]); $upSell->getCode()->willReturn('up_sell'); $myUpSell->getAssociationType()->willReturn($upSell); $associatedGroup1->getCode()->willReturn('associated_group1'); $associatedGroup2->getCode()->willReturn('associated_group2'); $myUpSell->getGroups()->willReturn([$associatedGroup1, $associatedGroup2]); $skuAssocProduct1->getAttribute()->willReturn($skuAttribute); $skuAssocProduct2->getAttribute()->willReturn($skuAttribute); $skuAssocProduct1->__toString()->willReturn('sku_assoc_product1'); $skuAssocProduct2->__toString()->willReturn('sku_assoc_product2'); $associatedProduct1->getIdentifier()->willReturn($skuAssocProduct1); $associatedProduct2->getIdentifier()->willReturn($skuAssocProduct2); $myUpSell->getProducts()->willReturn([$associatedProduct1, $associatedProduct2]); $product->getIdentifier()->willReturn($sku); $product->getFamily()->willReturn($family); $product->isEnabled()->willReturn(true); $product->getGroupCodes()->willReturn('group1,group2,variant_group_1'); $product->getCategoryCodes()->willReturn('nice shoes, converse'); $product->getAssociations()->willReturn([$myCrossSell, $myUpSell]); $product->getValues()->willReturn($values); $filter->filterCollection($values, 'pim.transform.product_value.flat', Argument::cetera())->willReturn([$sku]); $serializer->normalize($sku, 'flat', Argument::any())->willReturn(['sku' => 'sku-001']); $this->normalize($product, 'flat', [])->shouldReturn(['sku' => 'sku-001', 'family' => 'shoes', 'groups' => 'group1,group2,variant_group_1', 'categories' => 'nice shoes, converse', 'cross_sell-groups' => '', 'cross_sell-products' => '', 'up_sell-groups' => 'associated_group1,associated_group2', 'up_sell-products' => 'sku_assoc_product1,sku_assoc_product2', 'enabled' => 1]); }
function it_adds_a_violation_if_a_group_contains_axis_attributes($context, GroupInterface $group, GroupType $type, VariantGroupAxis $constraint, AttributeInterface $axis) { $group->getId()->willReturn(null); $group->getType()->willReturn($type); $group->getCode()->willReturn('xsell'); $type->isVariant()->willReturn(false); $group->getAxisAttributes()->willReturn([$axis]); $violationData = ['%group%' => 'xsell']; $context->addViolation($constraint->unexpectedAxisMessage, $violationData)->shouldBeCalled(); $this->validate($group, $constraint); }
function it_normalizes_an_association_with_products_and_groups($mongoFactory, Association $assoc, AssociationTypeInterface $assocType, \MongoId $mongoId, \MongoDBRef $ownerRef, ProductInterface $product1, \MongoDBRef $product1Ref, ProductInterface $product2, \MongoDBRef $product2Ref, GroupInterface $group1, GroupInterface $group2) { $assocType->getId()->willReturn(8); $assoc->getAssociationType()->willReturn($assocType); $context = ['_id' => '1234abc', 'collection_name' => 'product']; $mongoFactory->createMongoId()->willReturn($mongoId); $mongoFactory->createMongoDBRef('product', '1234abc')->willReturn($ownerRef); $mongoFactory->createMongoDBRef('product', 'product1')->willReturn($product1Ref); $mongoFactory->createMongoDBRef('product', 'product2')->willReturn($product2Ref); $product1->getId()->willReturn('product1'); $product2->getId()->willReturn('product2'); $assoc->getProducts()->willReturn([$product1, $product2]); $group1->getId()->willReturn(1); $group2->getId()->willReturn(2); $assoc->getGroups()->willReturn([$group1, $group2]); $this->normalize($assoc, 'mongodb_document', $context)->shouldReturn(['_id' => $mongoId, 'associationType' => 8, 'owner' => $ownerRef, 'products' => [$product1Ref, $product2Ref], 'groupIds' => [1, 2]]); }
function it_adds_a_violation_if_axis_attributes_are_invalid($context, GroupInterface $variantGroup, GroupType $type, VariantGroupAxis $constraint, ConstraintViolationBuilderInterface $violation, AttributeInterface $invalidAxis) { $variantGroup->getId()->willReturn(12); $variantGroup->getType()->willReturn($type); $variantGroup->getCode()->willReturn('tshirt'); $type->isVariant()->willReturn(true); $variantGroup->getAxisAttributes()->willReturn([$invalidAxis]); $invalidAxis->getAttributeType()->willReturn(AttributeTypes::TEXT); $invalidAxis->getCode()->willReturn('name'); $violationData = ['%group%' => 'tshirt', '%attribute%' => 'name']; $context->buildViolation($constraint->invalidAxisMessage, $violationData)->shouldBeCalled()->willReturn($violation); $this->validate($variantGroup, $constraint); }
function it_adds_a_violation_if_variant_group_template_contains_a_unique_attribute(GroupInterface $variantGroup, GroupType $type, ProductTemplateInterface $template, VariantGroupValues $constraint, $attributeRepository, $context) { $variantGroup->getType()->willReturn($type); $variantGroup->getCode()->willReturn('tshirt'); $type->isVariant()->willReturn(true); $variantGroup->getProductTemplate()->willReturn($template); $variantGroup->getAxisAttributes()->willReturn([]); $attributeRepository->findUniqueAttributeCodes()->willReturn(['sku', 'barcode']); $template->getValuesData()->willReturn(['sku' => 'SKU-001']); $violationData = ['%group%' => 'tshirt', '%attributes%' => '"sku"']; $context->addViolation($constraint->message, $violationData)->shouldBeCalled(); $this->validate($variantGroup, $constraint); $template->getValuesData()->willReturn(['sku' => 'SKU-001', 'barcode' => 01122334455]); $violationData = ['%group%' => 'tshirt', '%attributes%' => '"sku", "barcode"']; $context->addViolation($constraint->message, $violationData)->shouldBeCalled(); $this->validate($variantGroup, $constraint); }
/** * Get matching products * * @param GroupInterface $variantGroup the variant group * @param ProductInterface $entity the product * @param array $criteria query criterias * * @return ProductInterface[] */ protected function getMatchingProducts(GroupInterface $variantGroup, ProductInterface $entity = null, array $criteria = []) { if (!$variantGroup->getId()) { return []; } $matchingProducts = $this->repository->findAllForVariantGroup($variantGroup, $criteria); if ($entity) { $matchingProducts = array_filter($matchingProducts, function ($product) use($entity) { return $product->getId() !== $entity->getId(); }); } return $matchingProducts; }