Ejemplo n.º 1
0
    def save_user(self, *, user: UserEntity) -> Union[Error, Success]:
        if self.__does_exist_before(user=user):
            return Error(
                reason=
                f'This username {user.name} does exist before, use different username please.'
            )

        database_user = self.__models.User(name=user.name,
                                           password=bcrypt.hashpw(
                                               user.password.encode(),
                                               bcrypt.gensalt()),
                                           age=user.age,
                                           email=user.email)
        try:
            database_user.commit()
            dumped_database_user = database_user.dump()
            return Success(
                data=UserEntity(id=dumped_database_user['id'],
                                name=dumped_database_user['name'],
                                password=dumped_database_user['password'],
                                age=dumped_database_user['age'],
                                email=dumped_database_user['email']))
        except:
            return Error(
                reason=f'Error saving user {user.name} into database.')
Ejemplo n.º 2
0
 def __validate_data(self, *, url: str, username: str, password: str) -> Union[Error, Success]:
     # simple validation of data and should be enhanced later ;)
     if url == '':
         return Error(reason='Invalid url')
     if username == '':
         return Error(reason='Invalid username')
     if password == '':
         return Error(reason='Invalid password')
     return Success(data=None)
Ejemplo n.º 3
0
    def _validate_user_persistent_data(
            self, *,
            user_persistent: UserPersistence) -> Union[Error, Success]:
        # simple validation of data for now
        if user_persistent:
            if user_persistent.username == '':
                return Error(reason='Invalid username')
            if user_persistent.socket_id == '':
                return Error(reason='Invalid socket_id')

            return Success(data=None)

        return Error(reason='Invalid user persistent data')
Ejemplo n.º 4
0
    def check_user_credentials(self, *, username: str,
                               password: str) -> Union[Error, Success]:
        db_user: Optional[User] = self.__db.get(username, None)
        if db_user is not None:
            db_password = db_user.password
            if password == db_password:
                return Success(
                    data=f"This user's '{username}' credentials are valid")

            return Error(
                reason=f"This user's '{username}' credentials are not valid")

        return Error(reason=f"User with username '{username}' does not exist")
Ejemplo n.º 5
0
    def check_user_credentials(self, *, username: str,
                               password: str) -> Union[Error, Success]:
        db_user = self.__models.User.find_one({"name": username})
        if db_user is not None:
            db_password = db_user.password
            if bcrypt.checkpw(password.encode(), db_password.encode()):
                return Success(
                    data=f"This user's '{username}' credentials are valid")

            return Error(
                reason=f"This user's '{username}' credentials are not valid")
        else:
            return Error(
                reason=f"User with username '{username}' does not exist")
Ejemplo n.º 6
0
    def __validate_data(self, *, data: Dict[str,
                                            Any]) -> Union[Error, Success]:
        # simple validation, may be replaced with json validator later :)
        if data:
            if data.get('username', None) is None:
                return Error(reason="username is required")
            if data.get('username', '') == '':
                return Error(reason="Not valid username")
            if data.get('password', '') == '':
                return Error(reason="Not valid password")

            return Success(data=None)
        else:
            return Error(reason="Not valid data")
Ejemplo n.º 7
0
def test_invalid_user_credentials_check():
    url = 'fake'
    username = '******'
    password = '******'

    http_client = FakeHttpClient(
        configs={'result': Success(data={'valid': False})})
    check_creds_usecase = CheckUserCredentialsUseCase(http_client=http_client)

    assert isinstance(
        check_creds_usecase.execute(url=url,
                                    username=username,
                                    password=password), Error)

    http_client = FakeHttpClient(
        configs={'result': Error(reason='Network error? maybe? :D')})
    check_creds_usecase = CheckUserCredentialsUseCase(http_client=http_client)

    assert isinstance(
        check_creds_usecase.execute(url=url,
                                    username=username,
                                    password=password), Error)

    assert isinstance(
        check_creds_usecase.execute(url='',
                                    username=username,
                                    password=password), Error)
    assert isinstance(
        check_creds_usecase.execute(url=url, username='', password=password),
        Error)
    assert isinstance(
        check_creds_usecase.execute(url=url, username=username, password=''),
        Error)
def test_invalid_create_user_exists_before(create_user_usecase):
    data = dict(name="Abdulrahman", password='******', age=25, email="*****@*****.**")
    _created_user = create_user_usecase.execute(data=data)
    created_again_user = create_user_usecase.execute(data=data)

    assert created_again_user == Error(
        f'This username {data["name"]} does exist before, use different username please.')
Ejemplo n.º 9
0
    def save_online_user(
            self, *,
            user_persistence: UserPersistence) -> Union[Error, Success]:
        if isinstance(
                self._validate_user_persistent_data(
                    user_persistent=user_persistence), Success):
            db_user = self.__db.get(user_persistence.socket_id, None)
            if db_user is not None:
                return Error(
                    reason=
                    f'This user with socket_id "{user_persistence.socket_id}" does exist already as an online user'
                )

            self.__db[user_persistence.socket_id] = user_persistence
            return Success(data=None)

        return Error(reason='Invalid user persistent data')
Ejemplo n.º 10
0
 def post(self, *, url: str, data: Dict[str,
                                        Any]) -> Union[Error, Response]:
     try:
         response = self.__http_client.post(url=url, json=data, timeout=3)
         return Response(data=response.json() or dict(),
                         status=response.status_code)
     except:
         return Error(reason=f"Error posting request to url '{url}'")
Ejemplo n.º 11
0
    def remove_online_user(self, *, socket_id: str) -> Union[Error, Success]:
        db_user = self.__db.get(socket_id, None)
        if db_user is not None:
            del self.__db[socket_id]
            return Success(data=None)

        return Error(
            reason=
            f"This username with socket_id '{socket_id}' does not exist as an online user"
        )
Ejemplo n.º 12
0
    def save_user(self, *, user: User) -> Union[Error, Success]:
        if self.__does_exist_before(user=user):
            return Error(
                reason=
                f'This username {user.name} does exist before, use different username please.'
            )

        user = User(id=uuid4().hex,
                    name=user.name,
                    password=user.password,
                    age=user.age,
                    email=user.email)
        self.__db[user.name] = user
        return Success(data=user)
Ejemplo n.º 13
0
    def execute(self, *, url: str, username: str, password: str) -> Union[Error, Success]:
        validation_result = self.__validate_data(url=url, username=username, password=password)
        if isinstance(validation_result, Error):
            return validation_result

        check_validation_result = self.__http_client.post(
            url=url,
            data={'username': username, 'password': password}
        )
        if isinstance(check_validation_result, Error):
            return check_validation_result

        if check_validation_result.data is not None and check_validation_result.data.get('valid', False):
            return Success(data=None)

        return Error(reason=f'Invalid credentials for user "{username}"')
Ejemplo n.º 14
0
    def __validate_data(self, *, data: Dict[str,
                                            Any]) -> Union[Error, Success]:
        # simple validation, may be replaced with json validator later :)
        if data:
            if data.get('name', None) is None:
                return Error(reason="Not valid name")
            if data.get('name', '') == '':
                return Error(reason="Not valid name")
            if data.get('password', '') == '':
                return Error(reason="Not valid password")
            try:
                if int(data.get('age', -1)) == -1 or int(data.get(
                        'age', -1)) < 18:  # 18 for adult :D
                    return Error(reason="Not valid age")
            except ValueError:
                return Error(reason="Not valid age type")
            # maybe later should validate email as well properly, now we will take it as it is even none

            return Success(data=None)
        else:
            return Error(reason="Not valid data")
Ejemplo n.º 15
0
def test_invalid_create_user(create_user_usecase):
    data = dict()
    created_user = create_user_usecase.execute(data=data)
    assert created_user == Error(reason='Not valid data')

    data = dict(password='******', age=25)
    created_user = create_user_usecase.execute(data=data)
    assert created_user == Error(reason='Not valid name')

    data = dict(name="", password='******', age=25)
    created_user = create_user_usecase.execute(data=data)
    assert created_user == Error(reason='Not valid name')

    data = dict(name="Abdulrahman", password='******', age=10)
    created_user = create_user_usecase.execute(data=data)
    assert created_user == Error(reason='Not valid age')

    data = dict(name="Abdulrahman", password='******', age="s10")
    created_user = create_user_usecase.execute(data=data)
    assert created_user == Error(reason='Not valid age type')

    data = dict(name="Abdulrahman", password='', age=25)
    created_user = create_user_usecase.execute(data=data)
    assert created_user == Error(reason='Not valid password')