Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feature #480 Add a complete test for AddUserCommand (dmaicher, javier…
…eguiluz) This PR was merged into the master branch. Discussion ---------- Add a complete test for AddUserCommand This adds a simple test for `AddUserCommand` that creates a user non-interactively and interactively. Fixes #473. Commits ------- 774adca Improved the PHPdoc of some methods c1d23f9 Fixed a variable name 3e15d59 Refactored the code and added some help notes a08c746 add simple test for AddUserCommand
- Loading branch information
Showing
1 changed file
with
113 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <fabien@symfony.com> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace Tests\Command; | ||
|
||
use AppBundle\Command\AddUserCommand; | ||
use AppBundle\Entity\User; | ||
use Symfony\Bundle\FrameworkBundle\Console\Application; | ||
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; | ||
use Symfony\Component\Console\Tester\CommandTester; | ||
|
||
class AddUserCommandTest extends KernelTestCase | ||
{ | ||
private $userData = [ | ||
'username' => 'chuck_norris', | ||
'password' => 'foobar', | ||
'email' => 'chuck@norris.com', | ||
'full-name' => 'Chuck Norris', | ||
]; | ||
|
||
/** | ||
* @dataProvider isAdminDataProvider | ||
* | ||
* This test provides all the arguments required by the command, so the | ||
* command runs non-interactively and it won't ask for any argument. | ||
*/ | ||
public function testCreateUserNonInteractive($isAdmin) | ||
{ | ||
$input = $this->userData; | ||
if ($isAdmin) { | ||
$input['--admin'] = 1; | ||
} | ||
$this->executeCommand($input); | ||
|
||
$this->assertUserCreated($isAdmin); | ||
} | ||
|
||
/** | ||
* @dataProvider isAdminDataProvider | ||
* | ||
* This test doesn't provide all the arguments required by the command, so | ||
* the command runs interactively and it will ask for the value of the missing | ||
* arguments. | ||
* See https://symfony.com/doc/current/components/console/helpers/questionhelper.html#testing-a-command-that-expects-input | ||
*/ | ||
public function testCreateUserInteractive($isAdmin) | ||
{ | ||
$this->executeCommand( | ||
// these are the arguments (only 1 is passed, the rest are missing) | ||
$isAdmin ? ['--admin' => 1] : [], | ||
// these are the responses given to the questions asked by the command | ||
// to get the value of the missing required arguments | ||
array_values($this->userData) | ||
); | ||
|
||
$this->assertUserCreated($isAdmin); | ||
} | ||
|
||
/** | ||
* This is used to execute the same test twice: first for normal users | ||
* (isAdmin = false) and then for admin users (isAdmin = true). | ||
*/ | ||
public function isAdminDataProvider() | ||
{ | ||
yield [false]; | ||
yield [true]; | ||
} | ||
|
||
/** | ||
* This helper method checks that the user was correctly created and saved | ||
* in the database. | ||
*/ | ||
private function assertUserCreated($isAdmin) | ||
{ | ||
$container = self::$kernel->getContainer(); | ||
|
||
/** @var User $user */ | ||
$user = $container->get('doctrine')->getRepository(User::class)->findOneByEmail($this->userData['email']); | ||
$this->assertNotNull($user); | ||
|
||
$this->assertSame($this->userData['full-name'], $user->getFullName()); | ||
$this->assertSame($this->userData['username'], $user->getUsername()); | ||
$this->assertTrue($container->get('security.password_encoder')->isPasswordValid($user, $this->userData['password'])); | ||
$this->assertSame($isAdmin ? ['ROLE_ADMIN'] : ['ROLE_USER'], $user->getRoles()); | ||
} | ||
|
||
/** | ||
* This helper method abstracts the boilerplate code needed to test the | ||
* execution of a command. | ||
* | ||
* @param array $arguments All the arguments passed when executing the command | ||
* @param array $inputs The (optional) answers given to the command when it asks for the value of the missing arguments | ||
*/ | ||
private function executeCommand(array $arguments, array $inputs = []) | ||
{ | ||
self::bootKernel(); | ||
|
||
$command = new AddUserCommand(); | ||
$command->setApplication(new Application(self::$kernel)); | ||
|
||
$commandTester = new CommandTester($command); | ||
$commandTester->setInputs($inputs); | ||
$commandTester->execute($arguments); | ||
} | ||
} |