예제 #1
0
    def test_user_login(self):
        user = User(username='******',
                    email='*****@*****.**',
                    password='******',
                    first_name='charlie',
                    last_name='fei',
                    role='volunteer',
                    location='nashville')
        schema = UserSchema()

        register_response = self.client.post('/users/',
                                             data=schema.dumps(user).data,
                                             content_type='application/json')

        registration_data = json.loads(register_response.data.decode())
        self.assertTrue(registration_data['status'] == 'success')
        self.assertTrue(
            registration_data['message'] == 'Successfully registered.')

        self.assertTrue(registration_data['auth_token'])
        self.assertTrue(register_response.content_type == 'application/json')
        self.assertEqual(register_response.status_code, 201)

        login_response = self.client.post('/users/login',
                                          data=schema.dumps(user).data,
                                          content_type='application/json')

        login_data = json.loads(login_response.data.decode())
        self.assertTrue(login_data['status'] == 'success')
        self.assertTrue(login_data['message'] == 'Successfully logged in.')
        self.assertTrue(login_data['auth_token'])
        self.assertTrue(login_response.content_type == 'application/json')
        self.assertEqual(login_response.status_code, 200)
    def test_fdc_can_be_edited(self):
        """Test API can edit an existing DC. (PUT request)"""
        user = User(username='******',
                    email='*****@*****.**',
                    password='******',
                    first_name='charlie',
                    last_name='fei',
                    role='fdcAdmin',
                    location='nashville')
        schema = UserSchema()

        #Register a new FDC Admin
        register_response = self.client.post('/users/',
                                             data=schema.dumps(user).data,
                                             content_type='application/json')
        registration_data = json.loads(register_response.data.decode())
        self.assertTrue(registration_data['status'] == 'success')
        self.assertTrue(
            registration_data['message'] == 'Successfully registered.')

        self.assertTrue(registration_data['auth_token'])
        self.assertTrue(register_response.content_type == 'application/json')
        self.assertEqual(register_response.status_code, 201)

        #Login as FDC Admin
        login_response = self.client.post('/users/login',
                                          data=schema.dumps(user).data,
                                          content_type='application/json')

        login_data = json.loads(login_response.data.decode())
        self.assertTrue(login_data['status'] == 'success')
        self.assertTrue(login_data['message'] == 'Successfully logged in.')
        self.assertTrue(login_data['auth_token'])
        self.assertTrue(login_response.content_type == 'application/json')
        self.assertEqual(login_response.status_code, 200)

        fdc_schema = FDCSchema()
        creation_response = self.client.post(
            '/fdcs/',
            data=fdc_schema.dumps(self.fdc).data,
            headers=dict(Authorization='Bearer ' + login_data['auth_token']),
            content_type='application/json')

        creation_data = json.loads(creation_response.data.decode())
        self.assertTrue(creation_data['status'] == 'success')
        self.assertTrue(
            creation_data['message'] == 'Successfully created FDC.')
        self.assertTrue(creation_response.content_type == 'application/json')
        self.assertEqual(creation_response.status_code, 201)

        put_response = self.client.put('/fdcs/1',
                                       headers=dict(Authorization='Bearer ' +
                                                    login_data['auth_token']),
                                       data={'name': 'Wendys'},
                                       content_type='application/json')

        print(put_response.data)
        self.assertEqual(put_response.status_code, 200)
        results = self.client().get('/fdcs/1')
        self.assertIn('Wendys', str(results.data))
    def test_dc_deletion(self):
        """Test API can delete an existing fdc. (DELETE request)."""
        user = User(username='******',
                    email='*****@*****.**',
                    password='******',
                    first_name='charlie',
                    last_name='fei',
                    role='fdcAdmin',
                    location='nashville')
        schema = UserSchema()

        #Register a new FDC Admin
        register_response = self.client.post('/users/',
                                             data=schema.dumps(user).data,
                                             content_type='application/json')
        registration_data = json.loads(register_response.data.decode())
        self.assertTrue(registration_data['status'] == 'success')
        self.assertTrue(
            registration_data['message'] == 'Successfully registered.')

        self.assertTrue(registration_data['auth_token'])
        self.assertTrue(register_response.content_type == 'application/json')
        self.assertEqual(register_response.status_code, 201)

        #Login as FDC Admin
        login_response = self.client.post('/users/login',
                                          data=schema.dumps(user).data,
                                          content_type='application/json')

        login_data = json.loads(login_response.data.decode())
        self.assertTrue(login_data['status'] == 'success')
        self.assertTrue(login_data['message'] == 'Successfully logged in.')
        self.assertTrue(login_data['auth_token'])
        self.assertTrue(login_response.content_type == 'application/json')
        self.assertEqual(login_response.status_code, 200)

        fdc_schema = FDCSchema()
        creation_response = self.client.post(
            '/fdcs/',
            data=fdc_schema.dumps(self.fdc).data,
            headers=dict(Authorization='Bearer ' + login_data['auth_token']),
            content_type='application/json')

        creation_data = json.loads(creation_response.data.decode())
        self.assertTrue(creation_data['status'] == 'success')
        self.assertTrue(
            creation_data['message'] == 'Successfully created FDC.')
        self.assertTrue(creation_response.content_type == 'application/json')
        self.assertEqual(creation_response.status_code, 201)

        res = self.client.delete('/fdcs/1',
                                 headers=dict(Authorization='Bearer ' +
                                              login_data['auth_token']))
        self.assertEqual(res.status_code, 200)
        # Test to see if it exists, should return a 404
        result = self.client().get('/fdcs/1')
        self.assertEqual(result.status_code, 404)
    def test_api_can_get_all_fdc(self):
        """Test API can get a FDC (GET request)."""
        user = User(username='******',
                    email='*****@*****.**',
                    password='******',
                    first_name='charlie',
                    last_name='fei',
                    role='fdcAdmin',
                    location='nashville')
        schema = UserSchema()

        #Register a new FDC Admin
        register_response = self.client.post('/users/',
                                             data=schema.dumps(user).data,
                                             content_type='application/json')
        registration_data = json.loads(register_response.data.decode())
        self.assertTrue(registration_data['status'] == 'success')
        self.assertTrue(
            registration_data['message'] == 'Successfully registered.')

        self.assertTrue(registration_data['auth_token'])
        self.assertTrue(register_response.content_type == 'application/json')
        self.assertEqual(register_response.status_code, 201)

        #Login as FDC Admin
        login_response = self.client.post('/users/login',
                                          data=schema.dumps(user).data,
                                          content_type='application/json')

        login_data = json.loads(login_response.data.decode())
        self.assertTrue(login_data['status'] == 'success')
        self.assertTrue(login_data['message'] == 'Successfully logged in.')
        self.assertTrue(login_data['auth_token'])
        self.assertTrue(login_response.content_type == 'application/json')
        self.assertEqual(login_response.status_code, 200)

        fdc_schema = FDCSchema()
        creation_response = self.client.post(
            '/fdcs/',
            data=fdc_schema.dumps(self.fdc).data,
            headers=dict(Authorization='Bearer ' + login_data['auth_token']),
            content_type='application/json')

        creation_data = json.loads(creation_response.data.decode())
        self.assertTrue(creation_data['status'] == 'success')
        self.assertTrue(
            creation_data['message'] == 'Successfully created FDC.')
        self.assertTrue(creation_response.content_type == 'application/json')
        self.assertEqual(creation_response.status_code, 201)

        get_response = self.client.get('/fdcs/')
        data = json.loads(get_response.data.decode())
        self.assertTrue(data['status'] == 'success')
        self.assertIn('Nashville Food Project', str(data['fdcs']))
        self.assertEqual(get_response.status_code, 200)
예제 #5
0
    def test_pickup_accept:
        #User we're using
        user = User(username='******', email='*****@*****.**', password='******', first_name='charlie', last_name='fei', role='donor', location='nashville')
        volunteer = User(username='******', email='*****@*****.**', password='******', first_name='vol', last_name='fei', role='volunteer', location='nashville')
        schema = UserSchema()

        #Register User
        register_response = self.client.post('/users/',
            data = schema.dumps(user).data,
            content_type = 'application/json'
        )

        registration_data = json.loads(register_response.data.decode())
        self.assertTrue(registration_data['status'] == 'success')
        self.assertTrue(
            registration_data['message'] == 'Successfully registered.'
        )

        self.assertTrue(registration_data['auth_token'])
        self.assertTrue(register_response.content_type == 'application/json')
        self.assertEqual(register_response.status_code, 201)

        #Login User
        login_response = self.client.post('/users/login',
            data = schema.dumps(user).data,
            content_type = 'application/json'
        )

        login_data = json.loads(login_response.data.decode())
        self.assertTrue(login_data['status'] == 'success')
        self.assertTrue(login_data['message'] == 'Successfully logged in.')
        self.assertTrue(login_data['auth_token'])
        self.assertTrue(login_response.content_type == 'application/json')
        self.assertEqual(login_response.status_code, 200)

        pickup_schema = PickupSchema()
        pickup = Pickup(description="My Pickup", donor=user)

        creation_response = self.client.post('/users/charlie/pickups/',
            data = pickup_schema.dumps(pickup).data,
            headers=dict(
                Authorization='Bearer ' + login_data['auth_token']
            ),
            content_type = 'application/json'
        )

        creation_data = json.loads(creation_response.data.decode())
        self.assertTrue(creation_data['status'] == 'success')
        self.assertTrue(creation_data['message'] == 'Successfully created pickup.')
        self.assertTrue(creation_response.content_type == 'application/json')
        self.assertEqual(creation_response.status_code, 201)
예제 #6
0
    def post(self):
        """
        Create New User
        """

        user_schema = UserSchema()

        user_data = request.get_json()
        
        # Validate user data
        validated_user_data, errors = user_schema.load(user_data)

        if errors:
            return dict(status="fail", message=errors), 400

        email = validated_user_data.get('email', None)

        # Check if user email exists
        user_existant = User.query.filter_by(email=email).first()

        if user_existant:
            return dict(status="fail", message=f"Email {validated_user_data['email']} already in use."), 400

        # add validated data to user object
        user = User(**validated_user_data)

        saved_user = user.save()

        if not saved_user:
            return dict(status='fail', message=f'Internal Server Error'), 500

        # for returning to user
        new_user_data, errors = user_schema.dumps(user)

        return dict(status='success', data=dict(user=json.loads(new_user_data))), 201
예제 #7
0
    def test_user_get_info(self):
        user = User(username='******',
                    email='*****@*****.**',
                    password='******',
                    first_name='charlie',
                    last_name='fei',
                    role='volunteer',
                    location='nashville')
        schema = UserSchema()

        register_response = self.client.post('/users/',
                                             data=schema.dumps(user).data,
                                             content_type='application/json')

        register_data = json.loads(register_response.data.decode())

        get_response = self.client.get(
            '/users/' + user.username,
            headers=dict(Authorization='Bearer ' +
                         register_data['auth_token']))

        data = json.loads(get_response.data.decode())
        self.assertTrue(data['status'] == 'success')
        self.assertTrue(data['data'] is not None)
        self.assertTrue(data['data']['username'] == 'charlie')
        self.assertTrue(data['data']['email'] == '*****@*****.**')
        self.assertTrue(data['data']['first_name'] == 'charlie')
        self.assertTrue(data['data']['last_name'] == 'fei')
        self.assertTrue(data['data']['role'] == 'volunteer')
예제 #8
0
    def post(self):
        """
        """

        user_schema = UserSchema()

        user_data = request.get_json()

        validated_user_data, errors = user_schema.load(user_data)

        email = validated_user_data.get('email', None)
        client_base_url = os.getenv('CLIENT_BASE_URL',
                                    f'https://{request.host}/users')

        # To do change to a frontend url
        verification_url = f"{client_base_url}/verify/"
        secret_key = current_app.config["SECRET_KEY"]
        password_salt = current_app.config["VERIFICATION_SALT"]
        sender = current_app.config["MAIL_DEFAULT_SENDER"]
        template = "user/verify.html"
        subject = "Please confirm your email"

        if errors:
            return dict(status="fail", message=errors), 400

        # get the customer role
        user_role = Role.find_first(name='customer')

        user_existant = User.query.filter_by(email=email).first()

        if user_existant:
            return dict(
                status="fail",
                message=f"Email {validated_user_data['email']} already in use."
            ), 400

        user = User(**validated_user_data)

        if user_role:
            user.roles.append(user_role)

        saved_user = user.save()

        if not saved_user:
            return dict(status='fail', message=f'Internal Server Error'), 500

        # send verification
        send_verification(email, user.name, verification_url, secret_key,
                          password_salt, sender,
                          current_app._get_current_object(), template, subject)

        new_user_data, errors = user_schema.dumps(user)

        return dict(status='success',
                    data=dict(user=json.loads(new_user_data))), 201
예제 #9
0
def get_user_by_firebase_id():
    user_schema = UserSchema()

    fb_id = request.args['firebase_id']
    user = db.session.query(User).filter(User.firebase_id == fb_id).first()

    if user:
        return user_schema.dumps(user)
    else:
        raise NotFound(
            "Could not find user with firebase_id of '{}'".format(fb_id))
예제 #10
0
    def test_registered_with_already_registered_user(self):
        user = User(username='******',
                    email='*****@*****.**',
                    password='******',
                    first_name='charlie',
                    last_name='fei',
                    role='volunteer',
                    location='nashville')
        schema = UserSchema()
        self.client.post('/users/',
                         data=schema.dumps(user).data,
                         content_type='application/json')

        response = self.client.post('/users/',
                                    data=schema.dumps(user).data,
                                    content_type='application/json')

        data = json.loads(response.data.decode())
        self.assertTrue(data['status'] == 'fail')
        self.assertTrue(data['message'] == 'User already exists')
        self.assertTrue(response.content_type == 'application/json')
        self.assertEqual(response.status_code, 202)
예제 #11
0
    def get(self):
        """
        """

        user_schema = UserSchema(many=True)

        users = User.find_all()

        users_data, errors = user_schema.dumps(users)

        if errors:
            return dict(status='fail', message=errors), 400

        return dict(status='success',
                    data=dict(users=json.loads(users_data))), 200
예제 #12
0
    def get(self):
        """
        Getting All users
        """

        user_schema = UserSchema(many=True)

        users = User.find_all()

        users_data, errors = user_schema.dumps(users)

        if errors:
            return dict(status="fail", message="Internal Server Error"), 500

        return dict(status="success",
                    data=dict(users=json.loads(users_data))), 200
예제 #13
0
    def get(self, user_id):
        """
        Get specific user
        """
        user_schema = UserSchema()

        user = User.get_by_id(user_id)

        if not user:
            return dict(status='fail', message=f'User with id {user_id} does not exist'), 404

        user_data, errors = user_schema.dumps(user)

        if errors:
            return dict(status='fail', message=errors), 400
        
        return dict(status='success', data=dict(users=json.loads(user_data))), 200
예제 #14
0
    def post(self, user_id):
        """
        """

        user_role_schema = UserRoleSchema()

        user_role_data = request.get_json()

        validated_user_role_data, errors = user_role_schema.load(
            user_role_data)

        if errors:
            return dict(status='fail', message=errors), 400

        # Get User
        user = User.get_by_id(user_id)

        if not user:
            return dict(status='fail', message='User not found'), 404

        # Get role
        role = Role.get_by_id(validated_user_role_data.get('role_id', None))

        if not role:
            return dict(status='fail', message='Role not found'), 404

        if role in user.roles:
            return dict(status='fail', message='User already has role'), 409

        # adding role to user roles
        if role in user.roles:
            return dict(status='fail', message='Role already Exists'), 404

        user.roles.append(role)

        saved_user_role = user.save()

        user_schema = UserSchema()

        if not saved_user_role:
            return dict(status='fail', message='Internal Server Error'), 500

        new_user_role_data, errors = user_schema.dumps(user)

        return dict(status='success',
                    data=dict(user_role=json.loads(new_user_role_data))), 201
예제 #15
0
    def post(self, organisation_id):
        """
        """

        org_member_schema = OrgMemberSchema()

        org_member_data = request.get_json()

        validated_org_member_data, errors = org_member_schema.load(
            org_member_data)

        if errors:
            return dict(status='fail', message=errors), 400

        # Get User
        user = User.get_by_id(validated_org_member_data.get('user_id', None))

        if not user:
            return dict(status='fail', message='User not found'), 404

        # Get organisation
        organisation = Organisation.get_by_id(organisation_id)

        if not organisation:
            return dict(status='fail', message='Organisation not found'), 404

        if user in organisation.members:
            return dict(status='fail', message='Member already exist'), 409

        # adding user to organisation members
        organisation.members.append(user)

        saved_org_member = organisation.save()

        user_schema = UserSchema()

        if not saved_org_member:
            return dict(status='fail', message='Internal Server Error'), 500

        new_org_member_data, errors = user_schema.dumps(user)

        return dict(
            status='success',
            data=dict(
                organisation_member=json.loads(new_org_member_data))), 201
예제 #16
0
    def test_user_login_fail(self):
        user = User(username='******',
                    email='*****@*****.**',
                    password='******',
                    first_name='charlie',
                    last_name='fei',
                    role='volunteer',
                    location='nashville')
        schema = UserSchema()

        login_response = self.client.post('/users/login',
                                          data=schema.dumps(user).data,
                                          content_type='application/json')
        login_data = json.loads(login_response.data.decode())
        self.assertTrue(login_data['status'] == 'fail')
        self.assertTrue(login_data['message'] == 'User does not exist.')
        self.assertTrue(login_response.content_type == 'application/json')
        self.assertEqual(login_response.status_code, 404)
예제 #17
0
    def get(self, user_id):
        """
        """
        user_schema = UserSchema()

        user = User.get_by_id(user_id)

        if not user:
            return dict(status='fail',
                        message=f'user {user_id} not found'), 404

        user_data, errors = user_schema.dumps(user)

        if errors:
            return dict(status='fail', message=errors), 500

        return dict(status='success',
                    data=dict(user=json.loads(user_data))), 200
예제 #18
0
    def get(self, user_id):
        """
        Getting individual user
        """
        schema = UserSchema()

        user = User.get_by_id(user_id)

        if not user:
            return dict(status="fail",
                        message=f"User with id {user_id} not found"), 404

        user_data, errors = schema.dumps(user)

        if errors:
            return dict(status="fail", message=errors), 500

        return dict(status='success',
                    data=dict(user=json.loads(user_data))), 200
예제 #19
0
    def delete(self, user_id):
        """
        """
        user_role_schema = UserRoleSchema()

        user_role_data = request.get_json()

        validated_user_role_data, errors = user_role_schema.load(
            user_role_data)

        if errors:
            return dict(status='fail', message=errors), 400

        # Get User
        user = User.get_by_id(user_id)

        if not user:
            return dict(status='fail', message='User not found'), 404

        # Get role
        role = Role.get_by_id(validated_user_role_data.get('role_id', None))

        if not role:
            return dict(status='fail', message='Role not found'), 404

        # removing user from role
        try:
            user.roles.remove(role)
        except Exception:
            return dict(status='fail', message='User role not found'), 404

        saved_user_role = user.save()

        user_schema = UserSchema()

        if not saved_user_role:
            return dict(status='fail', message='Internal Server Error'), 500

        new_user_role_data, errors = user_schema.dumps(user)

        return dict(status='success',
                    data=dict(user_role=json.loads(new_user_role_data))), 201
예제 #20
0
    def post(self):
        """
        Creating an User ad
        """
        user_schema = UserSchema()

        user_data = request.get_json()

        validated_user_data, errors = user_schema.load(user_data)

        if errors:
            return dict(status='fail', message=errors), 400

        user = User(**validated_user_data)

        saved_user = user.save()

        if not saved_user:
            return dict(status='fail', message='Internal Server Error'), 500

        new_user_data, errors = user_schema.dumps(user)

        return dict(status='success',
                    data=dict(user=json.loads(new_user_data))), 201
예제 #21
0
    def post(self):
        user_schema = UserSchema(only=("email", "password"))

        login_data = request.get_json()

        validated_user_data, errors = user_schema.load(login_data)

        if errors:
            return dict(status='fail', message=errors), 400
        
        email = validated_user_data.get('email', None)
        password = validated_user_data.get('password', None)

        user = User.find_first(email=email)

        if not user:
            return dict(status='fail', message="login failed"), 401
        
        user_data, errors = user_schema.dumps(user)

        if errors:
            return dict(status='fail', message=errors), 400

        return dict(status='Success', message=f"User { user.username } logged in Successfully. "), 200