2017-05-18 15:15:53 +01:00
|
|
|
<?php
|
|
|
|
|
2021-03-17 18:38:18 +00:00
|
|
|
declare(strict_types=1);
|
|
|
|
|
2017-05-18 15:15:53 +01:00
|
|
|
namespace Tests\Feature;
|
|
|
|
|
2022-09-24 18:28:05 +01:00
|
|
|
use Exception;
|
|
|
|
use GuzzleHttp\Client as GuzzleClient;
|
|
|
|
use GuzzleHttp\Handler\MockHandler;
|
|
|
|
use GuzzleHttp\HandlerStack;
|
|
|
|
use IndieAuth\Client as IndieAuthClient;
|
|
|
|
use JsonException;
|
2017-05-18 15:15:53 +01:00
|
|
|
use Mockery;
|
|
|
|
use Tests\TestCase;
|
|
|
|
|
|
|
|
class TokenEndpointTest extends TestCase
|
|
|
|
{
|
2022-09-24 18:28:05 +01:00
|
|
|
/**
|
|
|
|
* @test
|
2022-09-24 18:33:36 +01:00
|
|
|
*
|
2022-09-24 18:28:05 +01:00
|
|
|
* @throws JsonException
|
|
|
|
* @throws Exception
|
|
|
|
*/
|
2021-03-17 18:38:18 +00:00
|
|
|
public function tokenEndpointIssuesToken(): void
|
2017-05-18 15:15:53 +01:00
|
|
|
{
|
2022-09-24 18:28:05 +01:00
|
|
|
$mockIndieAuthClient = Mockery::mock(IndieAuthClient::class);
|
|
|
|
$mockIndieAuthClient->shouldReceive('discoverAuthorizationEndpoint')
|
2017-05-18 15:15:53 +01:00
|
|
|
->with(normalize_url(config('app.url')))
|
|
|
|
->once()
|
|
|
|
->andReturn('https://indieauth.com/auth');
|
2022-09-24 18:28:05 +01:00
|
|
|
$mockHandler = new MockHandler([
|
|
|
|
new \GuzzleHttp\Psr7\Response(200, [], json_encode([
|
2017-05-18 15:15:53 +01:00
|
|
|
'me' => config('app.url'),
|
|
|
|
'scope' => 'create update',
|
2022-09-24 18:28:05 +01:00
|
|
|
], JSON_THROW_ON_ERROR)),
|
|
|
|
]);
|
|
|
|
$handlerStack = HandlerStack::create($mockHandler);
|
|
|
|
$mockGuzzleClient = new GuzzleClient(['handler' => $handlerStack]);
|
|
|
|
$this->app->instance(IndieAuthClient::class, $mockIndieAuthClient);
|
|
|
|
$this->app->instance(GuzzleClient::class, $mockGuzzleClient);
|
2017-05-18 15:15:53 +01:00
|
|
|
$response = $this->post('/api/token', [
|
|
|
|
'me' => config('app.url'),
|
|
|
|
'code' => 'abc123',
|
2017-10-19 13:36:35 +01:00
|
|
|
'redirect_uri' => config('app.url') . '/indieauth-callback',
|
|
|
|
'client_id' => config('app.url') . '/micropub-client',
|
2022-09-24 18:28:05 +01:00
|
|
|
'state' => random_int(1000, 10000),
|
2017-05-18 15:15:53 +01:00
|
|
|
]);
|
2018-01-31 22:21:57 +00:00
|
|
|
$response->assertJson([
|
|
|
|
'me' => config('app.url'),
|
|
|
|
'scope' => 'create update',
|
|
|
|
]);
|
2017-05-18 15:15:53 +01:00
|
|
|
}
|
2017-12-18 15:51:02 +00:00
|
|
|
|
2022-09-24 18:28:05 +01:00
|
|
|
/**
|
|
|
|
* @test
|
2022-09-24 18:33:36 +01:00
|
|
|
*
|
2022-09-24 18:28:05 +01:00
|
|
|
* @throws JsonException
|
|
|
|
* @throws Exception
|
|
|
|
*/
|
2021-03-17 18:38:18 +00:00
|
|
|
public function tokenEndpointReturnsErrorWhenAuthEndpointLacksMeData(): void
|
2017-12-18 15:51:02 +00:00
|
|
|
{
|
2022-09-24 18:28:05 +01:00
|
|
|
$mockIndieAuthClient = Mockery::mock(IndieAuthClient::class);
|
|
|
|
$mockIndieAuthClient->shouldReceive('discoverAuthorizationEndpoint')
|
2017-12-18 15:51:02 +00:00
|
|
|
->with(normalize_url(config('app.url')))
|
|
|
|
->once()
|
|
|
|
->andReturn('https://indieauth.com/auth');
|
2022-09-24 18:28:05 +01:00
|
|
|
$mockHandler = new MockHandler([
|
|
|
|
new \GuzzleHttp\Psr7\Response(400, [], json_encode([
|
2017-12-18 15:51:02 +00:00
|
|
|
'error' => 'error_message',
|
2022-09-24 18:28:05 +01:00
|
|
|
], JSON_THROW_ON_ERROR)),
|
|
|
|
]);
|
|
|
|
$handlerStack = HandlerStack::create($mockHandler);
|
|
|
|
$mockGuzzleClient = new GuzzleClient(['handler' => $handlerStack]);
|
|
|
|
$this->app->instance(IndieAuthClient::class, $mockIndieAuthClient);
|
|
|
|
$this->app->instance(GuzzleClient::class, $mockGuzzleClient);
|
2017-12-18 15:51:02 +00:00
|
|
|
$response = $this->post('/api/token', [
|
|
|
|
'me' => config('app.url'),
|
|
|
|
'code' => 'abc123',
|
|
|
|
'redirect_uri' => config('app.url') . '/indieauth-callback',
|
|
|
|
'client_id' => config('app.url') . '/micropub-client',
|
2022-09-24 18:28:05 +01:00
|
|
|
'state' => random_int(1000, 10000),
|
2017-12-18 15:51:02 +00:00
|
|
|
]);
|
2018-01-31 22:21:57 +00:00
|
|
|
$response->assertStatus(401);
|
|
|
|
$response->assertJson([
|
2022-09-24 18:28:05 +01:00
|
|
|
'error' => 'There was an error verifying the IndieAuth code',
|
2018-01-31 22:21:57 +00:00
|
|
|
]);
|
2017-12-18 15:51:02 +00:00
|
|
|
}
|
|
|
|
|
2022-09-24 18:28:05 +01:00
|
|
|
/**
|
|
|
|
* @test
|
2022-09-24 18:33:36 +01:00
|
|
|
*
|
2022-09-24 18:28:05 +01:00
|
|
|
* @throws Exception
|
|
|
|
*/
|
2021-03-17 18:38:18 +00:00
|
|
|
public function tokenEndpointReturnsErrorWhenNoAuthEndpointFound(): void
|
2017-12-18 15:51:02 +00:00
|
|
|
{
|
2022-09-24 18:28:05 +01:00
|
|
|
$mockIndieAuthClient = Mockery::mock(IndieAuthClient::class);
|
|
|
|
$mockIndieAuthClient->shouldReceive('discoverAuthorizationEndpoint')
|
2017-12-18 15:51:02 +00:00
|
|
|
->with(normalize_url(config('app.url')))
|
|
|
|
->once()
|
|
|
|
->andReturn(null);
|
2022-09-24 18:28:05 +01:00
|
|
|
$this->app->instance(IndieAuthClient::class, $mockIndieAuthClient);
|
2017-12-18 15:51:02 +00:00
|
|
|
$response = $this->post('/api/token', [
|
|
|
|
'me' => config('app.url'),
|
|
|
|
'code' => 'abc123',
|
|
|
|
'redirect_uri' => config('app.url') . '/indieauth-callback',
|
|
|
|
'client_id' => config('app.url') . '/micropub-client',
|
2022-09-24 18:28:05 +01:00
|
|
|
'state' => random_int(1000, 10000),
|
2017-12-18 15:51:02 +00:00
|
|
|
]);
|
|
|
|
$response->assertStatus(400);
|
2018-01-31 22:21:57 +00:00
|
|
|
$response->assertJson([
|
2022-09-24 18:28:05 +01:00
|
|
|
'error' => 'Could not discover the authorization endpoint for ' . config('app.url'),
|
|
|
|
]);
|
2017-12-18 15:51:02 +00:00
|
|
|
}
|
2017-05-18 15:15:53 +01:00
|
|
|
}
|