Skip to content
This repository was archived by the owner on Jul 9, 2019. It is now read-only.
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
<?php
namespace Majora\Component\OAuth\Tests\GrantType;

use Majora\Component\OAuth\Entity\LoginAttempt;
use Majora\Component\OAuth\Exception\InvalidGrantException;
use Majora\Component\OAuth\GrantType\PasswordGrantExtension;
use Majora\Component\OAuth\Loader\AccountLoaderInterface;
use Majora\Component\OAuth\Model\AccountInterface;
use Majora\Component\OAuth\Model\ApplicationInterface;
use Prophecy\Argument;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\User\UserInterface;

/**
* Unit test class for Majora\Component\OAuth\GrantType\PasswordGrantTypeExtension.
*/
class PasswordGrantExtensionTest extends \PHPUnit_Framework_TestCase
{
public function testConfigureRequestParameters()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

phpdoc

{
$optionsResolver = new OptionsResolver();
$passwordGrantExtension = new PasswordGrantExtension(
$this->prophesize(AccountLoaderInterface::class)->reveal(),
$this->prophesize(UserPasswordEncoderInterface::class)->reveal()
);
$passwordGrantExtension->configureRequestParameters($optionsResolver);

$actualDefinedOptions = $optionsResolver->getDefinedOptions();
$expectedDefinedOptions = ['password', 'username'];
$this->assertEquals($expectedDefinedOptions, $actualDefinedOptions, '', $delta = 0.0, 10, true); // Not caring about keys
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Là un assert equals va planter tes tests si tu rajoutes une option, or une option supplémentaire ne casse pas la compatibilité.
Le test doit casser si une option obligatoire est rajoutée.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas faux, j'avais pas pensé à ça

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixé

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mais il faut aussi tester que les options optionnelles existent toujours.

}

public function testSuccessGrant()
{
// Mocking AccountInterface
/** @var AccountInterface $account */
$account = $this->prophesize(AccountInterface::class)->reveal();

// Mocking AccountLoaderInterface
$accountLoaderMock = $this->prophesize(AccountLoaderInterface::class);
$accountLoaderMock->retrieveOnApplicationByUsername(Argument::type(ApplicationInterface::class), 'username_test')->willReturn($account)->shouldBeCalled();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indent plz ✨

/** @var AccountLoaderInterface $accountLoader */
$accountLoader = $accountLoaderMock->reveal();

// Mocking UserPasswordEncoderInterface
$userPasswordEncoderMock = $this->prophesize(UserPasswordEncoderInterface::class);
$userPasswordEncoderMock->isPasswordValid(Argument::type(UserInterface::class), 'password_test')->willReturn(true)->shouldBeCalled();
/** @var UserPasswordEncoderInterface $userPasswordEncoder */
$userPasswordEncoder = $userPasswordEncoderMock->reveal();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fait le dans le constructeur


$passwordGrantExtension = new PasswordGrantExtension($accountLoader, $userPasswordEncoder);

// Mocking ApplicationInterface
$applicationMock = $this->prophesize(ApplicationInterface::class);
/** @var ApplicationInterface $application */
$application = $applicationMock->reveal();

// Mocking LoginAttempt
$loginAttemptMock = $this->prophesize(LoginAttempt::class);
$loginAttemptMock->getData('username')->willReturn('username_test')->shouldBeCalled();
$loginAttemptMock->getData('password')->willReturn('password_test')->shouldBeCalled();
/** @var LoginAttempt $loginAttempt */
$loginAttempt = $loginAttemptMock->reveal();

$actualAccount = $passwordGrantExtension->grant($application, $loginAttempt);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$actualAccount = $passwordGrantExtension->grant(
    $application->reveal(), 
    $loginAttempt->reveal()
);

$this->assertSame($account, $actualAccount);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Same" est overkill, envoyer une instance différente et néanmoins égale ne casse pas l'interface applicative de ta classe.

}

public function testGrantFailingAccountLoading()
{
// Mocking AccountInterface
/** @var AccountInterface $account */
$account = $this->prophesize(AccountInterface::class)->reveal();

// Mocking AccountLoaderInterface
$accountLoaderMock = $this->prophesize(AccountLoaderInterface::class);
$accountLoaderMock->retrieveOnApplicationByUsername(Argument::type(ApplicationInterface::class), 'username_test')->willReturn(null)->shouldBeCalled();
/** @var AccountLoaderInterface $accountLoader */
$accountLoader = $accountLoaderMock->reveal();

// Mocking UserPasswordEncoderInterface
$userPasswordEncoderMock = $this->prophesize(UserPasswordEncoderInterface::class);
/** @var UserPasswordEncoderInterface $userPasswordEncoder */
$userPasswordEncoder = $userPasswordEncoderMock->reveal();

$passwordGrantExtension = new PasswordGrantExtension($accountLoader, $userPasswordEncoder);

// Mocking ApplicationInterface
$applicationMock = $this->prophesize(ApplicationInterface::class);
/** @var ApplicationInterface $application */
$application = $applicationMock->reveal();

// Mocking LoginAttempt
$loginAttemptMock = $this->prophesize(LoginAttempt::class);
$loginAttemptMock->getData('username')->willReturn('username_test')->shouldBeCalled();
/** @var LoginAttempt $loginAttempt */
$loginAttempt = $loginAttemptMock->reveal();

$this->expectException(InvalidGrantException::class);
$passwordGrantExtension->grant($application, $loginAttempt);
}

public function testGrantFailingPasswordValidation()
{
// Mocking AccountInterface
/** @var AccountInterface $account */
$account = $this->prophesize(AccountInterface::class)->reveal();

// Mocking AccountLoaderInterface
$accountLoaderMock = $this->prophesize(AccountLoaderInterface::class);
$accountLoaderMock->retrieveOnApplicationByUsername(Argument::type(ApplicationInterface::class), 'username_test')->willReturn($account)->shouldBeCalled();
/** @var AccountLoaderInterface $accountLoader */
$accountLoader = $accountLoaderMock->reveal();

// Mocking UserPasswordEncoderInterface
$userPasswordEncoderMock = $this->prophesize(UserPasswordEncoderInterface::class);
$userPasswordEncoderMock->isPasswordValid(Argument::type(UserInterface::class), 'password_test')->willReturn(false)->shouldBeCalled();
/** @var UserPasswordEncoderInterface $userPasswordEncoder */
$userPasswordEncoder = $userPasswordEncoderMock->reveal();

$passwordGrantExtension = new PasswordGrantExtension($accountLoader, $userPasswordEncoder);

// Mocking ApplicationInterface
$applicationMock = $this->prophesize(ApplicationInterface::class);
/** @var ApplicationInterface $application */
$application = $applicationMock->reveal();

// Mocking LoginAttempt
$loginAttemptMock = $this->prophesize(LoginAttempt::class);
$loginAttemptMock->getData('username')->willReturn('username_test')->shouldBeCalled();
$loginAttemptMock->getData('password')->willReturn('password_test')->shouldBeCalled();
/** @var LoginAttempt $loginAttempt */
$loginAttempt = $loginAttemptMock->reveal();
$this->expectException(InvalidGrantException::class);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Teste aussi le message de l'exception vu que la classe peut servir dans plusieurs cas.


$passwordGrantExtension->grant($application, $loginAttempt);
}
}