2021-10-11 11:30:27 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Tests\Feature;
|
|
|
|
|
2024-01-25 16:21:26 +00:00
|
|
|
use App\Http\Resources\SongResource;
|
2021-10-11 11:30:27 +00:00
|
|
|
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;
|
2021-10-11 11:30:27 +00:00
|
|
|
|
2024-01-11 12:41:33 +00:00
|
|
|
use function Tests\create_user;
|
|
|
|
|
2021-10-11 11:30:27 +00:00
|
|
|
class PlaylistSongTest extends TestCase
|
|
|
|
{
|
2023-06-05 21:46:41 +00:00
|
|
|
public function testGetNormalPlaylist(): void
|
2021-10-11 11:30:27 +00:00
|
|
|
{
|
2023-06-05 21:46:41 +00:00
|
|
|
/** @var Playlist $playlist */
|
|
|
|
$playlist = Playlist::factory()->create();
|
2024-05-31 05:40:34 +00:00
|
|
|
$playlist->addPlayables(Song::factory(5)->create());
|
2023-06-05 21:46:41 +00:00
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->getAs("api/playlists/$playlist->id/songs", $playlist->user)
|
2024-01-25 16:21:26 +00:00
|
|
|
->assertJsonStructure(['*' => SongResource::JSON_STRUCTURE]);
|
2021-10-11 11:30:27 +00:00
|
|
|
}
|
|
|
|
|
2023-06-05 21:46:41 +00:00
|
|
|
public function testGetSmartPlaylist(): void
|
2021-10-11 11:30:27 +00:00
|
|
|
{
|
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)
|
2024-01-25 16:21:26 +00:00
|
|
|
->assertJsonStructure(['*' => SongResource::JSON_STRUCTURE]);
|
2021-10-11 11:30:27 +00:00
|
|
|
}
|
|
|
|
|
2023-06-05 21:46:41 +00:00
|
|
|
public function testNonOwnerCannotAccessPlaylist(): void
|
2021-10-11 11:30:27 +00:00
|
|
|
{
|
|
|
|
/** @var Playlist $playlist */
|
2024-01-11 12:41:33 +00:00
|
|
|
$playlist = Playlist::factory()->for(create_user())->create();
|
2024-05-31 05:40:34 +00:00
|
|
|
$playlist->addPlayables(Song::factory(5)->create());
|
2023-06-05 21:46:41 +00:00
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->getAs("api/playlists/$playlist->id/songs")
|
2023-06-05 21:46:41 +00:00
|
|
|
->assertForbidden();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testAddSongsToPlaylist(): void
|
|
|
|
{
|
|
|
|
/** @var Playlist $playlist */
|
|
|
|
$playlist = Playlist::factory()->create();
|
|
|
|
|
2024-04-18 11:27:07 +00:00
|
|
|
/** @var Collection<array-key, Song> $songs */
|
2023-06-05 21:46:41 +00:00
|
|
|
$songs = Song::factory(2)->create();
|
2021-10-11 11:30:27 +00:00
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->postAs("api/playlists/$playlist->id/songs", ['songs' => $songs->pluck('id')->all()], $playlist->user)
|
2024-01-29 21:58:50 +00:00
|
|
|
->assertSuccessful();
|
2023-06-05 21:46:41 +00:00
|
|
|
|
|
|
|
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();
|
|
|
|
|
2024-04-18 11:27:07 +00:00
|
|
|
/** @var Collection<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
|
|
|
|
2024-05-31 05:40:34 +00:00
|
|
|
$playlist->addPlayables($toRemainSongs->merge($toBeRemovedSongs));
|
2021-10-11 11:30:27 +00:00
|
|
|
|
2023-06-05 21:46:41 +00:00
|
|
|
self::assertCount(7, $playlist->songs);
|
2021-10-11 11:30:27 +00:00
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->deleteAs(
|
|
|
|
"api/playlists/$playlist->id/songs",
|
|
|
|
['songs' => $toBeRemovedSongs->pluck('id')->all()],
|
|
|
|
$playlist->user
|
|
|
|
)
|
2023-06-05 21:46:41 +00:00
|
|
|
->assertNoContent();
|
2021-10-11 11:30:27 +00:00
|
|
|
|
2023-06-05 21:46:41 +00:00
|
|
|
$playlist->refresh();
|
|
|
|
|
|
|
|
self::assertEqualsCanonicalizing($toRemainSongs->pluck('id')->all(), $playlist->songs->pluck('id')->all());
|
2021-10-11 11:30:27 +00:00
|
|
|
}
|
|
|
|
|
2023-06-05 21:46:41 +00:00
|
|
|
public function testNonOwnerCannotModifyPlaylist(): void
|
2021-10-11 11:30:27 +00:00
|
|
|
{
|
|
|
|
/** @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();
|
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->postAs("api/playlists/$playlist->id/songs", ['songs' => [$song->id]])
|
2023-06-05 21:46:41 +00:00
|
|
|
->assertForbidden();
|
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->deleteAs("api/playlists/$playlist->id/songs", ['songs' => [$song->id]])
|
2023-06-05 21:46:41 +00:00
|
|
|
->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'],
|
|
|
|
],
|
|
|
|
],
|
|
|
|
],
|
|
|
|
],
|
|
|
|
]);
|
2021-10-11 11:30:27 +00:00
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$songs = Song::factory(2)->create()->pluck('id')->all();
|
2021-10-11 11:30:27 +00:00
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->postAs("api/playlists/$playlist->id/songs", ['songs' => $songs], $playlist->user)
|
2023-06-05 21:46:41 +00:00
|
|
|
->assertForbidden();
|
2022-12-04 13:56:25 +00:00
|
|
|
|
2024-01-18 11:13:05 +00:00
|
|
|
$this->deleteAs("api/playlists/$playlist->id/songs", ['songs' => $songs], $playlist->user)
|
2023-06-05 21:46:41 +00:00
|
|
|
->assertForbidden();
|
2021-10-11 11:30:27 +00:00
|
|
|
}
|
|
|
|
}
|