/** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { if (!$value instanceof ProductInterface) { throw new UnexpectedTypeException($value, ProductInterface::class); } if (!$value->isSimple()) { return; } if (null !== $this->productVariantRepository->findOneBy(['code' => $value->getCode()])) { $this->context->buildViolation($constraint->message)->atPath('code')->addViolation(); } }
function it_add_violation_if_product_is_simple_and_code_has_been_used_in_other_product_variant(ExecutionContextInterface $context, ProductInterface $product, ProductVariantInterface $existingProductVariant, ProductVariantRepositoryInterface $productVariantRepository, ConstraintViolationBuilderInterface $constraintViolationBuilder) { $constraint = new UniqueSimpleProductCode(['message' => 'Simple product code has to be unique']); $product->isSimple()->willReturn(true); $product->getCode()->willReturn('AWESOME_PRODUCT'); $context->buildViolation('Simple product code has to be unique', Argument::cetera())->willReturn($constraintViolationBuilder); $constraintViolationBuilder->atPath('code')->shouldBeCalled()->willReturn($constraintViolationBuilder); $constraintViolationBuilder->addViolation()->shouldBeCalled()->willReturn($constraintViolationBuilder); $productVariantRepository->findOneBy(['code' => 'AWESOME_PRODUCT'])->willReturn($existingProductVariant); $this->validate($product, $constraint); }
/** * @Transform /^variant with code "([^"]+)"$/ */ public function getProductVariantByCode($code) { $productVariant = $this->productVariantRepository->findOneBy(['code' => $code]); Assert::notNull($productVariant, sprintf('Cannot find product variant with code %s', $code)); return $productVariant; }