/**
  * @test
  */
 public function registerSuccess()
 {
     $email = "*****@*****.**";
     $username = "******";
     $password = "******";
     $encodedPassword = "******";
     $user = new User();
     $user->setEmail($email)->setUsername($username)->setPassword($password);
     $repoMock = $this->getMock("RepositoryMock", array("add"));
     $repoMock->expects($this->once())->method("add")->with($this->equalTo($user));
     $emMock = $this->getEntityManagerMock(array("getRepository", "flush"));
     $emMock->expects($this->once())->method("getRepository")->with($this->equalTo(EntityConstant::USER))->will($this->returnValue($repoMock));
     $emMock->expects($this->once())->method("flush");
     $passwordEncoderMock = $this->getPasswordEncoderMock(array("encode"));
     $passwordEncoderMock->expects($this->once())->method("encode")->with($this->equalTo($password))->will($this->returnValue($encodedPassword));
     /** @var \Doctrine\ORM\EntityManager $emMock */
     /** @var \Kumatch\BBSAPI\Utility\PasswordEncoder $passwordEncoderMock */
     $useCase = new UserRegistration($emMock, $passwordEncoderMock);
     $user = $useCase->invoke($user);
     $this->assertInstanceOf('Kumatch\\BBSAPI\\Entity\\User', $user);
     $this->assertEquals($email, $user->getEmail());
     $this->assertEquals($username, $user->getUsername());
     $this->assertEquals($encodedPassword, $user->getEncodedPassword());
     $this->assertNull($user->getPassword());
 }
 public function register(Application $app)
 {
     $app["bbsapi.user.registration"] = function (Application $app) {
         return new UserRegistration($app["entity_manager"], $app["bbsapi.utility.password_encoder"]);
     };
     $app["bbsapi.user.authentication"] = function (Application $app) {
         return new UserAuthentication($app["entity_manager"], $app["bbsapi.utility.password_encoder"], $app["bbsapi.utility.token_generator"]);
     };
     $app["bbsapi.user.token_authorization"] = function (Application $app) {
         return new UserTokenAuthorization($app["entity_manager"]);
     };
     $app["bbsapi.spec.user_spec"] = function () {
         return new UserSpec();
     };
     $app->before(function (Request $req) use($app) {
         $userId = $req->headers->get(self::HEADER_AUTHORIZATION_USER_ID);
         $tokenString = $req->headers->get(self::HEADER_AUTHORIZATION_TOKEN);
         if (!$userId || !$tokenString) {
             return;
         }
         /** @var UserTokenAuthorization $service */
         $service = $app["bbsapi.user.token_authorization"];
         $user = $service->invoke($userId, $tokenString);
         if (!$user) {
             return;
         }
         $req->setUser($user);
     });
     $app->post("/user/register", function (Application $app, Request $req) {
         /** @var UserSpec $spec */
         $spec = $app["bbsapi.spec.user_spec"];
         /** @var UserRegistration $service */
         $service = $app["bbsapi.user.registration"];
         $email = $req->request->get("email");
         $username = $req->request->get("username");
         $password = $req->request->get("password");
         $user = new User();
         $user->setEmail($email)->setUsername($username)->setPassword($password);
         $result = $spec->validate($user);
         if (!$result->isValid()) {
             return $app->json(["errors" => $result->getErrors()], 400);
         }
         $alreadyExistsErrors = ["user" => [sprintf("A username [%s] is already exists.", $user->getUsername())]];
         if ($service->findByUsername($user->getUsername())) {
             return $app->json(["errors" => $alreadyExistsErrors], 400);
         }
         try {
             $user = $service->invoke($user);
         } catch (UniqueConstraintViolationException $e) {
             return $app->json(["errors" => $alreadyExistsErrors], 400);
         }
         return $app->json($spec->format($user), 201);
     });
     $app->post("/user/authorize", function (Application $app, Request $req) {
         /** @var UserAuthentication $service */
         $service = $app["bbsapi.user.authentication"];
         $username = $req->request->get("username");
         $password = $req->request->get("password");
         $accessToken = $service->invoke($username, $password);
         if (!$accessToken) {
             return $app->json(null, 401);
         }
         return $app->json(["id" => $accessToken->getUser()->getId(), "token" => $accessToken->getToken(), "period" => $accessToken->getPeriod()]);
     });
     $app->get("/users/{username}", function (Application $app, $username) {
         /** @var UserSpec $spec */
         $spec = $app["bbsapi.spec.user_spec"];
         /** @var UserRegistration $service */
         $service = $app["bbsapi.user.registration"];
         $user = $service->findByUsername($username);
         if (!$user) {
             return $app->json(null, 404);
         }
         return $app->json($spec->format($user));
     })->assert('username', '^\\w+$');
 }
 /**
  * @test
  * @dataProvider provideInvalidPassword
  * @param string $password
  * @param int $errorSize
  */
 public function invalidPassword($password, $errorSize = 1)
 {
     $user = new User();
     $user->setEmail("*****@*****.**")->setUsername("foo_user")->setPassword($password);
     $result = $this->spec->validate($user);
     $errors = $result->getErrors();
     $this->assertFalse($result->isValid());
     $this->assertCount(1, $errors);
     $this->assertCount($errorSize, $errors["password"]);
 }