mirror of
https://github.com/AnimeThemes/animethemes-server.git
synced 2026-07-23 15:24:32 +02:00
146 lines
3.5 KiB
PHP
146 lines
3.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Enums\Auth\CrudPermission;
|
|
use App\Events\List\Playlist\PlaylistCreated;
|
|
use App\Models\Auth\User;
|
|
use App\Models\List\Playlist;
|
|
use App\Models\User\Like;
|
|
use App\Models\Wiki\Anime\Theme\AnimeThemeEntry;
|
|
use Illuminate\Support\Facades\Event;
|
|
|
|
use function Pest\Laravel\actingAs;
|
|
|
|
beforeEach(function (): void {
|
|
$this->mutation = '
|
|
mutation($entryId: Int, $playlistId: String) {
|
|
ToggleLike(entryId: $entryId, playlistId: $playlistId) {
|
|
animethemeentry: likeable {
|
|
... on AnimeThemeEntry {
|
|
id
|
|
}
|
|
}
|
|
playlist: likeable {
|
|
... on Playlist {
|
|
id
|
|
}
|
|
}
|
|
}
|
|
}
|
|
';
|
|
});
|
|
|
|
test('protected', function (): void {
|
|
$response = $this->graphQL(
|
|
$this->mutation,
|
|
[
|
|
'entryId' => fake()->randomDigitNotNull(),
|
|
],
|
|
);
|
|
|
|
$response->assertOk();
|
|
$response->assertJsonPath('errors.0.message', 'Unauthenticated.');
|
|
});
|
|
|
|
test('forbidden', function (): void {
|
|
actingAs(User::factory()->createOne());
|
|
|
|
$response = $this->graphQL(
|
|
$this->mutation,
|
|
[
|
|
// Needed for the bind resolver.
|
|
'entryId' => AnimeThemeEntry::factory()->createOne()->getKey(),
|
|
],
|
|
);
|
|
|
|
$response->assertOk();
|
|
$response->assertJsonPath('errors.0.message', 'This action is unauthorized.');
|
|
});
|
|
|
|
it('fails if more than one resource is passed', function (): void {
|
|
Event::fakeExcept(PlaylistCreated::class);
|
|
|
|
$user = User::factory()
|
|
->withPermissions(CrudPermission::CREATE->format(Like::class))
|
|
->createOne();
|
|
|
|
actingAs($user);
|
|
|
|
$entry = AnimeThemeEntry::factory()->createOne();
|
|
$playlist = Playlist::factory()->createOne();
|
|
|
|
$response = $this->graphQL(
|
|
$this->mutation,
|
|
[
|
|
'entryId' => $entry->getKey(),
|
|
'playlistId' => $playlist->hashid,
|
|
],
|
|
);
|
|
|
|
$response->assertOk();
|
|
$response->assertGraphQLValidationKeys(['entryId', 'playlistId']);
|
|
});
|
|
|
|
it('likes entry', function (): void {
|
|
Event::fakeExcept(PlaylistCreated::class);
|
|
|
|
$user = User::factory()
|
|
->withPermissions(CrudPermission::CREATE->format(Like::class))
|
|
->createOne();
|
|
|
|
actingAs($user);
|
|
|
|
$entry = AnimeThemeEntry::factory()->createOne();
|
|
|
|
$response = $this->graphQL(
|
|
$this->mutation,
|
|
[
|
|
'entryId' => $entry->getKey(),
|
|
],
|
|
);
|
|
|
|
$this->assertDatabaseCount(Like::class, 1);
|
|
$response->assertOk();
|
|
$response->assertJson([
|
|
'data' => [
|
|
'ToggleLike' => [
|
|
'animethemeentry' => [
|
|
'id' => $entry->getKey(),
|
|
],
|
|
],
|
|
],
|
|
]);
|
|
});
|
|
|
|
it('likes playlist', function (): void {
|
|
$user = User::factory()
|
|
->withPermissions(CrudPermission::CREATE->format(Like::class))
|
|
->createOne();
|
|
|
|
actingAs($user);
|
|
|
|
$playlist = Playlist::factory()->createOne([
|
|
Playlist::ATTRIBUTE_HASHID => fake()->word(),
|
|
]);
|
|
|
|
$response = $this->graphQL(
|
|
$this->mutation,
|
|
[
|
|
'playlistId' => $playlist->hashid,
|
|
],
|
|
);
|
|
|
|
$this->assertDatabaseCount(Like::class, 1);
|
|
$response->assertOk();
|
|
$response->assertJson([
|
|
'data' => [
|
|
'ToggleLike' => [
|
|
'playlist' => [
|
|
'id' => $playlist->hashid,
|
|
],
|
|
],
|
|
],
|
|
]);
|
|
});
|