function it_adds_invalid_values_to_product($groupRepository, $validator, $templateUpdater, GroupInterface $variantGroup, ProductInterface $product, StepExecution $stepExecution, JobConfigurationRepositoryInterface $jobConfigurationRepo, JobExecution $jobExecution, JobConfigurationInterface $jobConfiguration, ProductTemplateInterface $productTemplate) { $violation = new ConstraintViolation('error2', 'spec', [], '', '', $product); $violations = new ConstraintViolationList([$violation, $violation]); $validator->validate($product)->willReturn($violations); $stepExecution->getJobExecution()->willReturn($jobExecution); $jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution])->willReturn($jobConfiguration); $jobConfiguration->getConfiguration()->willReturn(json_encode(['filters' => [], 'actions' => ['field' => 'variant_group', 'value' => 'variant_group_code']])); $groupRepository->findOneByIdentifier('variant_group_code')->willReturn($variantGroup); $product->getVariantGroup()->willReturn(null); $variantGroup->addProduct($product)->shouldBeCalled(); $variantGroup->getProductTemplate()->willReturn($productTemplate); $templateUpdater->update($variantGroup->getProductTemplate(), [$product]); $stepExecution->addWarning(Argument::cetera())->shouldBeCalled(); $stepExecution->incrementSummaryInfo('skipped_products')->shouldBeCalled(); $this->setStepExecution($stepExecution); $this->process($product); }
function it_sets_invalid_values_to_attributes($validator, $productUpdater, AttributeInterface $attribute, AttributeRepositoryInterface $attributeRepository, ProductInterface $product, ConstraintViolationListInterface $violations, StepExecution $stepExecution, JobConfigurationRepositoryInterface $jobConfigurationRepo, JobExecution $jobExecution, JobConfigurationInterface $jobConfiguration) { $stepExecution->getJobExecution()->willReturn($jobExecution); $jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution])->willReturn($jobConfiguration); $values = ['categories' => [['scope' => null, 'locale' => null, 'data' => ['office', 'bedroom']]]]; $normalizedValues = addslashes(json_encode($values)); $jobConfiguration->getConfiguration()->willReturn(json_encode(['filters' => [], 'actions' => ['normalized_values' => $normalizedValues, 'ui_locale' => 'fr_FR', 'attribute_locale' => 'en_US']])); $validator->validate($product)->willReturn($violations); $violation = new ConstraintViolation('error2', 'spec', [], '', '', $product); $violations = new ConstraintViolationList([$violation, $violation]); $validator->validate($product)->willReturn($violations); $attributeRepository->findOneByIdentifier('categories')->willReturn($attribute); $product->isAttributeEditable($attribute)->willReturn(true); $productUpdater->update($product, $values)->shouldBeCalled(); $this->setStepExecution($stepExecution); $stepExecution->addWarning(Argument::cetera())->shouldBeCalled(); $stepExecution->incrementSummaryInfo('skipped_products')->shouldBeCalled(); $this->process($product); }
/** * Return the job configuration * * @return array */ protected function getJobConfiguration() { $jobExecution = $this->stepExecution->getJobExecution(); $massEditJobConf = $this->jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution]); return json_decode(stripcslashes($massEditJobConf->getConfiguration()), true); }
/** * {@inheritdoc} */ public function process($variantGroup) { $variantGroupStandard = $this->normalizer->normalize($variantGroup, null, ['with_variant_group_values' => true, 'identifier' => $variantGroup->getCode()]); $parameters = $this->stepExecution->getJobParameters(); if ($parameters->has('with_media') && $parameters->get('with_media')) { $directory = $this->stepExecution->getJobExecution()->getExecutionContext()->get(JobInterface::WORKING_DIRECTORY_PARAMETER); $this->fetchMedia($variantGroup, $directory); } $this->objectDetacher->detach($variantGroup); return $variantGroupStandard; }
/** * Save the job configuration * * @param string $configuration */ protected function setJobConfiguration($configuration) { $jobExecution = $this->stepExecution->getJobExecution(); $massEditJobConf = $this->jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution]); $massEditJobConf->setConfiguration($configuration); $this->jobConfigurationSaver->save($massEditJobConf); }
function it_throws_an_exception_if_no_job_configuration_is_found($jobConfigurationRepo, StepExecution $stepExecution, JobExecution $jobExecution) { $stepExecution->getJobExecution()->willReturn($jobExecution); $jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution])->willReturn(null); $this->setStepExecution($stepExecution); $this->shouldThrow('Doctrine\\ORM\\EntityNotFoundException')->during('read'); }
function it_normalizes_a_step_execution($translator, $presenter, $labelProvider, JobInstance $jobInstance, JobExecution $jobExecution, StepExecution $stepExecution, BatchStatus $status) { $jobExecution->getJobInstance()->willReturn($jobInstance); $stepExecution->getJobExecution()->willReturn($jobExecution); $stepExecution->getStepName()->willReturn('such_step'); $jobInstance->getJobName()->willReturn('wow_job'); $labelProvider->getStepLabel('wow_job', 'such_step')->willReturn('Export step'); $stepExecution->getSummary()->willReturn(['read' => 12, 'write' => 50]); $translator->trans('job_execution.summary.read')->willReturn('Read'); $translator->trans('job_execution.summary.write')->willReturn('Write'); $stepExecution->getStatus()->willReturn($status); $status->getValue()->willReturn(9); $translator->trans('pim_import_export.batch_status.9')->willReturn('PENDING'); $date = new \DateTime(); $stepExecution->getStartTime()->willReturn($date); $stepExecution->getEndTime()->willReturn(null); $stepExecution->getWarnings()->willReturn(new ArrayCollection([new Warning($stepExecution->getWrappedObject(), 'warning_reason', ['foo' => 'bar'], ['a' => 'A', 'b' => 'B', 'c' => 'C'])])); $translator->trans('a_warning')->willReturn('Reader'); $translator->trans(12)->willReturn(12); $translator->trans(50)->willReturn(50); $translator->trans('warning_reason', ['foo' => 'bar'])->willReturn('WARNING!'); $stepExecution->getFailureExceptions()->willReturn([['message' => 'a_failure', 'messageParameters' => ['foo' => 'bar']]]); $translator->trans('a_failure', ['foo' => 'bar'])->willReturn('FAIL!'); $presenter->present($date, Argument::any())->willReturn('22-09-2014'); $presenter->present(null, Argument::any())->willReturn(null); $this->normalize($stepExecution, 'any')->shouldReturn(['label' => 'Export step', 'status' => 'PENDING', 'summary' => ['Read' => 12, 'Write' => 50], 'startedAt' => '22-09-2014', 'endedAt' => null, 'warnings' => [['reason' => 'WARNING!', 'item' => ['a' => 'A', 'b' => 'B', 'c' => 'C']]], 'failures' => ['FAIL!']]); }
/** * Return the job configuration * * @throws EntityNotFoundException * * @return array */ protected function getJobConfiguration() { $jobExecution = $this->stepExecution->getJobExecution(); $massEditJobConf = $this->jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution]); if (null === $massEditJobConf) { throw new EntityNotFoundException(sprintf('No JobConfiguration found for jobExecution with id %s', $jobExecution->getId())); } return json_decode(stripcslashes($massEditJobConf->getConfiguration()), true); }
/** * Export medias from the working directory to the output expected directory. * * Basically, we first remove the content of /path/where/my/user/expects/the/export/files/. * (This path can exist of an export was launched previously) * * Then we copy /path/of/the/working/directory/files/ to /path/where/my/user/expects/the/export/files/. */ protected function exportMedias() { $outputDirectory = dirname($this->getPath()); $workingDirectory = $this->stepExecution->getJobExecution()->getExecutionContext()->get(JobInterface::WORKING_DIRECTORY_PARAMETER); $outputFilesDirectory = $outputDirectory . DIRECTORY_SEPARATOR . 'files'; $workingFilesDirectory = $workingDirectory . 'files'; if ($this->localFs->exists($outputFilesDirectory)) { $this->localFs->remove($outputFilesDirectory); } if ($this->localFs->exists($workingFilesDirectory)) { $this->localFs->mirror($workingFilesDirectory, $outputFilesDirectory); } }
function it_adds_invalid_values_to_product($propertyAdder, $validator, ProductInterface $product, StepExecution $stepExecution, JobConfigurationRepositoryInterface $jobConfigurationRepo, JobExecution $jobExecution, JobConfigurationInterface $jobConfiguration) { $violation = new ConstraintViolation('error2', 'spec', [], '', '', $product); $violations = new ConstraintViolationList([$violation, $violation]); $validator->validate($product)->willReturn($violations); $stepExecution->getJobExecution()->willReturn($jobExecution); $jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution])->willReturn($jobConfiguration); $jobConfiguration->getConfiguration()->willReturn(json_encode(['filters' => [], 'actions' => [['field' => 'categories', 'value' => ['office', 'bedroom']]]])); $propertyAdder->addData($product, 'categories', ['office', 'bedroom'])->shouldBeCalled(); $stepExecution->addWarning(Argument::cetera())->shouldBeCalled(); $stepExecution->incrementSummaryInfo('skipped_products')->shouldBeCalled(); $this->setStepExecution($stepExecution); $this->process($product); }
/** * {@inheritdoc} */ public function process($product) { $parameters = $this->stepExecution->getJobParameters(); $structure = $parameters->get('filters')['structure']; $channel = $this->channelRepository->findOneByIdentifier($structure['scope']); $this->productBuilder->addMissingProductValues($product, [$channel], $channel->getLocales()->toArray()); $productStandard = $this->normalizer->normalize($product, 'json', ['channels' => [$channel->getCode()], 'locales' => array_intersect($channel->getLocaleCodes(), $parameters->get('filters')['structure']['locales'])]); if ($this->areAttributesToFilter($parameters)) { $attributesToFilter = $this->getAttributesToFilter($parameters); $productStandard['values'] = $this->filterValues($productStandard['values'], $attributesToFilter); } if ($parameters->has('with_media') && $parameters->get('with_media')) { $directory = $this->stepExecution->getJobExecution()->getExecutionContext()->get(JobInterface::WORKING_DIRECTORY_PARAMETER); $this->fetchMedia($product, $directory); } else { $mediaAttributes = $this->attributeRepository->findMediaAttributeCodes(); $productStandard['values'] = array_filter($productStandard['values'], function ($attributeCode) use($mediaAttributes) { return !in_array($attributeCode, $mediaAttributes); }, ARRAY_FILTER_USE_KEY); } $this->detacher->detach($product); return $productStandard; }
function it_reads_products($entityManager, $jobRepository, JobConfigurationRepositoryInterface $jobConfigurationRepo, JobInstance $jobInstance, JobExecution $jobExecution, JobConfigurationInterface $jobConfiguration, ProductQueryBuilderFactory $pqbFactory, ProductQueryBuilder $pqb, StepExecution $stepExecution, Cursor $cursor, ProductInterface $product, EntityRepository $customEntityRepository) { $jobRepository->getJobManager()->willReturn($entityManager); $stepExecution->getJobExecution()->willReturn($jobExecution); $customEntityRepository->findOneBy(['code' => 'update_product_value'])->willReturn($jobInstance); $jobInstance->getJobExecutions()->willReturn(new ArrayCollection([$jobExecution])); $jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution])->willReturn($jobConfiguration); $pqbFactory->create()->willReturn($pqb); $jobConfiguration->getConfiguration()->willReturn(json_encode(['filters' => [], 'actions' => []])); $pqb->execute()->willReturn($cursor); $cursor->next()->shouldBeCalled(); $stepExecution->incrementSummaryInfo('read')->shouldBeCalledTimes(1); $this->setStepExecution($stepExecution); $cursor->current()->willReturn($product); $this->read()->shouldReturn($product); }
/** * Initialize the SecurityContext from the given $stepExecution * * @param StepExecution $stepExecution */ protected function initSecurityContext(StepExecution $stepExecution) { $username = $stepExecution->getJobExecution()->getUser(); $user = $this->userProvider->loadUserByUsername($username); $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles()); $this->tokenStorage->setToken($token); }
function it_processes_a_family($jobConfigurationRepo, $attributeRepository, $channelRepository, $factory, StepExecution $stepExecution, ValidatorInterface $validator, FamilyInterface $family, JobExecution $jobExecution, JobConfigurationInterface $jobConfiguration, AttributeInterface $attributeColor, ChannelInterface $channelMobile, ChannelInterface $channelEcommerce, AttributeRequirementInterface $attrReqColorMobile, AttributeRequirementInterface $attrReqColorEcom) { $actions = [['attribute_code' => 'color', 'channel_code' => 'mobile', 'is_required' => true], ['attribute_code' => 'color', 'channel_code' => 'ecommerce', 'is_required' => false]]; $violations = new ConstraintViolationList([]); $validator->validate($family)->willReturn($violations); $stepExecution->getJobExecution()->willReturn($jobExecution); $attributeRepository->findOneByIdentifier('color')->willReturn($attributeColor); $channelRepository->findOneByIdentifier('mobile')->willReturn($channelMobile); $channelRepository->findOneByIdentifier('ecommerce')->willReturn($channelEcommerce); $jobConfigurationRepo->findOneBy(['jobExecution' => $jobExecution])->willReturn($jobConfiguration); $jobConfiguration->getConfiguration()->willReturn(json_encode(['filters' => [], 'actions' => $actions])); $factory->createAttributeRequirement($attributeColor, $channelMobile, true)->willReturn($attrReqColorMobile); $factory->createAttributeRequirement($attributeColor, $channelEcommerce, false)->willReturn($attrReqColorEcom); $this->setStepExecution($stepExecution); $family->addAttribute($attributeColor)->shouldBeCalledTimes(2); $family->addAttributeRequirement($attrReqColorMobile)->shouldBeCalled(); $family->addAttributeRequirement($attrReqColorEcom)->shouldBeCalled(); $this->process($family); }