koel/tests/Feature/PlaylistSongTest.php

144 lines
4.7 KiB
PHP
Raw Normal View History

<?php
namespace Tests\Feature;
use App\Models\Playlist;
use App\Models\Song;
2023-06-05 21:46:41 +00:00
use Illuminate\Support\Collection;
2024-01-09 18:34:40 +00:00
use Tests\TestCase;
2024-01-11 12:41:33 +00:00
use function Tests\create_user;
class PlaylistSongTest extends TestCase
{
2023-06-05 21:46:41 +00:00
public function testGetNormalPlaylist(): void
{
2023-06-05 21:46:41 +00:00
/** @var Playlist $playlist */
$playlist = Playlist::factory()->create();
$playlist->songs()->attach(Song::factory(5)->create());
$this->getAs('api/playlists/' . $playlist->id . '/songs', $playlist->user)
->assertJsonStructure(['*' => SongTest::JSON_STRUCTURE]);
}
2023-06-05 21:46:41 +00:00
public function testGetSmartPlaylist(): void
{
2023-06-05 21:46:41 +00:00
Song::factory()->create(['title' => 'A foo song']);
/** @var Playlist $playlist */
$playlist = Playlist::factory()->create([
'rules' => [
[
'id' => '45368b8f-fec8-4b72-b826-6b295af0da65',
'rules' => [
[
'id' => '2a4548cd-c67f-44d4-8fec-34ff75c8a026',
'model' => 'title',
'operator' => 'contains',
'value' => ['foo'],
],
],
],
],
]);
$this->getAs("api/playlists/$playlist->id/songs", $playlist->user)
->assertJsonStructure(['*' => SongTest::JSON_STRUCTURE]);
}
2023-06-05 21:46:41 +00:00
public function testNonOwnerCannotAccessPlaylist(): void
{
/** @var Playlist $playlist */
2024-01-11 12:41:33 +00:00
$playlist = Playlist::factory()->for(create_user())->create();
2023-06-05 21:46:41 +00:00
$playlist->songs()->attach(Song::factory(5)->create());
$this->getAs('api/playlists/' . $playlist->id . '/songs')
->assertForbidden();
}
public function testAddSongsToPlaylist(): void
{
/** @var Playlist $playlist */
$playlist = Playlist::factory()->create();
/** @var Collection|array<array-key, Song> $songs */
$songs = Song::factory(2)->create();
2023-06-05 21:46:41 +00:00
$this->postAs('api/playlists/' . $playlist->id . '/songs', [
'songs' => $songs->map(static fn (Song $song) => $song->id)->all(),
], $playlist->user)
->assertNoContent();
self::assertEqualsCanonicalizing($songs->pluck('id')->all(), $playlist->songs->pluck('id')->all());
}
public function testRemoveSongsFromPlaylist(): void
{
/** @var Playlist $playlist */
$playlist = Playlist::factory()->create();
$toRemainSongs = Song::factory(5)->create();
/** @var Collection|array<array-key, Song> $toBeRemovedSongs */
2022-07-27 10:44:25 +00:00
$toBeRemovedSongs = Song::factory(2)->create();
2023-06-05 21:46:41 +00:00
2022-07-27 10:44:25 +00:00
$playlist->songs()->attach($toRemainSongs->merge($toBeRemovedSongs));
2023-06-05 21:46:41 +00:00
self::assertCount(7, $playlist->songs);
2023-06-05 21:46:41 +00:00
$this->deleteAs('api/playlists/' . $playlist->id . '/songs', [
'songs' => $toBeRemovedSongs->map(static fn (Song $song) => $song->id)->all(),
], $playlist->user)
->assertNoContent();
2023-06-05 21:46:41 +00:00
$playlist->refresh();
self::assertEqualsCanonicalizing($toRemainSongs->pluck('id')->all(), $playlist->songs->pluck('id')->all());
}
2023-06-05 21:46:41 +00:00
public function testNonOwnerCannotModifyPlaylist(): void
{
/** @var Playlist $playlist */
2024-01-11 12:41:33 +00:00
$playlist = Playlist::factory()->for(create_user())->create();
2023-06-05 21:46:41 +00:00
/** @var Song $song */
$song = Song::factory()->create();
$this->postAs('api/playlists/' . $playlist->id . '/songs', ['songs' => [$song->id]])
->assertForbidden();
$this->deleteAs('api/playlists/' . $playlist->id . '/songs', ['songs' => [$song->id]])
->assertForbidden();
}
public function testSmartPlaylistContentCannotBeModified(): void
{
/** @var Playlist $playlist */
$playlist = Playlist::factory()->create([
'rules' => [
[
'id' => '45368b8f-fec8-4b72-b826-6b295af0da65',
'rules' => [
[
'id' => '2a4548cd-c67f-44d4-8fec-34ff75c8a026',
'model' => 'title',
'operator' => 'contains',
'value' => ['foo'],
],
],
],
],
]);
2023-06-05 21:46:41 +00:00
/** @var Collection|array<array-key, Song> $songs */
$songs = Song::factory(2)->create();
2023-06-05 21:46:41 +00:00
$songIds = $songs->map(static fn (Song $song) => $song->id)->all();
2023-06-05 21:46:41 +00:00
$this->postAs('api/playlists/' . $playlist->id . '/songs', ['songs' => $songIds], $playlist->user)
->assertForbidden();
2022-12-04 13:56:25 +00:00
2023-06-05 21:46:41 +00:00
$this->deleteAs('api/playlists/' . $playlist->id . '/songs', ['songs' => $songIds], $playlist->user)
->assertForbidden();
}
}