I want to test this TokenProvider
<?phpdeclare(strict_types=1);namespace App\Services\Provider;use App\Repository\UserRepository;use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;use Lexik\Bundle\JWTAuthenticationBundle\Encoder\JWTEncoderInterface;use Symfony\Component\Security\Core\Exception\BadCredentialsException;/** * Class TokenProvider * @package App\Services\Provider */class TokenProvider{ /** @var JWTEncoderInterface */ private $JWTEncoder; /** @var UserPasswordEncoderInterface */ private $passwordEncoder; /** @var UserRepository */ private $userRepository; /** * TokenProvider constructor. * * @param JWTEncoderInterface $JWTEncoder * @param UserPasswordEncoderInterface $passwordEncoder * @param UserRepository $userRepository */ public function __construct(JWTEncoderInterface $JWTEncoder, UserPasswordEncoderInterface $passwordEncoder, UserRepository $userRepository) { $this->JWTEncoder = $JWTEncoder; $this->passwordEncoder = $passwordEncoder; $this->userRepository = $userRepository; } /** * @param string $email * @param string $password * * @return string * @throws \Lexik\Bundle\JWTAuthenticationBundle\Exception\JWTEncodeFailureException */ public function getToken(string $email, string $password): string { $user = $this->userRepository->findOneBy(['email' => $email, ]); if (!$user) { throw new NotFoundHttpException('User Not Found'); } $isValid = $this->passwordEncoder->isPasswordValid($user, $password); if (!$isValid) { throw new BadCredentialsException(); } return $this->JWTEncoder->encode(['email' => $user->getEmail(),'exp' => time() + 3600 // 1 hour expiration ]); }}
Here is my test. It's not finish yet.
I want to inject JWTEncoderInterface $encoder
and UserPasswordEncoder $passwordEncoder
in my testGetToken()
.
class TokenProviderTest extends TestCase{ /** * @throws \Lexik\Bundle\JWTAuthenticationBundle\Exception\JWTEncodeFailureException */ public function testGetToken() { $this->markTestSkipped(); $JWTEncoder = //TODO; $passwordEncoder = //TODO; $tokenProvider = new TokenProvider( $JWTEncoder, $passwordEncoder, new class extends UserRepository{ public function findOneBy(array $criteria, array $orderBy = null) { return (new User()) ->setEmail('kevin@leroi.com') ->setPassword('password') ; } } ); $token = $tokenProvider->getToken('kevin@leroi.com', 'password'); $this->assertEquals(true, $token); }}
What is the good way to do that in a TestCase?
I don't want to mock those two services because I want to check if my token is valid with LexikJWTAuthenticationBundle