public function testEmailIsUniqueSpecification() { $user = $this->prepareUser(); $this->specify("Set email for new user with existing email", function () use($user) { $userRepository = Stub::makeEmpty('Inoplate\\Account\\Domain\\Repositories\\User', ['findByEmail' => Stub::atLeastOnce(function () use($user) { return $user; })], $this); $specification = new AccountDomainSpecifications\EmailIsUnique($userRepository); expect("Specification is not satisfied", $specification->isSatisfiedBy($user->email()))->false(); }); $this->specify("Set email for existing user with another existing user's email", function () use($user) { $userRepository = Stub::makeEmpty('Inoplate\\Account\\Domain\\Repositories\\User', ['findByEmail' => Stub::atLeastOnce(function () use($user) { return $user; })], $this); $specification = new AccountDomainSpecifications\EmailIsUnique($userRepository, new AccountDomainModels\UserId('56678')); expect("Specification is not satisfied", $specification->isSatisfiedBy($user->email()))->false(); }); $this->specify("Set email for existing user with same email", function () use($user) { $userRepository = Stub::makeEmpty('Inoplate\\Account\\Domain\\Repositories\\User', ['findByEmail' => Stub::atLeastOnce(function () use($user) { return $user; })], $this); $specification = new AccountDomainSpecifications\EmailIsUnique($userRepository, new AccountDomainModels\UserId('123456')); expect("Specification is satisfied", $specification->isSatisfiedBy($user->email()))->true(); }); $this->specify("Set email for new user with new email", function () use($user) { $userRepository = Stub::makeEmpty('Inoplate\\Account\\Domain\\Repositories\\User', ['findByEmail' => Stub::atLeastOnce(function () use($user) { return null; })], $this); $specification = new AccountDomainSpecifications\EmailIsUnique($userRepository); expect("Specification is satisfied", $specification->isSatisfiedBy($user->email()))->true(); }); }
/** * Ensure email is unique * * @param FoundationModels\Email $email * @return void */ protected function ensureEmailIsUnique(FoundationDomainModels\Email $email) { $specification = new AccountDomainSpecifications\EmailIsUnique($this->userRepository); if (!$specification->isSatisfiedBy($email)) { throw new ValueIsNotUniqueException("Email [{$email->value}()] was already taken"); } }