From 0d49632b926613ae65a6629bef4022cfd2e135ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 21 Sep 2025 20:45:18 +0200 Subject: [PATCH] Refactored constraints, to reuse existing mechanisms --- .../BulkInfoProviderImportController.php | 12 +-- src/Controller/PartController.php | 6 +- .../Part/BulkImportJobExistsConstraint.php | 31 +----- .../Part/BulkImportJobStatusConstraint.php | 53 ++-------- .../Part/BulkImportPartStatusConstraint.php | 55 ++-------- src/DataTables/Filters/PartFilter.php | 8 +- src/DataTables/PartsDataTable.php | 1 - .../BulkImportJobStatus.php | 5 +- .../BulkImportPartStatus.php | 32 ++++++ .../BulkInfoProviderImportJob.php | 6 +- .../BulkInfoProviderImportJobPart.php | 30 ++++-- src/Entity/LogSystem/LogTargetType.php | 4 +- src/Entity/Parts/Part.php | 6 +- .../BulkImportJobExistsConstraintType.php | 63 ----------- .../BulkImportJobStatusConstraintType.php | 80 -------------- .../BulkImportPartStatusConstraintType.php | 79 -------------- src/Form/Filters/PartFilterType.php | 21 +++- src/Services/ElementTypeNameGenerator.php | 10 +- .../BulkInfoProviderImportControllerTest.php | 5 +- tests/Controller/PartControllerTest.php | 7 +- .../BulkImportJobStatusConstraintTest.php | 81 +++++++------- .../BulkImportPartStatusConstraintTest.php | 100 +++++++++--------- tests/Entity/BulkImportJobStatusTest.php | 6 +- .../BulkInfoProviderImportJobPartTest.php | 96 ++++++++--------- .../Entity/BulkInfoProviderImportJobTest.php | 5 +- .../Services/ElementTypeNameGeneratorTest.php | 4 +- 26 files changed, 264 insertions(+), 542 deletions(-) rename src/Entity/{ => InfoProviderSystem}/BulkImportJobStatus.php (87%) create mode 100644 src/Entity/InfoProviderSystem/BulkImportPartStatus.php rename src/Entity/{ => InfoProviderSystem}/BulkInfoProviderImportJob.php (99%) rename src/Entity/{ => InfoProviderSystem}/BulkInfoProviderImportJobPart.php (83%) delete mode 100644 src/Form/Filters/Constraints/BulkImportJobExistsConstraintType.php delete mode 100644 src/Form/Filters/Constraints/BulkImportJobStatusConstraintType.php delete mode 100644 src/Form/Filters/Constraints/BulkImportPartStatusConstraintType.php diff --git a/src/Controller/BulkInfoProviderImportController.php b/src/Controller/BulkInfoProviderImportController.php index 34644c01..b71cc745 100644 --- a/src/Controller/BulkInfoProviderImportController.php +++ b/src/Controller/BulkInfoProviderImportController.php @@ -22,25 +22,25 @@ declare(strict_types=1); namespace App\Controller; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkInfoProviderImportJobPart; -use App\Entity\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use App\Entity\Parts\Part; use App\Entity\Parts\Supplier; +use App\Entity\UserSystem\User; use App\Form\InfoProviderSystem\GlobalFieldMappingType; use App\Services\InfoProviderSystem\BulkInfoProviderService; -use App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO; use App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO; use App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultsDTO; +use App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO; use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Attribute\Route; -use App\Entity\UserSystem\User; #[Route('/tools/bulk_info_provider_import')] class BulkInfoProviderImportController extends AbstractController diff --git a/src/Controller/PartController.php b/src/Controller/PartController.php index d1087254..af8f1490 100644 --- a/src/Controller/PartController.php +++ b/src/Controller/PartController.php @@ -144,7 +144,7 @@ class PartController extends AbstractController $jobId = $request->query->get('jobId'); $bulkJob = null; if ($jobId) { - $bulkJob = $this->em->getRepository(\App\Entity\BulkInfoProviderImportJob::class)->find($jobId); + $bulkJob = $this->em->getRepository(\App\Entity\InfoProviderSystem\BulkInfoProviderImportJob::class)->find($jobId); // Verify user owns this job if ($bulkJob && $bulkJob->getCreatedBy() !== $this->getUser()) { $bulkJob = null; @@ -165,7 +165,7 @@ class PartController extends AbstractController throw $this->createAccessDeniedException('Invalid CSRF token'); } - $bulkJob = $this->em->getRepository(\App\Entity\BulkInfoProviderImportJob::class)->find($jobId); + $bulkJob = $this->em->getRepository(\App\Entity\InfoProviderSystem\BulkInfoProviderImportJob::class)->find($jobId); if (!$bulkJob || $bulkJob->getCreatedBy() !== $this->getUser()) { throw $this->createNotFoundException('Bulk import job not found'); } @@ -331,7 +331,7 @@ class PartController extends AbstractController $jobId = $request->query->get('jobId'); $bulkJob = null; if ($jobId) { - $bulkJob = $this->em->getRepository(\App\Entity\BulkInfoProviderImportJob::class)->find($jobId); + $bulkJob = $this->em->getRepository(\App\Entity\InfoProviderSystem\BulkInfoProviderImportJob::class)->find($jobId); // Verify user owns this job if ($bulkJob && $bulkJob->getCreatedBy() !== $this->getUser()) { $bulkJob = null; diff --git a/src/DataTables/Filters/Constraints/Part/BulkImportJobExistsConstraint.php b/src/DataTables/Filters/Constraints/Part/BulkImportJobExistsConstraint.php index 0e5a3696..9d21dd58 100644 --- a/src/DataTables/Filters/Constraints/Part/BulkImportJobExistsConstraint.php +++ b/src/DataTables/Filters/Constraints/Part/BulkImportJobExistsConstraint.php @@ -23,41 +23,18 @@ declare(strict_types=1); namespace App\DataTables\Filters\Constraints\Part; -use App\DataTables\Filters\Constraints\AbstractConstraint; -use App\Entity\BulkInfoProviderImportJobPart; +use App\DataTables\Filters\Constraints\BooleanConstraint; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use Doctrine\ORM\QueryBuilder; -class BulkImportJobExistsConstraint extends AbstractConstraint +class BulkImportJobExistsConstraint extends BooleanConstraint { - /** @var bool|null The value of our constraint */ - protected ?bool $value = null; public function __construct() { parent::__construct('bulk_import_job_exists'); } - /** - * Gets the value of this constraint. Null means "don't filter", true means "filter for parts in bulk import jobs", false means "filter for parts not in bulk import jobs". - */ - public function getValue(): ?bool - { - return $this->value; - } - - /** - * Sets the value of this constraint. Null means "don't filter", true means "filter for parts in bulk import jobs", false means "filter for parts not in bulk import jobs". - */ - public function setValue(?bool $value): void - { - $this->value = $value; - } - - public function isEnabled(): bool - { - return $this->value !== null; - } - public function apply(QueryBuilder $queryBuilder): void { // Do not apply a filter if value is null (filter is set to ignore) @@ -79,4 +56,4 @@ class BulkImportJobExistsConstraint extends AbstractConstraint $queryBuilder->andWhere('NOT EXISTS (' . $existsSubquery->getDQL() . ')'); } } -} \ No newline at end of file +} diff --git a/src/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraint.php b/src/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraint.php index cc5c8ce0..d9451577 100644 --- a/src/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraint.php +++ b/src/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraint.php @@ -24,59 +24,18 @@ declare(strict_types=1); namespace App\DataTables\Filters\Constraints\Part; use App\DataTables\Filters\Constraints\AbstractConstraint; -use App\Entity\BulkInfoProviderImportJobPart; +use App\DataTables\Filters\Constraints\ChoiceConstraint; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use Doctrine\ORM\QueryBuilder; -class BulkImportJobStatusConstraint extends AbstractConstraint +class BulkImportJobStatusConstraint extends ChoiceConstraint { - /** @var array The status values to filter by */ - protected array $values = []; - - /** @var string|null The operator to use ('any_of', 'none_of', 'all_of') */ - protected ?string $operator = null; public function __construct() { parent::__construct('bulk_import_job_status'); } - /** - * Gets the status values to filter by. - */ - public function getValues(): array - { - return $this->values; - } - - /** - * Sets the status values to filter by. - */ - public function setValues(array $values): void - { - $this->values = $values; - } - - /** - * Gets the operator to use. - */ - public function getOperator(): ?string - { - return $this->operator; - } - - /** - * Sets the operator to use. - */ - public function setOperator(?string $operator): void - { - $this->operator = $operator; - } - - public function isEnabled(): bool - { - return !empty($this->values) && $this->operator !== null; - } - public function apply(QueryBuilder $queryBuilder): void { // Do not apply a filter if values are empty or operator is null @@ -95,11 +54,11 @@ class BulkImportJobStatusConstraint extends AbstractConstraint if ($this->operator === 'ANY') { $existsSubquery->andWhere('job_status.status IN (:job_status_values)'); $queryBuilder->andWhere('EXISTS (' . $existsSubquery->getDQL() . ')'); - $queryBuilder->setParameter('job_status_values', $this->values); + $queryBuilder->setParameter('job_status_values', $this->value); } elseif ($this->operator === 'NONE') { $existsSubquery->andWhere('job_status.status IN (:job_status_values)'); $queryBuilder->andWhere('NOT EXISTS (' . $existsSubquery->getDQL() . ')'); - $queryBuilder->setParameter('job_status_values', $this->values); + $queryBuilder->setParameter('job_status_values', $this->value); } } -} \ No newline at end of file +} diff --git a/src/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraint.php b/src/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraint.php index 168934d6..7656a290 100644 --- a/src/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraint.php +++ b/src/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraint.php @@ -23,60 +23,17 @@ declare(strict_types=1); namespace App\DataTables\Filters\Constraints\Part; -use App\DataTables\Filters\Constraints\AbstractConstraint; -use App\Entity\BulkInfoProviderImportJobPart; +use App\DataTables\Filters\Constraints\ChoiceConstraint; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use Doctrine\ORM\QueryBuilder; -class BulkImportPartStatusConstraint extends AbstractConstraint +class BulkImportPartStatusConstraint extends ChoiceConstraint { - /** @var array The status values to filter by */ - protected array $values = []; - - /** @var string|null The operator to use ('any_of', 'none_of', 'all_of') */ - protected ?string $operator = null; - public function __construct() { parent::__construct('bulk_import_part_status'); } - /** - * Gets the status values to filter by. - */ - public function getValues(): array - { - return $this->values; - } - - /** - * Sets the status values to filter by. - */ - public function setValues(array $values): void - { - $this->values = $values; - } - - /** - * Gets the operator to use. - */ - public function getOperator(): ?string - { - return $this->operator; - } - - /** - * Sets the operator to use. - */ - public function setOperator(?string $operator): void - { - $this->operator = $operator; - } - - public function isEnabled(): bool - { - return !empty($this->values) && $this->operator !== null; - } - public function apply(QueryBuilder $queryBuilder): void { // Do not apply a filter if values are empty or operator is null @@ -94,11 +51,11 @@ class BulkImportPartStatusConstraint extends AbstractConstraint if ($this->operator === 'ANY') { $existsSubquery->andWhere('bip_part_status.status IN (:part_status_values)'); $queryBuilder->andWhere('EXISTS (' . $existsSubquery->getDQL() . ')'); - $queryBuilder->setParameter('part_status_values', $this->values); + $queryBuilder->setParameter('part_status_values', $this->value); } elseif ($this->operator === 'NONE') { $existsSubquery->andWhere('bip_part_status.status IN (:part_status_values)'); $queryBuilder->andWhere('NOT EXISTS (' . $existsSubquery->getDQL() . ')'); - $queryBuilder->setParameter('part_status_values', $this->values); + $queryBuilder->setParameter('part_status_values', $this->value); } } -} \ No newline at end of file +} diff --git a/src/DataTables/Filters/PartFilter.php b/src/DataTables/Filters/PartFilter.php index a13bb929..6e8e8b30 100644 --- a/src/DataTables/Filters/PartFilter.php +++ b/src/DataTables/Filters/PartFilter.php @@ -28,12 +28,12 @@ use App\DataTables\Filters\Constraints\DateTimeConstraint; use App\DataTables\Filters\Constraints\EntityConstraint; use App\DataTables\Filters\Constraints\IntConstraint; use App\DataTables\Filters\Constraints\NumberConstraint; -use App\DataTables\Filters\Constraints\Part\LessThanDesiredConstraint; -use App\DataTables\Filters\Constraints\Part\ParameterConstraint; -use App\DataTables\Filters\Constraints\Part\TagsConstraint; use App\DataTables\Filters\Constraints\Part\BulkImportJobExistsConstraint; use App\DataTables\Filters\Constraints\Part\BulkImportJobStatusConstraint; use App\DataTables\Filters\Constraints\Part\BulkImportPartStatusConstraint; +use App\DataTables\Filters\Constraints\Part\LessThanDesiredConstraint; +use App\DataTables\Filters\Constraints\Part\ParameterConstraint; +use App\DataTables\Filters\Constraints\Part\TagsConstraint; use App\DataTables\Filters\Constraints\TextConstraint; use App\Entity\Attachments\AttachmentType; use App\Entity\Parts\Category; @@ -45,8 +45,6 @@ use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use App\Entity\ProjectSystem\Project; use App\Entity\UserSystem\User; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkInfoProviderImportJobPart; use App\Services\Trees\NodesListBuilder; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\QueryBuilder; diff --git a/src/DataTables/PartsDataTable.php b/src/DataTables/PartsDataTable.php index f63cb9a4..a97762b1 100644 --- a/src/DataTables/PartsDataTable.php +++ b/src/DataTables/PartsDataTable.php @@ -43,7 +43,6 @@ use App\Entity\Parts\ManufacturingStatus; use App\Entity\Parts\Part; use App\Entity\Parts\PartLot; use App\Entity\ProjectSystem\Project; -use App\Entity\BulkInfoProviderImportJobPart; use App\Services\EntityURLGenerator; use App\Services\Formatters\AmountFormatter; use App\Settings\BehaviorSettings\TableSettings; diff --git a/src/Entity/BulkImportJobStatus.php b/src/Entity/InfoProviderSystem/BulkImportJobStatus.php similarity index 87% rename from src/Entity/BulkImportJobStatus.php rename to src/Entity/InfoProviderSystem/BulkImportJobStatus.php index 87bc9ef2..7a88802f 100644 --- a/src/Entity/BulkImportJobStatus.php +++ b/src/Entity/InfoProviderSystem/BulkImportJobStatus.php @@ -20,7 +20,10 @@ declare(strict_types=1); -namespace App\Entity; +namespace App\Entity\InfoProviderSystem; + +use Symfony\Contracts\Translation\TranslatableInterface; +use Symfony\Contracts\Translation\TranslatorInterface; enum BulkImportJobStatus: string { diff --git a/src/Entity/InfoProviderSystem/BulkImportPartStatus.php b/src/Entity/InfoProviderSystem/BulkImportPartStatus.php new file mode 100644 index 00000000..0eedc553 --- /dev/null +++ b/src/Entity/InfoProviderSystem/BulkImportPartStatus.php @@ -0,0 +1,32 @@ +. + */ + +declare(strict_types=1); + +namespace App\Entity\InfoProviderSystem; + + +enum BulkImportPartStatus: string +{ + case PENDING = 'pending'; + case COMPLETED = 'completed'; + case SKIPPED = 'skipped'; + case FAILED = 'failed'; +} diff --git a/src/Entity/BulkInfoProviderImportJob.php b/src/Entity/InfoProviderSystem/BulkInfoProviderImportJob.php similarity index 99% rename from src/Entity/BulkInfoProviderImportJob.php rename to src/Entity/InfoProviderSystem/BulkInfoProviderImportJob.php index e1355e77..bc842a26 100644 --- a/src/Entity/BulkInfoProviderImportJob.php +++ b/src/Entity/InfoProviderSystem/BulkInfoProviderImportJob.php @@ -20,18 +20,18 @@ declare(strict_types=1); -namespace App\Entity; +namespace App\Entity\InfoProviderSystem; use App\Entity\Base\AbstractDBElement; use App\Entity\Parts\Part; use App\Entity\UserSystem\User; -use App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO; use App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO; +use App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; -use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\Mapping as ORM; #[ORM\Entity] #[ORM\Table(name: 'bulk_info_provider_import_jobs')] diff --git a/src/Entity/BulkInfoProviderImportJobPart.php b/src/Entity/InfoProviderSystem/BulkInfoProviderImportJobPart.php similarity index 83% rename from src/Entity/BulkInfoProviderImportJobPart.php rename to src/Entity/InfoProviderSystem/BulkInfoProviderImportJobPart.php index 3625f377..90519561 100644 --- a/src/Entity/BulkInfoProviderImportJobPart.php +++ b/src/Entity/InfoProviderSystem/BulkInfoProviderImportJobPart.php @@ -1,4 +1,22 @@ . + */ declare(strict_types=1); @@ -21,21 +39,13 @@ declare(strict_types=1); * along with this program. If not, see . */ -namespace App\Entity; +namespace App\Entity\InfoProviderSystem; use App\Entity\Base\AbstractDBElement; use App\Entity\Parts\Part; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; -enum BulkImportPartStatus: string -{ - case PENDING = 'pending'; - case COMPLETED = 'completed'; - case SKIPPED = 'skipped'; - case FAILED = 'failed'; -} - #[ORM\Entity] #[ORM\Table(name: 'bulk_info_provider_import_job_parts')] #[ORM\UniqueConstraint(name: 'unique_job_part', columns: ['job_id', 'part_id'])] @@ -169,4 +179,4 @@ class BulkInfoProviderImportJobPart extends AbstractDBElement { return $this->status === BulkImportPartStatus::FAILED; } -} \ No newline at end of file +} diff --git a/src/Entity/LogSystem/LogTargetType.php b/src/Entity/LogSystem/LogTargetType.php index 1e07ddc5..61a2b081 100644 --- a/src/Entity/LogSystem/LogTargetType.php +++ b/src/Entity/LogSystem/LogTargetType.php @@ -24,8 +24,8 @@ namespace App\Entity\LogSystem; use App\Entity\Attachments\Attachment; use App\Entity\Attachments\AttachmentType; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkInfoProviderImportJobPart; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parameters\AbstractParameter; use App\Entity\Parts\Category; diff --git a/src/Entity/Parts/Part.php b/src/Entity/Parts/Part.php index 98c1b884..2f274a8a 100644 --- a/src/Entity/Parts/Part.php +++ b/src/Entity/Parts/Part.php @@ -22,8 +22,6 @@ declare(strict_types=1); namespace App\Entity\Parts; -use App\ApiPlatform\Filter\TagFilter; -use Doctrine\Common\Collections\Criteria; use ApiPlatform\Doctrine\Common\Filter\DateFilterInterface; use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter; use ApiPlatform\Doctrine\Orm\Filter\DateFilter; @@ -40,10 +38,12 @@ use ApiPlatform\Serializer\Filter\PropertyFilter; use App\ApiPlatform\Filter\EntityFilter; use App\ApiPlatform\Filter\LikeFilter; use App\ApiPlatform\Filter\PartStoragelocationFilter; +use App\ApiPlatform\Filter\TagFilter; use App\Entity\Attachments\Attachment; use App\Entity\Attachments\AttachmentContainingDBElement; use App\Entity\Attachments\PartAttachment; use App\Entity\EDA\EDAPartInfo; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use App\Entity\Parameters\ParametersTrait; use App\Entity\Parameters\PartParameter; use App\Entity\Parts\PartTraits\AdvancedPropertyTrait; @@ -55,11 +55,11 @@ use App\Entity\Parts\PartTraits\ManufacturerTrait; use App\Entity\Parts\PartTraits\OrderTrait; use App\Entity\Parts\PartTraits\ProjectTrait; use App\EntityListeners\TreeCacheInvalidationListener; -use App\Entity\BulkInfoProviderImportJobPart; use App\Repository\PartRepository; use App\Validator\Constraints\UniqueObjectCollection; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Serializer\Annotation\Groups; diff --git a/src/Form/Filters/Constraints/BulkImportJobExistsConstraintType.php b/src/Form/Filters/Constraints/BulkImportJobExistsConstraintType.php deleted file mode 100644 index e26b5f5a..00000000 --- a/src/Form/Filters/Constraints/BulkImportJobExistsConstraintType.php +++ /dev/null @@ -1,63 +0,0 @@ -. - */ - -namespace App\Form\Filters\Constraints; - -use App\DataTables\Filters\Constraints\Part\BulkImportJobExistsConstraint; -use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\ChoiceType; -use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Form\FormInterface; -use Symfony\Component\Form\FormView; -use Symfony\Component\OptionsResolver\OptionsResolver; - -class BulkImportJobExistsConstraintType extends AbstractType -{ - public function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults([ - 'compound' => true, - 'data_class' => BulkImportJobExistsConstraint::class, - ]); - } - - public function buildForm(FormBuilderInterface $builder, array $options): void - { - $choices = [ - '' => '', - 'part.filter.in_bulk_import_job.yes' => true, - 'part.filter.in_bulk_import_job.no' => false, - ]; - - $builder->add('value', ChoiceType::class, [ - 'label' => 'part.filter.in_bulk_import_job', - 'choices' => $choices, - 'required' => false, - ]); - } - - public function buildView(FormView $view, FormInterface $form, array $options): void - { - parent::buildView($view, $form, $options); - } -} \ No newline at end of file diff --git a/src/Form/Filters/Constraints/BulkImportJobStatusConstraintType.php b/src/Form/Filters/Constraints/BulkImportJobStatusConstraintType.php deleted file mode 100644 index 6809f98b..00000000 --- a/src/Form/Filters/Constraints/BulkImportJobStatusConstraintType.php +++ /dev/null @@ -1,80 +0,0 @@ -. - */ - -namespace App\Form\Filters\Constraints; - -use App\DataTables\Filters\Constraints\Part\BulkImportJobStatusConstraint; -use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\ChoiceType; -use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Form\FormInterface; -use Symfony\Component\Form\FormView; -use Symfony\Component\OptionsResolver\OptionsResolver; - -class BulkImportJobStatusConstraintType extends AbstractType -{ - public function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults([ - 'compound' => true, - 'data_class' => BulkImportJobStatusConstraint::class, - ]); - } - - public function buildForm(FormBuilderInterface $builder, array $options): void - { - $statusChoices = [ - 'bulk_import.status.pending' => 'pending', - 'bulk_import.status.in_progress' => 'in_progress', - 'bulk_import.status.completed' => 'completed', - 'bulk_import.status.stopped' => 'stopped', - 'bulk_import.status.failed' => 'failed', - ]; - - $operatorChoices = [ - 'filter.choice_constraint.operator.ANY' => 'ANY', - 'filter.choice_constraint.operator.NONE' => 'NONE', - ]; - - $builder->add('operator', ChoiceType::class, [ - 'label' => 'filter.operator', - 'choices' => $operatorChoices, - 'required' => false, - ]); - - $builder->add('values', ChoiceType::class, [ - 'label' => 'part.filter.bulk_import_job_status', - 'choices' => $statusChoices, - 'required' => false, - 'multiple' => true, - 'attr' => [ - 'data-controller' => 'elements--select-multiple', - ] - ]); - } - - public function buildView(FormView $view, FormInterface $form, array $options): void - { - parent::buildView($view, $form, $options); - } -} \ No newline at end of file diff --git a/src/Form/Filters/Constraints/BulkImportPartStatusConstraintType.php b/src/Form/Filters/Constraints/BulkImportPartStatusConstraintType.php deleted file mode 100644 index e02a3197..00000000 --- a/src/Form/Filters/Constraints/BulkImportPartStatusConstraintType.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace App\Form\Filters\Constraints; - -use App\DataTables\Filters\Constraints\Part\BulkImportPartStatusConstraint; -use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\ChoiceType; -use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Form\FormInterface; -use Symfony\Component\Form\FormView; -use Symfony\Component\OptionsResolver\OptionsResolver; - -class BulkImportPartStatusConstraintType extends AbstractType -{ - public function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults([ - 'compound' => true, - 'data_class' => BulkImportPartStatusConstraint::class, - ]); - } - - public function buildForm(FormBuilderInterface $builder, array $options): void - { - $statusChoices = [ - 'bulk_import.part_status.pending' => 'pending', - 'bulk_import.part_status.completed' => 'completed', - 'bulk_import.part_status.skipped' => 'skipped', - 'bulk_import.part_status.failed' => 'failed', - ]; - - $operatorChoices = [ - 'filter.choice_constraint.operator.ANY' => 'ANY', - 'filter.choice_constraint.operator.NONE' => 'NONE', - ]; - - $builder->add('operator', ChoiceType::class, [ - 'label' => 'filter.operator', - 'choices' => $operatorChoices, - 'required' => false, - ]); - - $builder->add('values', ChoiceType::class, [ - 'label' => 'part.filter.bulk_import_part_status', - 'choices' => $statusChoices, - 'required' => false, - 'multiple' => true, - 'attr' => [ - 'data-controller' => 'elements--select-multiple', - ] - ]); - } - - public function buildView(FormView $view, FormInterface $form, array $options): void - { - parent::buildView($view, $form, $options); - } -} \ No newline at end of file diff --git a/src/Form/Filters/PartFilterType.php b/src/Form/Filters/PartFilterType.php index 1515c61b..871f9b07 100644 --- a/src/Form/Filters/PartFilterType.php +++ b/src/Form/Filters/PartFilterType.php @@ -22,9 +22,12 @@ declare(strict_types=1); */ namespace App\Form\Filters; +use App\DataTables\Filters\Constraints\Part\BulkImportPartStatusConstraint; use App\DataTables\Filters\Constraints\Part\ParameterConstraint; use App\DataTables\Filters\PartFilter; use App\Entity\Attachments\AttachmentType; +use App\Entity\InfoProviderSystem\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkImportPartStatus; use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; @@ -32,13 +35,13 @@ use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use App\Entity\ProjectSystem\Project; -use App\Entity\BulkInfoProviderImportJob; use App\Form\Filters\Constraints\BooleanConstraintType; use App\Form\Filters\Constraints\BulkImportJobExistsConstraintType; use App\Form\Filters\Constraints\BulkImportJobStatusConstraintType; use App\Form\Filters\Constraints\BulkImportPartStatusConstraintType; use App\Form\Filters\Constraints\ChoiceConstraintType; use App\Form\Filters\Constraints\DateTimeConstraintType; +use App\Form\Filters\Constraints\EnumConstraintType; use App\Form\Filters\Constraints\NumberConstraintType; use App\Form\Filters\Constraints\ParameterConstraintType; use App\Form\Filters\Constraints\StructuralEntityConstraintType; @@ -54,6 +57,8 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use function Symfony\Component\Translation\t; + class PartFilterType extends AbstractType { public function __construct(private readonly Security $security) @@ -307,14 +312,22 @@ class PartFilterType extends AbstractType **************************************************************************/ if ($this->security->isGranted('@info_providers.create_parts')) { $builder - ->add('inBulkImportJob', BulkImportJobExistsConstraintType::class, [ + ->add('inBulkImportJob', BooleanConstraintType::class, [ 'label' => 'part.filter.in_bulk_import_job', ]) - ->add('bulkImportJobStatus', BulkImportJobStatusConstraintType::class, [ + ->add('bulkImportJobStatus', EnumConstraintType::class, [ + 'enum_class' => BulkImportJobStatus::class, 'label' => 'part.filter.bulk_import_job_status', + 'choice_label' => function (BulkImportJobStatus $value) { + return t('bulk_import.status.' . $value->value); + }, ]) - ->add('bulkImportPartStatus', BulkImportPartStatusConstraintType::class, [ + ->add('bulkImportPartStatus', EnumConstraintType::class, [ + 'enum_class' => BulkImportPartStatus::class, 'label' => 'part.filter.bulk_import_part_status', + 'choice_label' => function (BulkImportPartStatus $value) { + return t('bulk_import.part_status.' . $value->value); + }, ]) ; } diff --git a/src/Services/ElementTypeNameGenerator.php b/src/Services/ElementTypeNameGenerator.php index 21b91acd..326707b7 100644 --- a/src/Services/ElementTypeNameGenerator.php +++ b/src/Services/ElementTypeNameGenerator.php @@ -22,15 +22,13 @@ declare(strict_types=1); namespace App\Services; -use App\Entity\Attachments\AttachmentContainingDBElement; use App\Entity\Attachments\Attachment; +use App\Entity\Attachments\AttachmentContainingDBElement; use App\Entity\Attachments\AttachmentType; use App\Entity\Base\AbstractDBElement; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkInfoProviderImportJobPart; use App\Entity\Contracts\NamedElementInterface; -use App\Entity\Parts\PartAssociation; -use App\Entity\ProjectSystem\Project; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parameters\AbstractParameter; use App\Entity\Parts\Category; @@ -38,12 +36,14 @@ use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\Part; +use App\Entity\Parts\PartAssociation; use App\Entity\Parts\PartLot; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use App\Entity\PriceInformations\Currency; use App\Entity\PriceInformations\Orderdetail; use App\Entity\PriceInformations\Pricedetail; +use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Entity\UserSystem\Group; use App\Entity\UserSystem\User; diff --git a/tests/Controller/BulkInfoProviderImportControllerTest.php b/tests/Controller/BulkInfoProviderImportControllerTest.php index 3a04ea5b..a0f74599 100644 --- a/tests/Controller/BulkInfoProviderImportControllerTest.php +++ b/tests/Controller/BulkInfoProviderImportControllerTest.php @@ -22,10 +22,9 @@ declare(strict_types=1); namespace App\Tests\Controller; -use App\Controller\BulkInfoProviderImportController; +use App\Entity\InfoProviderSystem\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; use App\Entity\Parts\Part; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkImportJobStatus; use App\Entity\UserSystem\User; use App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultDTO; use App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultsDTO; diff --git a/tests/Controller/PartControllerTest.php b/tests/Controller/PartControllerTest.php index b523520b..c47c62f8 100644 --- a/tests/Controller/PartControllerTest.php +++ b/tests/Controller/PartControllerTest.php @@ -22,16 +22,15 @@ declare(strict_types=1); namespace App\Tests\Controller; -use App\Entity\Parts\Part; -use App\Entity\Parts\PartLot; +use App\Entity\InfoProviderSystem\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; +use App\Entity\Parts\Part; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use App\Entity\UserSystem\User; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkImportJobStatus; use App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\HttpFoundation\Response; diff --git a/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php b/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php index 4090d7f7..326f0f0f 100644 --- a/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php +++ b/tests/DataTables/Filters/Constraints/Part/BulkImportJobStatusConstraintTest.php @@ -23,8 +23,7 @@ declare(strict_types=1); namespace App\Tests\DataTables\Filters\Constraints\Part; use App\DataTables\Filters\Constraints\Part\BulkImportJobStatusConstraint; -use App\Entity\BulkInfoProviderImportJobPart; -use App\Entity\Parts\Part; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\QueryBuilder; use PHPUnit\Framework\TestCase; @@ -40,7 +39,7 @@ class BulkImportJobStatusConstraintTest extends TestCase $this->constraint = new BulkImportJobStatusConstraint(); $this->entityManager = $this->createMock(EntityManagerInterface::class); $this->queryBuilder = $this->createMock(QueryBuilder::class); - + $this->queryBuilder->method('getEntityManager') ->willReturn($this->entityManager); } @@ -56,7 +55,7 @@ class BulkImportJobStatusConstraintTest extends TestCase { $values = ['pending', 'in_progress']; $this->constraint->setValues($values); - + $this->assertEquals($values, $this->constraint->getValues()); } @@ -64,21 +63,21 @@ class BulkImportJobStatusConstraintTest extends TestCase { $operator = 'ANY'; $this->constraint->setOperator($operator); - + $this->assertEquals($operator, $this->constraint->getOperator()); } public function testIsEnabledWithEmptyValues(): void { $this->constraint->setOperator('ANY'); - + $this->assertFalse($this->constraint->isEnabled()); } public function testIsEnabledWithNullOperator(): void { $this->constraint->setValues(['pending']); - + $this->assertFalse($this->constraint->isEnabled()); } @@ -86,27 +85,27 @@ class BulkImportJobStatusConstraintTest extends TestCase { $this->constraint->setValues(['pending']); $this->constraint->setOperator('ANY'); - + $this->assertTrue($this->constraint->isEnabled()); } public function testApplyWithEmptyValues(): void { $this->constraint->setOperator('ANY'); - + $this->queryBuilder->expects($this->never()) ->method('andWhere'); - + $this->constraint->apply($this->queryBuilder); } public function testApplyWithNullOperator(): void { $this->constraint->setValues(['pending']); - + $this->queryBuilder->expects($this->never()) ->method('andWhere'); - + $this->constraint->apply($this->queryBuilder); } @@ -114,7 +113,7 @@ class BulkImportJobStatusConstraintTest extends TestCase { $this->constraint->setValues(['pending', 'in_progress']); $this->constraint->setOperator('ANY'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); @@ -122,18 +121,18 @@ class BulkImportJobStatusConstraintTest extends TestCase $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('andWhere')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + $this->queryBuilder->expects($this->once()) ->method('andWhere') ->with('EXISTS (EXISTS_SUBQUERY_DQL)'); - + $this->queryBuilder->expects($this->once()) ->method('setParameter') ->with('job_status_values', ['pending', 'in_progress']); - + $this->constraint->apply($this->queryBuilder); } @@ -141,7 +140,7 @@ class BulkImportJobStatusConstraintTest extends TestCase { $this->constraint->setValues(['completed']); $this->constraint->setOperator('NONE'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); @@ -149,18 +148,18 @@ class BulkImportJobStatusConstraintTest extends TestCase $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('andWhere')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + $this->queryBuilder->expects($this->once()) ->method('andWhere') ->with('NOT EXISTS (EXISTS_SUBQUERY_DQL)'); - + $this->queryBuilder->expects($this->once()) ->method('setParameter') ->with('job_status_values', ['completed']); - + $this->constraint->apply($this->queryBuilder); } @@ -168,21 +167,21 @@ class BulkImportJobStatusConstraintTest extends TestCase { $this->constraint->setValues(['pending']); $this->constraint->setOperator('UNKNOWN'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); $subQueryBuilder->method('join')->willReturnSelf(); $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + // Should not call andWhere for unsupported operator $this->queryBuilder->expects($this->never()) ->method('andWhere'); - + $this->constraint->apply($this->queryBuilder); } @@ -190,42 +189,42 @@ class BulkImportJobStatusConstraintTest extends TestCase { $this->constraint->setValues(['pending']); $this->constraint->setOperator('ANY'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); - + $subQueryBuilder->expects($this->once()) ->method('select') ->with('1') ->willReturnSelf(); - + $subQueryBuilder->expects($this->once()) ->method('from') ->with(BulkInfoProviderImportJobPart::class, 'bip_status') ->willReturnSelf(); - + $subQueryBuilder->expects($this->once()) ->method('join') ->with('bip_status.job', 'job_status') ->willReturnSelf(); - + $subQueryBuilder->expects($this->once()) ->method('where') ->with('bip_status.part = part.id') ->willReturnSelf(); - + $subQueryBuilder->expects($this->once()) ->method('andWhere') ->with('job_status.status IN (:job_status_values)') ->willReturnSelf(); - + $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + $this->queryBuilder->method('andWhere'); $this->queryBuilder->method('setParameter'); - + $this->constraint->apply($this->queryBuilder); } @@ -235,17 +234,17 @@ class BulkImportJobStatusConstraintTest extends TestCase $this->constraint->setValues(['pending']); $this->constraint->setOperator('ANY'); $this->assertTrue($this->constraint->isEnabled()); - + $this->constraint->setValues([]); $this->assertFalse($this->constraint->isEnabled()); - + $this->constraint->setValues(['completed']); $this->assertTrue($this->constraint->isEnabled()); - + $this->constraint->setOperator(null); $this->assertFalse($this->constraint->isEnabled()); - + $this->constraint->setOperator('NONE'); $this->assertTrue($this->constraint->isEnabled()); } -} \ No newline at end of file +} diff --git a/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php b/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php index eb48fb63..5ac1fa95 100644 --- a/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php +++ b/tests/DataTables/Filters/Constraints/Part/BulkImportPartStatusConstraintTest.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace App\Tests\DataTables\Filters\Constraints\Part; use App\DataTables\Filters\Constraints\Part\BulkImportPartStatusConstraint; -use App\Entity\BulkInfoProviderImportJobPart; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\QueryBuilder; use PHPUnit\Framework\TestCase; @@ -39,7 +39,7 @@ class BulkImportPartStatusConstraintTest extends TestCase $this->constraint = new BulkImportPartStatusConstraint(); $this->entityManager = $this->createMock(EntityManagerInterface::class); $this->queryBuilder = $this->createMock(QueryBuilder::class); - + $this->queryBuilder->method('getEntityManager') ->willReturn($this->entityManager); } @@ -55,7 +55,7 @@ class BulkImportPartStatusConstraintTest extends TestCase { $values = ['pending', 'completed', 'skipped']; $this->constraint->setValues($values); - + $this->assertEquals($values, $this->constraint->getValues()); } @@ -63,21 +63,21 @@ class BulkImportPartStatusConstraintTest extends TestCase { $operator = 'ANY'; $this->constraint->setOperator($operator); - + $this->assertEquals($operator, $this->constraint->getOperator()); } public function testIsEnabledWithEmptyValues(): void { $this->constraint->setOperator('ANY'); - + $this->assertFalse($this->constraint->isEnabled()); } public function testIsEnabledWithNullOperator(): void { $this->constraint->setValues(['pending']); - + $this->assertFalse($this->constraint->isEnabled()); } @@ -85,27 +85,27 @@ class BulkImportPartStatusConstraintTest extends TestCase { $this->constraint->setValues(['pending']); $this->constraint->setOperator('ANY'); - + $this->assertTrue($this->constraint->isEnabled()); } public function testApplyWithEmptyValues(): void { $this->constraint->setOperator('ANY'); - + $this->queryBuilder->expects($this->never()) ->method('andWhere'); - + $this->constraint->apply($this->queryBuilder); } public function testApplyWithNullOperator(): void { $this->constraint->setValues(['pending']); - + $this->queryBuilder->expects($this->never()) ->method('andWhere'); - + $this->constraint->apply($this->queryBuilder); } @@ -113,25 +113,25 @@ class BulkImportPartStatusConstraintTest extends TestCase { $this->constraint->setValues(['pending', 'completed']); $this->constraint->setOperator('ANY'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('andWhere')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + $this->queryBuilder->expects($this->once()) ->method('andWhere') ->with('EXISTS (EXISTS_SUBQUERY_DQL)'); - + $this->queryBuilder->expects($this->once()) ->method('setParameter') ->with('part_status_values', ['pending', 'completed']); - + $this->constraint->apply($this->queryBuilder); } @@ -139,25 +139,25 @@ class BulkImportPartStatusConstraintTest extends TestCase { $this->constraint->setValues(['failed']); $this->constraint->setOperator('NONE'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('andWhere')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + $this->queryBuilder->expects($this->once()) ->method('andWhere') ->with('NOT EXISTS (EXISTS_SUBQUERY_DQL)'); - + $this->queryBuilder->expects($this->once()) ->method('setParameter') ->with('part_status_values', ['failed']); - + $this->constraint->apply($this->queryBuilder); } @@ -165,20 +165,20 @@ class BulkImportPartStatusConstraintTest extends TestCase { $this->constraint->setValues(['pending']); $this->constraint->setOperator('UNKNOWN'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + // Should not call andWhere for unsupported operator $this->queryBuilder->expects($this->never()) ->method('andWhere'); - + $this->constraint->apply($this->queryBuilder); } @@ -186,37 +186,37 @@ class BulkImportPartStatusConstraintTest extends TestCase { $this->constraint->setValues(['completed', 'skipped']); $this->constraint->setOperator('ANY'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); - + $subQueryBuilder->expects($this->once()) ->method('select') ->with('1') ->willReturnSelf(); - + $subQueryBuilder->expects($this->once()) ->method('from') ->with(BulkInfoProviderImportJobPart::class, 'bip_part_status') ->willReturnSelf(); - + $subQueryBuilder->expects($this->once()) ->method('where') ->with('bip_part_status.part = part.id') ->willReturnSelf(); - + $subQueryBuilder->expects($this->once()) ->method('andWhere') ->with('bip_part_status.status IN (:part_status_values)') ->willReturnSelf(); - + $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + $this->queryBuilder->method('andWhere'); $this->queryBuilder->method('setParameter'); - + $this->constraint->apply($this->queryBuilder); } @@ -226,16 +226,16 @@ class BulkImportPartStatusConstraintTest extends TestCase $this->constraint->setValues(['pending']); $this->constraint->setOperator('ANY'); $this->assertTrue($this->constraint->isEnabled()); - + $this->constraint->setValues([]); $this->assertFalse($this->constraint->isEnabled()); - + $this->constraint->setValues(['completed', 'skipped']); $this->assertTrue($this->constraint->isEnabled()); - + $this->constraint->setOperator(null); $this->assertFalse($this->constraint->isEnabled()); - + $this->constraint->setOperator('NONE'); $this->assertTrue($this->constraint->isEnabled()); } @@ -246,29 +246,29 @@ class BulkImportPartStatusConstraintTest extends TestCase // It queries the part status directly, not the job status $this->constraint->setValues(['pending']); $this->constraint->setOperator('ANY'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('andWhere')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + // Should use different alias than job status constraint $subQueryBuilder->expects($this->once()) ->method('from') ->with(BulkInfoProviderImportJobPart::class, 'bip_part_status'); - + // Should not join with job table like job status constraint does $subQueryBuilder->expects($this->never()) ->method('join'); - + $this->queryBuilder->method('andWhere'); $this->queryBuilder->method('setParameter'); - + $this->constraint->apply($this->queryBuilder); } @@ -277,23 +277,23 @@ class BulkImportPartStatusConstraintTest extends TestCase $statusValues = ['pending', 'completed', 'skipped', 'failed']; $this->constraint->setValues($statusValues); $this->constraint->setOperator('ANY'); - + $subQueryBuilder = $this->createMock(QueryBuilder::class); $subQueryBuilder->method('select')->willReturnSelf(); $subQueryBuilder->method('from')->willReturnSelf(); $subQueryBuilder->method('where')->willReturnSelf(); $subQueryBuilder->method('andWhere')->willReturnSelf(); $subQueryBuilder->method('getDQL')->willReturn('EXISTS_SUBQUERY_DQL'); - + $this->entityManager->method('createQueryBuilder') ->willReturn($subQueryBuilder); - + $this->queryBuilder->expects($this->once()) ->method('setParameter') ->with('part_status_values', $statusValues); - + $this->constraint->apply($this->queryBuilder); - + $this->assertEquals($statusValues, $this->constraint->getValues()); } -} \ No newline at end of file +} diff --git a/tests/Entity/BulkImportJobStatusTest.php b/tests/Entity/BulkImportJobStatusTest.php index 48f5d8b4..e8b4a977 100644 --- a/tests/Entity/BulkImportJobStatusTest.php +++ b/tests/Entity/BulkImportJobStatusTest.php @@ -22,7 +22,7 @@ declare(strict_types=1); namespace App\Tests\Entity; -use App\Entity\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkImportJobStatus; use PHPUnit\Framework\TestCase; class BulkImportJobStatusTest extends TestCase @@ -39,7 +39,7 @@ class BulkImportJobStatusTest extends TestCase public function testEnumCases(): void { $cases = BulkImportJobStatus::cases(); - + $this->assertCount(5, $cases); $this->assertContains(BulkImportJobStatus::PENDING, $cases); $this->assertContains(BulkImportJobStatus::IN_PROGRESS, $cases); @@ -68,4 +68,4 @@ class BulkImportJobStatusTest extends TestCase $this->expectException(\ValueError::class); BulkImportJobStatus::from('invalid'); } -} \ No newline at end of file +} diff --git a/tests/Entity/BulkInfoProviderImportJobPartTest.php b/tests/Entity/BulkInfoProviderImportJobPartTest.php index a539aebc..dd9600dd 100644 --- a/tests/Entity/BulkInfoProviderImportJobPartTest.php +++ b/tests/Entity/BulkInfoProviderImportJobPartTest.php @@ -22,9 +22,9 @@ declare(strict_types=1); namespace App\Tests\Entity; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkInfoProviderImportJobPart; -use App\Entity\BulkImportPartStatus; +use App\Entity\InfoProviderSystem\BulkImportPartStatus; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJobPart; use App\Entity\Parts\Part; use PHPUnit\Framework\TestCase; @@ -38,7 +38,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase { $this->job = $this->createMock(BulkInfoProviderImportJob::class); $this->part = $this->createMock(Part::class); - + $this->jobPart = new BulkInfoProviderImportJobPart($this->job, $this->part); } @@ -54,9 +54,9 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testGetAndSetJob(): void { $newJob = $this->createMock(BulkInfoProviderImportJob::class); - + $result = $this->jobPart->setJob($newJob); - + $this->assertSame($this->jobPart, $result); $this->assertSame($newJob, $this->jobPart->getJob()); } @@ -64,9 +64,9 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testGetAndSetPart(): void { $newPart = $this->createMock(Part::class); - + $result = $this->jobPart->setPart($newPart); - + $this->assertSame($this->jobPart, $result); $this->assertSame($newPart, $this->jobPart->getPart()); } @@ -74,7 +74,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testGetAndSetStatus(): void { $result = $this->jobPart->setStatus(BulkImportPartStatus::COMPLETED); - + $this->assertSame($this->jobPart, $result); $this->assertEquals(BulkImportPartStatus::COMPLETED, $this->jobPart->getStatus()); } @@ -82,9 +82,9 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testGetAndSetReason(): void { $reason = 'Test reason'; - + $result = $this->jobPart->setReason($reason); - + $this->assertSame($this->jobPart, $result); $this->assertEquals($reason, $this->jobPart->getReason()); } @@ -92,9 +92,9 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testGetAndSetCompletedAt(): void { $completedAt = new \DateTimeImmutable(); - + $result = $this->jobPart->setCompletedAt($completedAt); - + $this->assertSame($this->jobPart, $result); $this->assertSame($completedAt, $this->jobPart->getCompletedAt()); } @@ -102,11 +102,11 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testMarkAsCompleted(): void { $beforeTime = new \DateTimeImmutable(); - + $result = $this->jobPart->markAsCompleted(); - + $afterTime = new \DateTimeImmutable(); - + $this->assertSame($this->jobPart, $result); $this->assertEquals(BulkImportPartStatus::COMPLETED, $this->jobPart->getStatus()); $this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt()); @@ -118,11 +118,11 @@ class BulkInfoProviderImportJobPartTest extends TestCase { $reason = 'Skipped for testing'; $beforeTime = new \DateTimeImmutable(); - + $result = $this->jobPart->markAsSkipped($reason); - + $afterTime = new \DateTimeImmutable(); - + $this->assertSame($this->jobPart, $result); $this->assertEquals(BulkImportPartStatus::SKIPPED, $this->jobPart->getStatus()); $this->assertEquals($reason, $this->jobPart->getReason()); @@ -134,7 +134,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testMarkAsSkippedWithoutReason(): void { $result = $this->jobPart->markAsSkipped(); - + $this->assertSame($this->jobPart, $result); $this->assertEquals(BulkImportPartStatus::SKIPPED, $this->jobPart->getStatus()); $this->assertEquals('', $this->jobPart->getReason()); @@ -145,11 +145,11 @@ class BulkInfoProviderImportJobPartTest extends TestCase { $reason = 'Failed for testing'; $beforeTime = new \DateTimeImmutable(); - + $result = $this->jobPart->markAsFailed($reason); - + $afterTime = new \DateTimeImmutable(); - + $this->assertSame($this->jobPart, $result); $this->assertEquals(BulkImportPartStatus::FAILED, $this->jobPart->getStatus()); $this->assertEquals($reason, $this->jobPart->getReason()); @@ -161,7 +161,7 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testMarkAsFailedWithoutReason(): void { $result = $this->jobPart->markAsFailed(); - + $this->assertSame($this->jobPart, $result); $this->assertEquals(BulkImportPartStatus::FAILED, $this->jobPart->getStatus()); $this->assertEquals('', $this->jobPart->getReason()); @@ -172,9 +172,9 @@ class BulkInfoProviderImportJobPartTest extends TestCase { // First mark as completed to have something to reset $this->jobPart->markAsCompleted(); - + $result = $this->jobPart->markAsPending(); - + $this->assertSame($this->jobPart, $result); $this->assertEquals(BulkImportPartStatus::PENDING, $this->jobPart->getStatus()); $this->assertNull($this->jobPart->getReason()); @@ -184,13 +184,13 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testIsPending(): void { $this->assertTrue($this->jobPart->isPending()); - + $this->jobPart->setStatus(BulkImportPartStatus::COMPLETED); $this->assertFalse($this->jobPart->isPending()); - + $this->jobPart->setStatus(BulkImportPartStatus::SKIPPED); $this->assertFalse($this->jobPart->isPending()); - + $this->jobPart->setStatus(BulkImportPartStatus::FAILED); $this->assertFalse($this->jobPart->isPending()); } @@ -198,13 +198,13 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testIsCompleted(): void { $this->assertFalse($this->jobPart->isCompleted()); - + $this->jobPart->setStatus(BulkImportPartStatus::COMPLETED); $this->assertTrue($this->jobPart->isCompleted()); - + $this->jobPart->setStatus(BulkImportPartStatus::SKIPPED); $this->assertFalse($this->jobPart->isCompleted()); - + $this->jobPart->setStatus(BulkImportPartStatus::FAILED); $this->assertFalse($this->jobPart->isCompleted()); } @@ -212,13 +212,13 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testIsSkipped(): void { $this->assertFalse($this->jobPart->isSkipped()); - + $this->jobPart->setStatus(BulkImportPartStatus::SKIPPED); $this->assertTrue($this->jobPart->isSkipped()); - + $this->jobPart->setStatus(BulkImportPartStatus::COMPLETED); $this->assertFalse($this->jobPart->isSkipped()); - + $this->jobPart->setStatus(BulkImportPartStatus::FAILED); $this->assertFalse($this->jobPart->isSkipped()); } @@ -226,13 +226,13 @@ class BulkInfoProviderImportJobPartTest extends TestCase public function testIsFailed(): void { $this->assertFalse($this->jobPart->isFailed()); - + $this->jobPart->setStatus(BulkImportPartStatus::FAILED); $this->assertTrue($this->jobPart->isFailed()); - + $this->jobPart->setStatus(BulkImportPartStatus::COMPLETED); $this->assertFalse($this->jobPart->isFailed()); - + $this->jobPart->setStatus(BulkImportPartStatus::SKIPPED); $this->assertFalse($this->jobPart->isFailed()); } @@ -251,23 +251,23 @@ class BulkInfoProviderImportJobPartTest extends TestCase $this->assertTrue($this->jobPart->isPending()); $this->jobPart->markAsCompleted(); $this->assertTrue($this->jobPart->isCompleted()); - + // Test completed -> pending $this->jobPart->markAsPending(); $this->assertTrue($this->jobPart->isPending()); - + // Test pending -> skipped $this->jobPart->markAsSkipped('Test reason'); $this->assertTrue($this->jobPart->isSkipped()); - + // Test skipped -> pending $this->jobPart->markAsPending(); $this->assertTrue($this->jobPart->isPending()); - + // Test pending -> failed $this->jobPart->markAsFailed('Test error'); $this->assertTrue($this->jobPart->isFailed()); - + // Test failed -> pending $this->jobPart->markAsPending(); $this->assertTrue($this->jobPart->isPending()); @@ -278,24 +278,24 @@ class BulkInfoProviderImportJobPartTest extends TestCase // Initially no reason or completion time $this->assertNull($this->jobPart->getReason()); $this->assertNull($this->jobPart->getCompletedAt()); - + // After marking as skipped, should have reason and completion time $this->jobPart->markAsSkipped('Skipped reason'); $this->assertEquals('Skipped reason', $this->jobPart->getReason()); $this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt()); - + // After marking as pending, reason and completion time should be cleared $this->jobPart->markAsPending(); $this->assertNull($this->jobPart->getReason()); $this->assertNull($this->jobPart->getCompletedAt()); - + // After marking as failed, should have reason and completion time $this->jobPart->markAsFailed('Failed reason'); $this->assertEquals('Failed reason', $this->jobPart->getReason()); $this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt()); - + // After marking as completed, should have completion time (reason may remain from previous state) $this->jobPart->markAsCompleted(); $this->assertInstanceOf(\DateTimeImmutable::class, $this->jobPart->getCompletedAt()); } -} \ No newline at end of file +} diff --git a/tests/Entity/BulkInfoProviderImportJobTest.php b/tests/Entity/BulkInfoProviderImportJobTest.php index 7053b613..c9841ac4 100644 --- a/tests/Entity/BulkInfoProviderImportJobTest.php +++ b/tests/Entity/BulkInfoProviderImportJobTest.php @@ -22,14 +22,13 @@ declare(strict_types=1); namespace App\Tests\Entity; -use App\Entity\BulkInfoProviderImportJob; -use App\Entity\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkImportJobStatus; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; use App\Entity\UserSystem\User; use App\Services\InfoProviderSystem\DTOs\BulkSearchFieldMappingDTO; use App\Services\InfoProviderSystem\DTOs\BulkSearchPartResultDTO; use App\Services\InfoProviderSystem\DTOs\BulkSearchResponseDTO; use App\Services\InfoProviderSystem\DTOs\SearchResultDTO; -use Doctrine\ORM\Mapping\FieldMapping; use PHPUnit\Framework\TestCase; class BulkInfoProviderImportJobTest extends TestCase diff --git a/tests/Services/ElementTypeNameGeneratorTest.php b/tests/Services/ElementTypeNameGeneratorTest.php index c893fe2a..84b8ee8e 100644 --- a/tests/Services/ElementTypeNameGeneratorTest.php +++ b/tests/Services/ElementTypeNameGeneratorTest.php @@ -25,12 +25,12 @@ namespace App\Tests\Services; use App\Entity\Attachments\PartAttachment; use App\Entity\Base\AbstractDBElement; use App\Entity\Base\AbstractNamedDBElement; -use App\Entity\BulkInfoProviderImportJob; +use App\Entity\InfoProviderSystem\BulkInfoProviderImportJob; use App\Entity\Parts\Category; use App\Entity\Parts\Part; use App\Exceptions\EntityNotSupportedException; -use App\Services\Formatters\AmountFormatter; use App\Services\ElementTypeNameGenerator; +use App\Services\Formatters\AmountFormatter; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class ElementTypeNameGeneratorTest extends WebTestCase