Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\ApiBundle\Tests\Functional; | |
use Mautic\CoreBundle\Test\IsolatedTestTrait; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use PHPUnit\Framework\Assert; | |
use Symfony\Component\HttpFoundation\Request; | |
/** | |
* This test must run in a separate process because it sets the global constant | |
* MAUTIC_INSTALLER which breaks other tests. | |
* | |
* @runTestsInSeparateProcesses | |
* | |
* @preserveGlobalState disabled | |
*/ | |
final class Oauth2Test extends MauticMysqlTestCase | |
{ | |
use IsolatedTestTrait; | |
protected function setUp(): void | |
{ | |
$this->useCleanupRollback = false; | |
parent::setUp(); | |
} | |
public function testAuthWithInvalidCredentials(): void | |
{ | |
$this->client->enableReboot(); | |
// Disable the default logging in via username and password. | |
$this->clientServer = []; | |
$this->setUpSymfony($this->configParams); | |
$this->client->request( | |
Request::METHOD_POST, | |
'/oauth/v2/token', | |
[ | |
'grant_type' => 'client_credentials', | |
'client_id' => 'unicorn', | |
'client_secret' => 'secretUnicorn', | |
] | |
); | |
$response = $this->client->getResponse(); | |
Assert::assertSame(400, $response->getStatusCode(), $response->getContent()); | |
Assert::assertSame( | |
'{"errors":[{"message":"The client credentials are invalid","code":400,"type":"invalid_client"}]}', | |
$response->getContent() | |
); | |
} | |
public function testAuthWithInvalidAccessToken(): void | |
{ | |
$this->client->enableReboot(); | |
// Disable the default logging in via username and password. | |
$this->clientServer = []; | |
$this->setUpSymfony($this->configParams); | |
$this->client->request( | |
Request::METHOD_GET, | |
'/api/users', | |
[], | |
[], | |
[ | |
'HTTP_Authorization' => 'Bearer unicorn_token', | |
], | |
); | |
$response = $this->client->getResponse(); | |
Assert::assertSame(401, $response->getStatusCode(), $response->getContent()); | |
Assert::assertSame('{"errors":[{"message":"The access token provided is invalid.","code":401,"type":"invalid_grant"}]}', $response->getContent()); | |
} | |
public function testAuthWorkflow(): void | |
{ | |
$this->client->disableReboot(); | |
// Create OAuth2 credentials. | |
$crawler = $this->client->request(Request::METHOD_GET, 's/credentials/new'); | |
$saveButton = $crawler->selectButton('Save'); | |
$form = $saveButton->form(); | |
$form['client[name]']->setValue('Auth Test'); | |
$form['client[redirectUris]']->setValue('https://test.org'); | |
$crawler = $this->client->submit($form); | |
Assert::assertTrue($this->client->getResponse()->isOk(), $this->client->getResponse()->getContent()); | |
$clientPublicKey = $crawler->filter('input#client_publicId')->attr('value'); | |
$clientSecretKey = $crawler->filter('input#client_secret')->attr('value'); | |
// Disable the default logging in via username and password. | |
$this->clientServer = []; | |
$this->setUpSymfony($this->configParams); | |
// Get the access token. | |
$this->client->request( | |
Request::METHOD_POST, | |
'/oauth/v2/token', | |
[ | |
'grant_type' => 'client_credentials', | |
'client_id' => $clientPublicKey, | |
'client_secret' => $clientSecretKey, | |
], | |
); | |
$response = $this->client->getResponse(); | |
Assert::assertSame(200, $response->getStatusCode(), $response->getContent()); | |
$payload = json_decode($response->getContent(), true); | |
$accessToken = $payload['access_token']; | |
Assert::assertNotEmpty($accessToken); | |
// Test that the access token works by fetching users via API. | |
$this->client->request( | |
Request::METHOD_GET, | |
'/api/users', | |
[], | |
[], | |
[ | |
'HTTP_Authorization' => "Bearer {$accessToken}", | |
], | |
); | |
$response = $this->client->getResponse(); | |
Assert::assertSame(200, $response->getStatusCode()); | |
Assert::assertStringContainsString('"users":[', $response->getContent()); | |
} | |
} | |