2018-08-22 19:59:14 +02:00
|
|
|
<?php
|
|
|
|
|
2018-08-31 20:47:15 +07:00
|
|
|
namespace Tests\Integration\Factories;
|
|
|
|
|
|
|
|
use App\Factories\StreamerFactory;
|
|
|
|
use App\Models\Song;
|
2021-01-31 18:49:54 +01:00
|
|
|
use App\Services\Streamers\PhpStreamer;
|
2018-08-31 20:47:15 +07:00
|
|
|
use App\Services\Streamers\S3Streamer;
|
|
|
|
use App\Services\Streamers\TranscodingStreamer;
|
|
|
|
use App\Services\Streamers\XAccelRedirectStreamer;
|
|
|
|
use App\Services\Streamers\XSendFileStreamer;
|
|
|
|
use App\Services\TranscodingService;
|
2020-12-23 00:01:49 +01:00
|
|
|
use Mockery;
|
2018-08-31 20:47:15 +07:00
|
|
|
use phpmock\mockery\PHPMockery;
|
2018-08-31 20:47:45 +07:00
|
|
|
use Tests\TestCase;
|
2018-08-31 20:47:15 +07:00
|
|
|
|
|
|
|
class StreamerFactoryTest extends TestCase
|
|
|
|
{
|
2021-06-05 12:47:56 +02:00
|
|
|
private StreamerFactory $streamerFactory;
|
2018-08-31 20:47:15 +07:00
|
|
|
|
2019-07-22 09:03:23 +02:00
|
|
|
public function setUp(): void
|
2018-08-23 08:58:43 +02:00
|
|
|
{
|
2018-08-31 20:47:15 +07:00
|
|
|
parent::setUp();
|
2020-12-22 21:11:22 +01:00
|
|
|
|
2018-08-31 20:47:15 +07:00
|
|
|
$this->streamerFactory = app(StreamerFactory::class);
|
|
|
|
PHPMockery::mock('App\Services\Streamers', 'file_exists')->andReturn(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testCreateS3Streamer(): void
|
|
|
|
{
|
|
|
|
/** @var Song $song */
|
2020-11-14 17:57:25 +01:00
|
|
|
$song = Song::factory()->make(['path' => 's3://bucket/foo.mp3']);
|
2018-08-31 20:47:15 +07:00
|
|
|
|
|
|
|
self::assertInstanceOf(S3Streamer::class, $this->streamerFactory->createStreamer($song));
|
2018-08-22 21:13:45 +02:00
|
|
|
}
|
2018-08-22 19:59:14 +02:00
|
|
|
|
2018-08-31 20:47:15 +07:00
|
|
|
public function testCreateTranscodingStreamerIfSupported(): void
|
2018-08-22 19:59:14 +02:00
|
|
|
{
|
2020-12-23 00:01:49 +01:00
|
|
|
$this->swap(TranscodingService::class, Mockery::mock(TranscodingService::class, [
|
2018-08-31 20:47:15 +07:00
|
|
|
'songShouldBeTranscoded' => true,
|
2020-12-23 00:01:49 +01:00
|
|
|
]));
|
2018-08-31 20:47:15 +07:00
|
|
|
|
|
|
|
/** @var StreamerFactory $streamerFactory */
|
|
|
|
$streamerFactory = app(StreamerFactory::class);
|
2020-11-14 17:57:25 +01:00
|
|
|
|
2018-08-31 20:47:15 +07:00
|
|
|
/** @var Song $song */
|
2020-11-14 17:57:25 +01:00
|
|
|
$song = Song::factory()->make();
|
2020-12-22 21:11:22 +01:00
|
|
|
self::assertInstanceOf(TranscodingStreamer::class, $streamerFactory->createStreamer($song));
|
2018-08-31 20:47:15 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
public function testCreateTranscodingStreamerIfForced(): void
|
|
|
|
{
|
2020-12-23 00:01:49 +01:00
|
|
|
$this->swap(TranscodingService::class, Mockery::mock(TranscodingService::class, [
|
2018-08-31 20:47:15 +07:00
|
|
|
'songShouldBeTranscoded' => false,
|
2020-12-23 00:01:49 +01:00
|
|
|
]));
|
2018-08-31 20:47:15 +07:00
|
|
|
|
|
|
|
/** @var StreamerFactory $streamerFactory */
|
|
|
|
$streamerFactory = app(StreamerFactory::class);
|
|
|
|
|
2021-07-26 23:21:36 +02:00
|
|
|
/** @var Song $song */
|
2020-11-14 17:57:25 +01:00
|
|
|
$song = Song::factory()->make();
|
2018-08-31 20:47:15 +07:00
|
|
|
self::assertInstanceOf(TranscodingStreamer::class, $streamerFactory->createStreamer($song, true));
|
|
|
|
}
|
|
|
|
|
2020-12-22 21:11:22 +01:00
|
|
|
/** @return array<mixed> */
|
2018-08-31 20:47:15 +07:00
|
|
|
public function provideStreamingConfigData(): array
|
|
|
|
{
|
|
|
|
return [
|
2021-01-31 18:49:54 +01:00
|
|
|
[null, PhpStreamer::class],
|
2018-08-31 20:47:15 +07:00
|
|
|
['x-sendfile', XSendFileStreamer::class],
|
|
|
|
['x-accel-redirect', XAccelRedirectStreamer::class],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider provideStreamingConfigData
|
|
|
|
*
|
|
|
|
* @param string|null $config
|
2020-12-22 21:11:22 +01:00
|
|
|
* @param string $expectedClass
|
2018-08-31 20:47:15 +07:00
|
|
|
*/
|
2021-01-31 18:49:54 +01:00
|
|
|
public function testCreatePhpStreamer($config, $expectedClass): void
|
2018-08-31 20:47:15 +07:00
|
|
|
{
|
2020-12-23 00:01:49 +01:00
|
|
|
$this->swap(TranscodingService::class, Mockery::mock(TranscodingService::class, [
|
2018-08-31 20:47:15 +07:00
|
|
|
'songShouldBeTranscoded' => false,
|
2020-12-23 00:01:49 +01:00
|
|
|
]));
|
2018-08-31 20:47:15 +07:00
|
|
|
|
|
|
|
config(['koel.streaming.method' => $config]);
|
|
|
|
|
|
|
|
/** @var StreamerFactory $streamerFactory */
|
|
|
|
$streamerFactory = app(StreamerFactory::class);
|
|
|
|
|
2021-07-26 23:21:36 +02:00
|
|
|
/** @var Song $song */
|
2020-11-14 17:57:25 +01:00
|
|
|
$song = Song::factory()->make();
|
2018-08-31 20:47:15 +07:00
|
|
|
self::assertInstanceOf($expectedClass, $streamerFactory->createStreamer($song));
|
2018-08-22 19:59:14 +02:00
|
|
|
}
|
|
|
|
}
|