streamerFactory = app(StreamerFactory::class); PHPMockery::mock('App\Services\Streamers', 'file_exists')->andReturn(true); } public function testCreateS3Streamer(): void { /** @var Song $song */ $song = Song::factory()->make(['path' => 's3://bucket/foo.mp3']); self::assertInstanceOf(S3Streamer::class, $this->streamerFactory->createStreamer($song)); } public function testCreateTranscodingStreamerIfSupported(): void { $this->swap(TranscodingService::class, Mockery::mock(TranscodingService::class, [ 'songShouldBeTranscoded' => true, ])); /** @var StreamerFactory $streamerFactory */ $streamerFactory = app(StreamerFactory::class); /** @var Song $song */ $song = Song::factory()->make(); self::assertInstanceOf(TranscodingStreamer::class, $streamerFactory->createStreamer($song)); } public function testCreateTranscodingStreamerIfForced(): void { $this->swap(TranscodingService::class, Mockery::mock(TranscodingService::class, [ 'songShouldBeTranscoded' => false, ])); /** @var StreamerFactory $streamerFactory */ $streamerFactory = app(StreamerFactory::class); /** @var Song $song */ $song = Song::factory()->make(); self::assertInstanceOf(TranscodingStreamer::class, $streamerFactory->createStreamer($song, true)); } /** @return array */ public function provideStreamingConfigData(): array { return [ [null, PhpStreamer::class], ['x-sendfile', XSendFileStreamer::class], ['x-accel-redirect', XAccelRedirectStreamer::class], ]; } /** * @dataProvider provideStreamingConfigData * * @param string|null $config * @param string $expectedClass */ public function testCreatePhpStreamer($config, $expectedClass): void { $this->swap(TranscodingService::class, Mockery::mock(TranscodingService::class, [ 'songShouldBeTranscoded' => false, ])); config(['koel.streaming.method' => $config]); /** @var StreamerFactory $streamerFactory */ $streamerFactory = app(StreamerFactory::class); /** @var Song $song */ $song = Song::factory()->make(); self::assertInstanceOf($expectedClass, $streamerFactory->createStreamer($song)); } }