/** * @test */ public function Build_ReturnUseCaseProxy() { $proxy = $this->builder->create(new AllAnnotationsUseCaseStub())->withReader(new AnnotationReader())->withCache(new CacheSpy())->withEventSender(new EventSenderSpy())->withEventFactory(new EventFactorySpy())->withLogger(new LoggerSpy())->withSecurity(new SecuritySpy())->withTransaction(new TransactionSpy())->build(); $this->assertInstanceOf(self::USE_CASE_PROXY_CLASS, $proxy); $this->assertEquals(new AllAnnotationsUseCaseStub(), $proxy->getUseCase()); $this->assertEquals(new UseCaseResponseStub(), $proxy->execute(new UseCaseRequestStub())); }
public function create(UseCase $useCase, $tagParameters) { try { /** @var UseCase $useCase */ $methodAnnotations = $this->reader->getMethodAnnotations(new \ReflectionMethod($useCase, 'execute')); /** @var UseCaseProxyBuilder $builder */ $this->builder->create($useCase)->withReader($this->reader); foreach ($methodAnnotations as $annotation) { if ($annotation instanceof SecurityAnnotation) { $this->builder->withSecurity($this->buildSecurity($tagParameters)); } if ($annotation instanceof CacheAnnotation) { $this->builder->withCache($this->buildCache($tagParameters)); } if ($annotation instanceof TransactionAnnotation) { $this->builder->withTransaction($this->buildTransaction($tagParameters)); } if ($annotation instanceof EventAnnotation) { $this->builder->withEventSender($this->buildEvent($tagParameters))->withEventFactory($this->buildEventFactory($tagParameters)); } } return $this->builder->build(); } catch (SecurityIsNotDefinedException $sinde) { throw new SecurityIsNotDefinedException('Security should be defined for use case: ' . get_class($useCase) . '. ' . $sinde->getMessage()); } catch (CacheIsNotDefinedException $cinde) { throw new CacheIsNotDefinedException('Cache should be defined for use case: ' . get_class($useCase) . '. ' . $cinde->getMessage()); } catch (TransactionIsNotDefinedException $tinde) { throw new TransactionIsNotDefinedException('Transaction should be defined for use case: ' . get_class($useCase) . '. ' . $tinde->getMessage()); } catch (EventIsNotDefinedException $einde) { throw new EventIsNotDefinedException('EventSender should be defined for use case: ' . get_class($useCase) . '. ' . $einde->getMessage()); } catch (EventFactoryIsNotDefinedException $efinde) { throw new EventFactoryIsNotDefinedException('EventFactory should be defined for use case: ' . get_class($useCase) . '. ' . $efinde->getMessage()); } }