koel/tests/Feature/SongTest.php

332 lines
11 KiB
PHP
Raw Normal View History

2016-03-05 09:01:12 +00:00
<?php
2017-02-14 06:53:02 +00:00
namespace Tests\Feature;
2016-03-05 09:01:12 +00:00
use App\Events\LibraryChanged;
use App\Models\Album;
use App\Models\Artist;
use App\Models\Song;
use App\Models\User;
2018-08-19 21:17:05 +00:00
use Exception;
2016-03-05 09:01:12 +00:00
2017-08-05 16:56:11 +00:00
class SongTest extends TestCase
2016-03-05 09:01:12 +00:00
{
2018-08-19 21:17:05 +00:00
/**
* @throws Exception
*/
2019-07-22 07:03:23 +00:00
public function setUp(): void
2016-05-30 16:19:52 +00:00
{
parent::setUp();
2018-08-19 21:17:05 +00:00
static::createSampleMediaSet();
2016-05-30 16:19:52 +00:00
}
/**
2018-08-19 21:17:05 +00:00
* @throws Exception
*/
2019-07-22 07:03:23 +00:00
public function testSingleUpdateAllInfoNoCompilation(): void
2016-03-05 09:01:12 +00:00
{
$this->expectsEvents(LibraryChanged::class);
$song = Song::orderBy('id', 'desc')->first();
2020-09-06 18:21:39 +00:00
$user = factory(User::class)->states('admin')->create();
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => 'Foo Bar',
'artistName' => 'John Cena',
'albumName' => 'One by One',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 0,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
2016-03-05 09:01:12 +00:00
2020-09-06 18:21:39 +00:00
$artist = Artist::where('name', 'John Cena')->first();
self::assertNotNull($artist);
2016-03-05 09:01:12 +00:00
2020-09-06 18:21:39 +00:00
$album = Album::where('name', 'One by One')->first();
self::assertNotNull($album);
2016-03-05 09:01:12 +00:00
2020-09-06 18:21:39 +00:00
self::assertDatabaseHas('songs', [
2016-03-05 09:01:12 +00:00
'id' => $song->id,
'album_id' => $album->id,
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
2016-03-05 09:01:12 +00:00
]);
}
2019-07-22 07:03:23 +00:00
public function testSingleUpdateSomeInfoNoCompilation(): void
2016-03-05 09:01:12 +00:00
{
$song = Song::orderBy('id', 'desc')->first();
$originalArtistId = $song->album->artist->id;
2020-09-06 18:21:39 +00:00
$user = factory(User::class)->states('admin')->create();
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => '',
'artistName' => '',
'albumName' => 'One by One',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 0,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
2016-03-05 09:01:12 +00:00
// We don't expect the song's artist to change
2020-09-06 18:21:39 +00:00
self::assertEquals($originalArtistId, Song::find($song->id)->album->artist->id);
2016-03-05 09:01:12 +00:00
// But we expect a new album to be created for this artist and contain this song
2020-09-06 18:21:39 +00:00
self::assertEquals('One by One', Song::find($song->id)->album->name);
2016-03-05 09:01:12 +00:00
}
2019-07-22 07:03:23 +00:00
public function testMultipleUpdateAllInfoNoCompilation(): void
2016-03-05 09:01:12 +00:00
{
$songIds = Song::orderBy('id', 'desc')->take(3)->pluck('id')->toArray();
2020-09-06 18:21:39 +00:00
$user = factory(User::class)->states('admin')->create();
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => $songIds,
'data' => [
'title' => 'foo',
'artistName' => 'John Cena',
'albumName' => 'One by One',
'lyrics' => 'bar',
'track' => 9999,
'compilationState' => 0,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
2016-03-05 09:01:12 +00:00
$songs = Song::orderBy('id', 'desc')->take(3)->get();
2016-05-27 03:32:52 +00:00
// Even though we post the title, lyrics, and tracks, we don't expect them to take any effect
// because we're updating multiple songs here.
2020-09-06 18:21:39 +00:00
self::assertNotEquals('foo', $songs[0]->title);
self::assertNotEquals('bar', $songs[2]->lyrics);
self::assertNotEquals(9999, $songs[2]->track);
2016-03-05 09:01:12 +00:00
// But all of these songs must now belong to a new album and artist set
2020-09-06 18:21:39 +00:00
self::assertEquals('One by One', $songs[0]->album->name);
self::assertEquals('One by One', $songs[1]->album->name);
self::assertEquals('One by One', $songs[2]->album->name);
2016-03-05 09:01:12 +00:00
2020-09-06 18:21:39 +00:00
self::assertEquals('John Cena', $songs[0]->album->artist->name);
self::assertEquals('John Cena', $songs[1]->album->artist->name);
self::assertEquals('John Cena', $songs[2]->album->artist->name);
2016-03-05 09:01:12 +00:00
}
2019-07-22 07:03:23 +00:00
public function testMultipleUpdateSomeInfoNoCompilation(): void
2016-03-05 09:01:12 +00:00
{
$originalSongs = Song::orderBy('id', 'desc')->take(3)->get();
$songIds = $originalSongs->pluck('id')->toArray();
2020-09-06 18:21:39 +00:00
$user = factory(User::class)->states('admin')->create();
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => $songIds,
'data' => [
'title' => 'Foo Bar',
'artistName' => 'John Cena',
'albumName' => '',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 0,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
2016-03-05 09:01:12 +00:00
$songs = Song::orderBy('id', 'desc')->take(3)->get();
// Even though the album name doesn't change, a new artist should have been created
// and thus, a new album with the same name was created as well.
2020-09-06 18:21:39 +00:00
self::assertEquals($songs[0]->album->name, $originalSongs[0]->album->name);
self::assertNotEquals($songs[0]->album->id, $originalSongs[0]->album->id);
self::assertEquals($songs[1]->album->name, $originalSongs[1]->album->name);
self::assertNotEquals($songs[1]->album->id, $originalSongs[1]->album->id);
self::assertEquals($songs[2]->album->name, $originalSongs[2]->album->name);
self::assertNotEquals($songs[2]->album->id, $originalSongs[2]->album->id);
2016-03-05 09:01:12 +00:00
// And of course, the new artist is...
2020-09-06 18:21:39 +00:00
self::assertEquals('John Cena', $songs[0]->album->artist->name); // JOHN CENA!!!
self::assertEquals('John Cena', $songs[1]->album->artist->name); // JOHN CENA!!!
self::assertEquals('John Cena', $songs[2]->album->artist->name); // And... JOHN CENAAAAAAAAAAA!!!
2016-03-05 09:01:12 +00:00
}
2016-04-24 04:37:04 +00:00
2019-07-22 07:03:23 +00:00
public function testSingleUpdateAllInfoYesCompilation(): void
2016-04-24 04:37:04 +00:00
{
$song = Song::orderBy('id', 'desc')->first();
2020-09-06 18:21:39 +00:00
$user = factory(User::class)->states('admin')->create();
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => 'Foo Bar',
'artistName' => 'John Cena',
'albumName' => 'One by One',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 1,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
2016-04-24 04:37:04 +00:00
$compilationAlbum = Album::whereArtistIdAndName(Artist::VARIOUS_ID, 'One by One')->first();
2020-09-06 18:21:39 +00:00
self::assertNotNull($compilationAlbum);
2016-04-24 04:37:04 +00:00
2017-04-23 16:01:02 +00:00
$artist = Artist::whereName('John Cena')->first();
2020-09-06 18:21:39 +00:00
self::assertNotNull($artist);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
self::assertDatabaseHas('songs', [
2016-04-24 04:37:04 +00:00
'id' => $song->id,
'artist_id' => $artist->id,
2016-04-24 04:37:04 +00:00
'album_id' => $compilationAlbum->id,
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
]);
// Now try changing stuff and make sure things work.
// Case 1: Keep compilation state and artist the same
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => 'Barz Qux',
'artistName' => 'John Cena',
'albumName' => 'Two by Two',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 2,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
/** @var Album $compilationAlbum */
$compilationAlbum = Album::where([
'artist_id' => Artist::VARIOUS_ID,
2020-09-06 21:20:42 +00:00
'name' => 'Two by Two',
2020-09-06 18:21:39 +00:00
])->first();
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
self::assertNotNull($compilationAlbum);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
$contributingArtist = Artist::where('name', 'John Cena')->first();
self::assertNotNull($contributingArtist);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
self::assertDatabaseHas('songs', [
2016-04-24 04:37:04 +00:00
'id' => $song->id,
'artist_id' => $contributingArtist->id,
2016-04-24 04:37:04 +00:00
'album_id' => $compilationAlbum->id,
]);
// Case 2: Keep compilation state, but change the artist.
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => 'Barz Qux',
'artistName' => 'Foo Fighters',
'albumName' => 'One by One',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 2,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
$compilationAlbum = Album::where([
'artist_id' => Artist::VARIOUS_ID,
2020-09-06 21:20:42 +00:00
'name' => 'One by One',
2020-09-06 18:21:39 +00:00
])->first();
self::assertNotNull($compilationAlbum);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
/** @var Artist $contributingArtist */
$contributingArtist = Artist::where('name', 'Foo Fighters')->first();
self::assertNotNull($contributingArtist);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
self::assertDatabaseHas('songs', [
2016-04-24 04:37:04 +00:00
'id' => $song->id,
'artist_id' => $contributingArtist->id,
2016-04-24 04:37:04 +00:00
'album_id' => $compilationAlbum->id,
]);
// Case 3: Change compilation state only
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => 'Barz Qux',
'artistName' => 'Foo Fighters',
'albumName' => 'One by One',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 0,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
/** @var Artist $artist */
$artist = Artist::where('name', 'Foo Fighters')->first();
self::assertNotNull($artist);
$album = Album::where([
'artist_id' => $artist->id,
'name' => 'One by One',
])->first();
self::assertNotNull($album);
2016-04-24 04:37:04 +00:00
2020-09-06 18:21:39 +00:00
self::assertDatabaseHas('songs', [
2016-04-24 04:37:04 +00:00
'id' => $song->id,
'artist_id' => $artist->id,
2016-04-24 04:37:04 +00:00
'album_id' => $album->id,
]);
// Case 3: Change compilation state and artist
// Remember to set the compilation state back to 1
2017-02-14 06:53:02 +00:00
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => 'Barz Qux',
'artistName' => 'Foo Fighters',
'albumName' => 'One by One',
'lyrics' => 'Lorem ipsum dolor sic amet.',
'track' => 1,
'compilationState' => 1,
],
2020-09-06 18:21:39 +00:00
], $user);
$this->putAsUser('/api/songs', [
'songs' => [$song->id],
'data' => [
'title' => 'Twilight of the Thunder God',
'artistName' => 'Amon Amarth',
'albumName' => 'Twilight of the Thunder God',
'lyrics' => 'Thor! Nanananananana Batman.',
'track' => 1,
'compilationState' => 0,
],
], $user)
2020-09-06 18:21:39 +00:00
->assertStatus(200);
$artist = Artist::where('name', 'Amon Amarth')->first();
self::assertNotNull($artist);
$album = Album::where([
'artist_id' => $artist->id,
'name' => 'Twilight of the Thunder God',
])->first();
self::assertNotNull($album);
self::assertDatabaseHas('songs', [
2016-04-24 04:37:04 +00:00
'id' => $song->id,
'artist_id' => $artist->id,
2016-04-24 04:37:04 +00:00
'album_id' => $album->id,
'lyrics' => 'Thor! Nanananananana Batman.', // haha
]);
}
2016-05-27 08:34:38 +00:00
2019-07-22 07:03:23 +00:00
public function testDeletingByChunk(): void
2016-09-26 07:32:16 +00:00
{
2020-09-06 18:21:39 +00:00
self::assertNotEquals(0, Song::count());
2016-09-26 07:32:16 +00:00
$ids = Song::select('id')->get()->pluck('id')->all();
Song::deleteByChunk($ids, 'id', 1);
2020-09-06 18:21:39 +00:00
self::assertEquals(0, Song::count());
2016-09-26 07:32:16 +00:00
}
2016-03-05 09:01:12 +00:00
}