diff --git a/features/installer/install_command.feature b/features/installer/install_command.feature index d84257235f2..0c2f55a6479 100644 --- a/features/installer/install_command.feature +++ b/features/installer/install_command.feature @@ -12,9 +12,9 @@ Feature: Sylius Install Feature Scenario: Trying to register administrator account without email Given I do not provide an email When I run Sylius CLI installer - Then I should see output "E-mail: This value should not be blank" + Then I should see output "This value should not be blank" Scenario: Trying to register administrator account with an incorrect email Given I do not provide a correct email When I run Sylius CLI installer - Then I should see output "E-mail: This value is not a valid email address." + Then I should see output "This value is not a valid email address." diff --git a/features/installer/load_sample_data_command.feature b/features/installer/load_sample_data_command.feature index 03b5857ecf4..8c37488846b 100644 --- a/features/installer/load_sample_data_command.feature +++ b/features/installer/load_sample_data_command.feature @@ -5,6 +5,6 @@ Feature: Load sample data feature I want to run a command that loads sample data Scenario: Running install sample data command - Given I run Sylius Install Load Sample Data command + When I run Sylius Install Load Sample Data command And I confirm loading sample data Then the command should finish successfully diff --git a/src/Sylius/Behat/Context/Cli/InstallerContext.php b/src/Sylius/Behat/Context/Cli/InstallerContext.php index ce37339ac9b..3cda26aef9e 100644 --- a/src/Sylius/Behat/Context/Cli/InstallerContext.php +++ b/src/Sylius/Behat/Context/Cli/InstallerContext.php @@ -58,6 +58,7 @@ final class InstallerContext implements Context private $inputChoices = [ 'currency' => 'USD', 'e-mail' => 'test@email.com', + 'username' => 'test', 'password' => 'pswd', 'confirmation' => 'pswd', ]; @@ -141,6 +142,7 @@ public function iDoNotProvideCorrectEmail() public function iProvideFullAdministratorData() { $this->inputChoices['e-mail'] = 'test@admin.com'; + $this->inputChoices['username'] = 'test'; $this->inputChoices['password'] = 'pswd1$'; $this->inputChoices['confirmation'] = $this->inputChoices['password']; } diff --git a/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php b/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php index 41424bf6393..210db62aca0 100644 --- a/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php +++ b/src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php @@ -14,6 +14,7 @@ namespace Sylius\Bundle\CoreBundle\Command; use Sylius\Component\Core\Model\AdminUserInterface; +use Sylius\Component\User\Repository\UserRepositoryInterface; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -91,32 +92,27 @@ protected function setupAdministratorUser(InputInterface $input, OutputInterface * * @return AdminUserInterface */ - private function configureNewUser(AdminUserInterface $user, InputInterface $input, OutputInterface $output): AdminUserInterface - { - $userRepository = $this->get('sylius.repository.admin_user'); + private function configureNewUser( + AdminUserInterface $user, + InputInterface $input, + OutputInterface $output + ): AdminUserInterface { + /** @var UserRepositoryInterface $userRepository */ + $userRepository = $this->getAdminUserRepository(); if ($input->getOption('no-interaction')) { Assert::null($userRepository->findOneByEmail('sylius@example.com')); $user->setEmail('sylius@example.com'); + $user->setUsername('sylius'); $user->setPlainPassword('sylius'); return $user; } - $questionHelper = $this->getHelper('question'); - - do { - $question = $this->createEmailQuestion($output); - $email = $questionHelper->ask($input, $output, $question); - $exists = null !== $userRepository->findOneByEmail($email); - - if ($exists) { - $output->writeln('E-Mail is already in use!'); - } - } while ($exists); - + $email = $this->getAdministratorEmail($input, $output); $user->setEmail($email); + $user->setUsername($this->getAdministratorUsername($input, $output, $email)); $user->setPlainPassword($this->getAdministratorPassword($input, $output)); return $user; @@ -129,7 +125,7 @@ private function configureNewUser(AdminUserInterface $user, InputInterface $inpu */ private function createEmailQuestion(OutputInterface $output): Question { - return (new Question('E-mail:')) + return (new Question('E-mail: ')) ->setValidator(function ($value) use ($output) { /** @var ConstraintViolationListInterface $errors */ $errors = $this->get('validator')->validate((string) $value, [new Email(), new NotBlank()]); @@ -143,6 +139,59 @@ private function createEmailQuestion(OutputInterface $output): Question ; } + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return string + */ + private function getAdministratorEmail(InputInterface $input, OutputInterface $output): string + { + /** @var QuestionHelper $questionHelper */ + $questionHelper = $this->getHelper('question'); + /** @var UserRepositoryInterface $userRepository */ + $userRepository = $this->getAdminUserRepository(); + + do { + $question = $this->createEmailQuestion($output); + $email = $questionHelper->ask($input, $output, $question); + $exists = null !== $userRepository->findOneByEmail($email); + + if ($exists) { + $output->writeln('E-Mail is already in use!'); + } + } while ($exists); + + return $email; + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @param string $email + * + * @return string + */ + private function getAdministratorUsername(InputInterface $input, OutputInterface $output, string $email): string + { + /** @var QuestionHelper $questionHelper */ + $questionHelper = $this->getHelper('question'); + /** @var UserRepositoryInterface $userRepository */ + $userRepository = $this->getAdminUserRepository(); + + do { + $question = new Question('Username (press enter to use email): ', $email); + $username = $questionHelper->ask($input, $output, $question); + $exists = null !== $userRepository->findOneBy(['username' => $username]); + + if ($exists) { + $output->writeln('Username is already in use!'); + } + } while ($exists); + + return $username; + } + /** * @param InputInterface $input * @param OutputInterface $output @@ -205,4 +254,12 @@ private function createPasswordQuestion(string $message, \Closure $validator): Q ->setHiddenFallback(false) ; } + + /** + * @return UserRepositoryInterface + */ + private function getAdminUserRepository(): UserRepositoryInterface + { + return $this->get('sylius.repository.admin_user'); + } }