async def register(repo: UserRepo, credentials: Credentials) -> UserRegistry: email = credentials.email.lower() user = await repo.fetch_by_email(email) if user: raise EmailNotUniqueError(email) password_hash = hash_service.hash_(credentials.password) user = await repo.persist(email, password_hash) return UserRegistry(**user.dict())
async def get_by_credentials( repo: UserRepo, credentials: Credentials) -> Optional[UserRegistry]: user = await repo.fetch_by_email(credentials.email.lower()) if not user: hash_service.dummy_verify() return None password, hash_ = credentials.password, user.password_hash if not hash_service.verify(password, hash_): return None return UserRegistry(**user.dict())
def test_is_required(self, registry_valid_data): registry_valid_data.pop("email") with pytest.raises(ValidationError) as excinfo: UserRegistry(**registry_valid_data) self.assert_validation_error("value_error.missing", excinfo)
def test_must_be_email(self, registry_valid_data): registry_valid_data.update({"email": ["some string"]}) with pytest.raises(ValidationError) as excinfo: UserRegistry(**registry_valid_data) self.assert_validation_error("type_error.str", excinfo)
def test_must_be_int(self, registry_valid_data): registry_valid_data.update({"id": "some_id"}) with pytest.raises(ValidationError) as excinfo: UserRegistry(**registry_valid_data) self.assert_validation_error("type_error.integer", excinfo)
def test_immutability(self, registry_valid_data): entity = UserRegistry(**registry_valid_data) for key in entity.dict().keys(): with pytest.raises(TypeError): setattr(entity, key, "some value")
def test_invalidation(self, registry_invalid_data): with pytest.raises(ValidationError): assert UserRegistry(**registry_invalid_data)
def test_validation(self, registry_valid_data): assert UserRegistry(**registry_valid_data)
async def get_by_id(repo: UserRepo, id_: int) -> Optional[UserRegistry]: user = await repo.fetch(id_) return UserRegistry(**user.dict()) if user else None