2015-12-20 00:36:44 +08:00
|
|
|
<?php
|
|
|
|
|
2017-02-14 14:53:02 +08:00
|
|
|
namespace Tests\Feature;
|
|
|
|
|
2015-12-20 07:30:28 -05:00
|
|
|
use App\Models\User;
|
2018-08-18 15:19:40 +02:00
|
|
|
use App\Services\LastfmService;
|
2020-09-06 20:21:39 +02:00
|
|
|
use App\Services\TokenManager;
|
2020-09-07 22:43:23 +02:00
|
|
|
use Laravel\Sanctum\NewAccessToken;
|
|
|
|
use Laravel\Sanctum\PersonalAccessToken;
|
2018-08-29 14:05:24 +07:00
|
|
|
use Mockery;
|
2020-12-23 00:01:49 +01:00
|
|
|
use Mockery\MockInterface;
|
2015-12-20 00:36:44 +08:00
|
|
|
|
2017-08-05 17:56:11 +01:00
|
|
|
class LastfmTest extends TestCase
|
2015-12-20 00:36:44 +08:00
|
|
|
{
|
2018-08-31 20:47:15 +07:00
|
|
|
public function testSetSessionKey(): void
|
2016-01-26 14:32:29 +08:00
|
|
|
{
|
2020-09-06 23:11:48 +02:00
|
|
|
/** @var User $user */
|
2020-11-14 17:57:25 +01:00
|
|
|
$user = User::factory()->create();
|
2022-07-27 10:49:33 +02:00
|
|
|
$this->postAs('api/lastfm/session-key', ['key' => 'foo'], $user)
|
2022-07-27 17:32:36 +02:00
|
|
|
->assertNoContent();
|
2018-08-24 17:27:19 +02:00
|
|
|
|
2022-10-07 22:25:44 +08:00
|
|
|
self::assertSame('foo', $user->refresh()->lastfm_session_key);
|
2016-01-26 14:32:29 +08:00
|
|
|
}
|
|
|
|
|
2018-08-31 20:47:15 +07:00
|
|
|
public function testConnectToLastfm(): void
|
2015-12-20 20:17:35 +08:00
|
|
|
{
|
2020-09-06 20:21:39 +02:00
|
|
|
/** @var User $user */
|
2020-11-14 17:57:25 +01:00
|
|
|
$user = User::factory()->create();
|
2020-09-06 20:21:39 +02:00
|
|
|
$token = $user->createToken('Koel')->plainTextToken;
|
2015-12-20 20:17:35 +08:00
|
|
|
|
2020-12-23 00:01:49 +01:00
|
|
|
/** @var NewAccessToken|MockInterface $temporaryToken */
|
2020-09-07 22:43:23 +02:00
|
|
|
$temporaryToken = Mockery::mock(NewAccessToken::class);
|
|
|
|
$temporaryToken->plainTextToken = 'tmp-token';
|
|
|
|
|
2020-12-23 00:01:49 +01:00
|
|
|
$tokenManager = self::mock(TokenManager::class);
|
2020-09-07 22:43:23 +02:00
|
|
|
|
|
|
|
$tokenManager->shouldReceive('getUserFromPlainTextToken')
|
|
|
|
->with($token)
|
|
|
|
->andReturn($user);
|
|
|
|
|
|
|
|
$tokenManager->shouldReceive('createToken')
|
|
|
|
->once()
|
|
|
|
->with($user)
|
|
|
|
->andReturn($temporaryToken);
|
|
|
|
|
2020-12-22 21:11:22 +01:00
|
|
|
$this->get('lastfm/connect?api_token=' . $token)
|
2020-09-06 20:21:39 +02:00
|
|
|
->assertRedirect(
|
2020-12-22 21:11:22 +01:00
|
|
|
'https://www.last.fm/api/auth/?api_key=foo&cb=http%3A%2F%2Flocalhost%2Flastfm%2Fcallback%3Fapi_token%3Dtmp-token' // @phpcs-ignore-line
|
2020-09-06 20:21:39 +02:00
|
|
|
);
|
2015-12-20 20:17:35 +08:00
|
|
|
}
|
|
|
|
|
2020-09-07 22:43:23 +02:00
|
|
|
public function testCallback(): void
|
|
|
|
{
|
|
|
|
/** @var User $user */
|
2020-11-14 17:57:25 +01:00
|
|
|
$user = User::factory()->create();
|
2020-09-07 22:43:23 +02:00
|
|
|
$token = $user->createToken('Koel')->plainTextToken;
|
|
|
|
|
|
|
|
self::assertNotNull(PersonalAccessToken::findToken($token));
|
|
|
|
|
2021-06-04 18:19:34 +02:00
|
|
|
$lastfm = Mockery::mock(LastfmService::class)->makePartial();
|
2020-09-07 22:43:23 +02:00
|
|
|
|
|
|
|
$lastfm->shouldReceive('getSessionKey')
|
|
|
|
->with('lastfm-token')
|
|
|
|
->once()
|
|
|
|
->andReturn('my-session-key');
|
|
|
|
|
2021-06-04 18:19:34 +02:00
|
|
|
app()->instance(LastfmService::class, $lastfm);
|
|
|
|
|
2020-12-22 21:11:22 +01:00
|
|
|
$this->get('lastfm/callback?token=lastfm-token&api_token=' . urlencode($token))
|
2020-09-07 22:43:23 +02:00
|
|
|
->assertOk();
|
|
|
|
|
|
|
|
self::assertSame('my-session-key', $user->refresh()->lastfm_session_key);
|
|
|
|
// make sure the user's api token is deleted
|
|
|
|
self::assertNull(PersonalAccessToken::findToken($token));
|
|
|
|
}
|
|
|
|
|
2018-08-31 20:47:15 +07:00
|
|
|
public function testRetrieveAndStoreSessionKey(): void
|
2015-12-20 20:17:35 +08:00
|
|
|
{
|
2020-09-06 23:11:48 +02:00
|
|
|
/** @var User $user */
|
2020-11-14 17:57:25 +01:00
|
|
|
$user = User::factory()->create();
|
2020-09-06 23:11:48 +02:00
|
|
|
|
2021-06-04 18:19:34 +02:00
|
|
|
$lastfm = Mockery::mock(LastfmService::class)->makePartial();
|
|
|
|
|
2018-09-04 13:25:24 +07:00
|
|
|
$lastfm->shouldReceive('getSessionKey')
|
|
|
|
->once()
|
|
|
|
->with('foo')
|
2021-06-04 18:19:34 +02:00
|
|
|
->andReturn('my-session-key');
|
|
|
|
|
|
|
|
app()->instance(LastfmService::class, $lastfm);
|
2015-12-20 20:17:35 +08:00
|
|
|
|
2020-12-23 00:01:49 +01:00
|
|
|
$tokenManager = self::mock(TokenManager::class);
|
2021-06-04 18:19:34 +02:00
|
|
|
|
2020-09-06 23:11:48 +02:00
|
|
|
$tokenManager->shouldReceive('getUserFromPlainTextToken')
|
|
|
|
->once()
|
|
|
|
->with('my-token')
|
|
|
|
->andReturn($user);
|
|
|
|
|
2020-09-12 17:01:48 +02:00
|
|
|
$this->get('lastfm/callback?token=foo&api_token=my-token');
|
2015-12-20 20:17:35 +08:00
|
|
|
|
2022-10-07 22:25:44 +08:00
|
|
|
self::assertSame('my-session-key', $user->refresh()->lastfm_session_key);
|
2015-12-20 20:17:35 +08:00
|
|
|
}
|
|
|
|
|
2018-08-31 20:47:15 +07:00
|
|
|
public function testDisconnectUser(): void
|
2015-12-20 20:17:35 +08:00
|
|
|
{
|
2018-08-19 18:05:10 +02:00
|
|
|
/** @var User $user */
|
2021-06-04 18:19:34 +02:00
|
|
|
$user = User::factory()->create();
|
|
|
|
self::assertNotNull($user->lastfm_session_key);
|
2022-07-27 10:49:33 +02:00
|
|
|
$this->deleteAs('api/lastfm/disconnect', [], $user);
|
2018-08-19 18:05:10 +02:00
|
|
|
$user->refresh();
|
2015-12-21 21:49:00 +08:00
|
|
|
|
2020-09-06 20:21:39 +02:00
|
|
|
self::assertNull($user->lastfm_session_key);
|
2015-12-23 14:26:16 +08:00
|
|
|
}
|
2015-12-20 00:36:44 +08:00
|
|
|
}
|