TEST UNITARIOS (PhpStorm)
===
## Configuración PhpStorm
File -> Settings -> buscar phpunit y seleccionar el binario del vendor de nuestro proyecto


## Necesidad:
Obtener información de videos de youtube.
Basicamente se intenta simular el comportamiento de un caso de uso.
Por ejemplo:
Si un caso de uso que se conecta a la api de youtube o a base de datos nos debe dar la informacion de videos, para el ejemplo.
No testearemos infraestructura (conección guzzle o doctrine) pero si simularemos la obtención de datos.
---
## Implementación
El caso de uso es llama GetYoutubeVideos por lo que se crea el test "GetYoutubeVideosTest"
```
class GetYoutubeVideosTest extends TestCase
{
/**
* @test
* @throws Exception
*/
public function getYoutubeVideos()
{
//simulacion de datos
$youtubeData = YoutubeVideoStub::youtubeVideoCollection();
//call implementation repository
$youtubeRepository = ApiYoutubeRepositoryStub::withData($youtubeData);
//call use case
$useCase = new GetYoutubeVideos($youtubeRepository);
$youtubeVideos = $useCase->__invoke();
//assert
$this->assertSame($youtubeData, $youtubeVideos);
}
}
```
este caso de uso tiene inyectado una interface por inyección de dependencia, por tanto: "ApiYoutubeRepositoryStub" simulara este contenindo en una clase anonima.
```
class ApiYoutubeRepositoryStub
{
/**
* @param array $data
* @return ApiYoutubeRepositoryInterface
*/
public static function withData(array $data)
{
return self::repositoryWithData($data);
}
/**
* @param array $youtubeVideos
* @return ApiYoutubeRepositoryInterface
*/
private static function repositoryWithData(array $youtubeVideos = [])
{
return (
new class($youtubeVideos) implements ApiYoutubeRepositoryInterface
{
/**
* @var ArrayCollection
*/
private $youtubeVideos;
/**
* constructor.
*
* @param array $youtubeVideos
*/
public function __construct(array $youtubeVideos)
{
$this->youtubeVideos = new ArrayCollection($youtubeVideos);
}
/**
* @return array
*/
public function all(): array
{
return $this->youtubeVideos->toArray();
}
}
);
}
}
```
lo que quiere decir que nuestro repositorio ahora trabajara con una coleccion de objetos que nosotros somos los encaragados de pasarle y por tanto construirla, para ello usamos una simulacion de nuestro objeto de dominio "YoutubeVideo"
```
class YoutubeVideoStub
{
/**
* @return YoutubeVideo
* @throws Exception
*/
public static function YoutubeVideo()
{
return new YoutubeVideo(
Uuid::uuid4(),
new DateTime(),
md5(rand()),
uniqid()
);
}
/**
* @return YoutubeVideo[]
* @throws Exception
*/
public static function youtubeVideoCollection(): array
{
return [
self::YoutubeVideo(),
self::YoutubeVideo(),
self::YoutubeVideo(),
self::YoutubeVideo(),
];
}
}
```