jobRepo = $this->createMock(AIPipelineJobRepositoryInterface::class); $this->bus = $this->createMock(MessageBusInterface::class); $this->handler = new ValidationHandler($this->jobRepo, $this->bus); $this->job = new AIPipelineJob(AIPipelineJobType::Photo, ['test' => true]); } public function testDispatchesDraftMessageWhenAllAttributesPresent(): void { $this->jobRepo->method('findById')->willReturn($this->job); $type = new ArticleType('Notebook'); $ramDef = new AttributeDefinition('RAM', AttributeType::String); $cpuDef = new AttributeDefinition('CPU', AttributeType::String); $type->addAttributeDefinition($ramDef); $type->addAttributeDefinition($cpuDef); $attributes = [ $ramDef->getId()->toRfc4122() => '16 GB', $cpuDef->getId()->toRfc4122() => 'Intel i7', ]; $this->bus->expects(self::once()) ->method('dispatch') ->with(self::isInstanceOf(DraftArticleMessage::class)) ->willReturn(new Envelope(new \stdClass())); ($this->handler)(new ValidationMessage( jobId: $this->job->getId()->toRfc4122(), articleTypeId: $type->getId()->toRfc4122(), specsText: 'some specs', attributes: $attributes, )); } public function testRetriesJsonCodingWhenFieldsMissingAndUnderLimit(): void { $this->jobRepo->method('findById')->willReturn($this->job); $type = new ArticleType('Notebook'); $type->addAttributeDefinition(new AttributeDefinition('RAM', AttributeType::String)); $this->bus->expects(self::once()) ->method('dispatch') ->with(self::isInstanceOf(JsonCodingMessage::class)) ->willReturn(new Envelope(new \stdClass())); ($this->handler)(new ValidationMessage( jobId: $this->job->getId()->toRfc4122(), articleTypeId: $type->getId()->toRfc4122(), specsText: 'some specs', attributes: [], )); } }