function it_does_not_validate_families_with_missing_identifier_requirements($attributeRepository, $channelRepository, $context, $minimumRequirements, FamilyInterface $family, AttributeRequirementInterface $requirementEcommerce, AttributeRequirementInterface $requirementMobile, ConstraintViolationBuilderInterface $violation) { $family->getAttributeRequirements()->willReturn([$requirementEcommerce, $requirementMobile]); $attributeRepository->getIdentifierCode()->willReturn('sku'); $requirementEcommerce->getAttributeCode()->willReturn('sku'); $requirementEcommerce->getChannelCode()->willReturn('ecommerce'); $requirementMobile->getAttributeCode()->willReturn('sku'); $requirementMobile->getChannelCode()->willReturn('mobile'); $channelRepository->getChannelCodes()->willReturn(['ecommerce', 'mobile', 'print']); $family->getCode()->willReturn('familyCode'); $context->buildViolation(Argument::any(), Argument::any())->willReturn($violation)->shouldBeCalled(); $this->validate($family, $minimumRequirements); }
/** * Normalize the requirements * * @param FamilyInterface $family * * @return array */ protected function normalizeRequirements(FamilyInterface $family) { $required = []; foreach ($family->getAttributeRequirements() as $requirement) { $channelCode = $requirement->getChannel()->getCode(); if (!isset($required['requirements-' . $channelCode])) { $required['requirements-' . $channelCode] = []; } if ($requirement->isRequired()) { $required['requirements-' . $channelCode][] = $requirement->getAttribute()->getCode(); } } return $required; }
/** * @param FamilyInterface $family * * @return string[] */ protected function getMissingChannelCodes(FamilyInterface $family) { $requirements = $family->getAttributeRequirements(); $identifierCode = $this->attributeRepository->getIdentifierCode(); $currentChannelCodes = []; foreach ($requirements as $requirement) { if ($requirement->getAttributeCode() === $identifierCode) { $currentChannelCodes[] = $requirement->getChannelCode(); } } $expectedChannelCodes = $this->channelRepository->getChannelCodes(); $missingChannelCodes = array_diff($expectedChannelCodes, $currentChannelCodes); return $missingChannelCodes; }
/** * Normalize the requirements * * @param FamilyInterface $family * * @return array */ protected function normalizeRequirements(FamilyInterface $family) { $required = []; $flat = []; foreach ($family->getAttributeRequirements() as $requirement) { $channelCode = $requirement->getChannel()->getCode(); if (!isset($required['requirements-' . $channelCode])) { $required['requirements-' . $channelCode] = []; } if ($requirement->isRequired()) { $required['requirements-' . $channelCode][] = $requirement->getAttribute()->getCode(); } } foreach ($required as $key => $attributes) { $flat[$key] = implode(',', $attributes); } return $flat; }
function it_throws_an_exception_if_channel_not_found($channelRepository, $attributeRepository, AttributeInterface $attribute, FamilyInterface $family) { $data = ['code' => 'mycode', 'requirements' => ['mobile' => ['sku', 'name'], 'print' => ['sku', 'name', 'description']]]; $family->getAttributeRequirements()->willReturn([]); $family->setCode('mycode')->shouldBeCalled(); $attributeRepository->findOneByIdentifier('sku')->willReturn($attribute); $attributeRepository->findOneByIdentifier('name')->willReturn($attribute); $attributeRepository->findOneByIdentifier('description')->willReturn($attribute); $attributeRepository->findOneByIdentifier('price')->willReturn($attribute); $channelRepository->findOneByIdentifier('print')->willReturn(null); $channelRepository->findOneByIdentifier('mobile')->willReturn(null); $this->shouldThrow(new \InvalidArgumentException(sprintf('Channel with "%s" code does not exist', 'mobile')))->during('update', [$family, $data]); }
/** * @param FamilyInterface $family * * @return AttributeRequirementInterface[] */ protected function getExistingIdentifierRequirements(FamilyInterface $family) { $identifierRequirements = []; $existingRequirements = $family->getAttributeRequirements(); foreach ($existingRequirements as $requirement) { if (AttributeTypes::IDENTIFIER === $requirement->getAttribute()->getAttributeType()) { $identifierRequirements[] = $requirement; } } return $identifierRequirements; }