예제 #1
0
    def test_not_json_location_and_content_type_json(self):
        parser = RequestParser()
        parser.add_argument('foo', location='args')

        with self.app.test_request_context('/bubble', method='get',
                                      content_type='application/json'):
            parser.parse_args()  # Should not raise a 400: BadRequest
예제 #2
0
    def test_parse_required(self):
        with self.app.app_context():
            req = Request.from_values('/bubble')

            parser = RequestParser()
            parser.add_argument('foo', required=True, location='values')

            expected = {
                'foo': 'Missing required parameter in the post body or the query string'
            }
            try:
                parser.parse_args(req)
            except BadRequest as e:
                self.assertEqual(e.data['message'], 'Input payload validation failed')
                self.assertEqual(e.data['errors'], expected)

            parser = RequestParser()
            parser.add_argument('bar', required=True, location=['values', 'cookies'])

            expected = {
                'bar': ("Missing required parameter in the post body or the query "
                "string or the request's cookies")
            }
            try:
                parser.parse_args(req)
            except BadRequest as e:
                self.assertEqual(e.data['message'], 'Input payload validation failed')
                self.assertEqual(e.data['errors'], expected)
예제 #3
0
    def test_parse_required(self, app):
        parser = RequestParser()
        parser.add_argument('foo', required=True, location='values')

        expected = {
            'foo':
            'Missing required parameter in the post body or the query string'
        }
        with pytest.raises(BadRequest) as cm:
            parser.parse_args()

        assert cm.value.data['message'] == 'Input payload validation failed'
        assert cm.value.data['errors'] == expected

        parser = RequestParser()
        parser.add_argument('bar',
                            required=True,
                            location=['values', 'cookies'])

        expected = {
            'bar': ("Missing required parameter in the post body or the query "
                    "string or the request's cookies")
        }

        with pytest.raises(BadRequest) as cm:
            parser.parse_args()
        assert cm.value.data['message'] == 'Input payload validation failed'
        assert cm.value.data['errors'] == expected
예제 #4
0
    def test_parse_required(self, app):
        parser = RequestParser()
        parser.add_argument('foo', required=True, location='values')

        expected = {
            'foo': 'Missing required parameter in the post body or the query string'
        }
        with pytest.raises(BadRequest) as cm:
            parser.parse_args()

        assert cm.value.data['message'] == 'Input payload validation failed'
        assert cm.value.data['errors'] == expected

        parser = RequestParser()
        parser.add_argument('bar', required=True, location=['values', 'cookies'])

        expected = {
            'bar': ("Missing required parameter in the post body or the query "
            "string or the request's cookies")
        }

        with pytest.raises(BadRequest) as cm:
            parser.parse_args()
        assert cm.value.data['message'] == 'Input payload validation failed'
        assert cm.value.data['errors'] == expected
예제 #5
0
    def test_parse_choices(self, app):
        req = Request.from_values('/bubble?foo=bar')

        parser = RequestParser()
        parser.add_argument('foo', choices=['bat']),

        with pytest.raises(BadRequest):
            parser.parse_args(req)
예제 #6
0
    def test_parse_choices_sensitive(self, app):
        req = Request.from_values('/bubble?foo=BAT')

        parser = RequestParser()
        parser.add_argument('foo', choices=['bat'], case_sensitive=True),

        with pytest.raises(BadRequest):
            parser.parse_args(req)
예제 #7
0
    def test_parse_lte_gte_mock(self, mocker):
        mock_type = mocker.Mock()

        parser = RequestParser()
        parser.add_argument('foo', type=mock_type, operators=['<='])

        parser.parse_args()
        mock_type.assert_called_with('bar', 'foo', '<=')
예제 #8
0
    def test_parse_choices_sensitive(self, app):
        req = Request.from_values('/bubble?foo=BAT')

        parser = RequestParser()
        parser.add_argument('foo', choices=['bat'], case_sensitive=True),

        with pytest.raises(BadRequest):
            parser.parse_args(req)
예제 #9
0
    def test_parse_choices(self, app):
        req = Request.from_values('/bubble?foo=bar')

        parser = RequestParser()
        parser.add_argument('foo', choices=['bat']),

        with pytest.raises(BadRequest):
            parser.parse_args(req)
예제 #10
0
    def test_parse_lte_gte_mock(self, mocker):
        mock_type = mocker.Mock()

        parser = RequestParser()
        parser.add_argument('foo', type=mock_type, operators=['<='])

        parser.parse_args()
        mock_type.assert_called_with('bar', 'foo', '<=')
예제 #11
0
    def test_int_range_choice_types(self, app):
        parser = RequestParser()
        parser.add_argument('foo', type=int, choices=range(100), location='json')

        with app.test_request_context('/bubble', method='post',
                                      data=json.dumps({'foo': 101}),
                                      content_type='application/json'):
            with pytest.raises(BadRequest):
                parser.parse_args()
예제 #12
0
    def test_parse_lte_gte_mock(self):
        mock_type = Mock()
        req = Request.from_values('/bubble?foo<=bar')

        parser = RequestParser()
        parser.add_argument('foo', type=mock_type, operators=['<='])

        parser.parse_args(req)
        mock_type.assert_called_with('bar', 'foo', '<=')
예제 #13
0
 def test_help_no_error_msg(self, abort):
     parser = RequestParser()
     parser.add_argument('foo', choices=['one', 'two'], help='Please select a valid choice')
     req = Mock(['values'])
     req.values = MultiDict([('foo', 'three')])
     with self.app.app_context():
         parser.parse_args(req)
     expected = {'foo': 'Please select a valid choice'}
     abort.assert_called_with(400, 'Input payload validation failed', errors=expected)
예제 #14
0
 def test_no_help(self, app, mocker):
     abort = mocker.patch('flask_restplus.reqparse.abort',
                          side_effect=BadRequest('Bad Request'))
     parser = RequestParser()
     parser.add_argument('foo', choices=['one', 'two'])
     req = mocker.Mock(['values'])
     req.values = MultiDict([('foo', 'three')])
     with pytest.raises(BadRequest):
         parser.parse_args(req)
     expected = {'foo': 'The value \'three\' is not a valid choice for \'foo\'.'}
     abort.assert_called_with(400, 'Input payload validation failed', errors=expected)
예제 #15
0
    def test_int_range_choice_types(self, app):
        parser = RequestParser()
        parser.add_argument('foo',
                            type=int,
                            choices=range(100),
                            location='json')

        with app.test_request_context('/bubble',
                                      method='post',
                                      data=json.dumps({'foo': 101}),
                                      content_type='application/json'):
            with pytest.raises(BadRequest):
                parser.parse_args()
예제 #16
0
    def test_int_range_choice_types(self):
        parser = RequestParser()
        parser.add_argument('foo', type=int, choices=range(100), location='json')

        with self.app.test_request_context(
                '/bubble', method='post',
                data=json.dumps({'foo': 101}),
                content_type='application/json'
        ):
            try:
                parser.parse_args()
                self.fail()
            except BadRequest:
                pass
예제 #17
0
    def test_parse_error_bundling_w_parser_arg(self, app):
        parser = RequestParser(bundle_errors=True)
        parser.add_argument('foo', required=True, location='values')
        parser.add_argument('bar', required=True, location=['values', 'cookies'])

        with pytest.raises(BadRequest) as cm:
            parser.parse_args()

        assert cm.value.data['message'] == 'Input payload validation failed'
        assert cm.value.data['errors'] == {
            'foo': 'Missing required parameter in the post body or the query string',
            'bar': ("Missing required parameter in the post body or the query string "
                    "or the request's cookies")
        }
예제 #18
0
 def test_no_help(self, app, mocker):
     abort = mocker.patch('flask_restplus.reqparse.abort',
                          side_effect=BadRequest('Bad Request'))
     parser = RequestParser()
     parser.add_argument('foo', choices=['one', 'two'])
     req = mocker.Mock(['values'])
     req.values = MultiDict([('foo', 'three')])
     with pytest.raises(BadRequest):
         parser.parse_args(req)
     expected = {
         'foo': 'The value \'three\' is not a valid choice for \'foo\'.'
     }
     abort.assert_called_with(400,
                              'Input payload validation failed',
                              errors=expected)
예제 #19
0
    def test_parse_lte(self):
        req = Request.from_values('/bubble?foo<=bar')
        parser = RequestParser()
        parser.add_argument('foo', operators=['<='])

        args = parser.parse_args(req)
        self.assertEqual(args['foo'], 'bar')
예제 #20
0
    def test_passing_arguments_object(self, app):
        req = Request.from_values('/bubble?foo=bar')
        parser = RequestParser()
        parser.add_argument(Argument('foo'))

        args = parser.parse_args(req)
        assert args['foo'] == 'bar'
예제 #21
0
    def test_json_location(self):
        parser = RequestParser()
        parser.add_argument('foo', location='json', store_missing=True)

        with self.app.test_request_context('/bubble', method='post'):
            args = parser.parse_args()
            self.assertEqual(args['foo'], None)
예제 #22
0
    def test_parse_unicode_app(self, app):
        parser = RequestParser()
        parser.add_argument('foo')

        with app.test_request_context('/bubble?foo=barß'):
            args = parser.parse_args()
            assert args['foo'] == 'barß'
예제 #23
0
    def test_parse_unicode(self, app):
        req = Request.from_values('/bubble?foo=barß')
        parser = RequestParser()
        parser.add_argument('foo')

        args = parser.parse_args(req)
        assert args['foo'] == 'barß'
예제 #24
0
    def test_viewargs(self, mocker):
        req = Request.from_values()
        req.view_args = {'foo': 'bar'}
        parser = RequestParser()
        parser.add_argument('foo', location=['view_args'])
        args = parser.parse_args(req)
        assert args['foo'] == 'bar'

        req = mocker.Mock()
        req.values = ()
        req.json = None
        req.view_args = {'foo': 'bar'}
        parser = RequestParser()
        parser.add_argument('foo', store_missing=True)
        args = parser.parse_args(req)
        assert args['foo'] is None
예제 #25
0
    def test_trim_request_parser(self, app):
        req = Request.from_values('/bubble?foo= 1 &bar=bees&n=22')
        parser = RequestParser(trim=False)
        parser.add_argument('foo')
        args = parser.parse_args(req)
        assert args['foo'] == ' 1 '

        parser = RequestParser(trim=True)
        parser.add_argument('foo')
        args = parser.parse_args(req)
        assert args['foo'] == '1'

        parser = RequestParser(trim=True)
        parser.add_argument('foo', type=int)
        args = parser.parse_args(req)
        assert args['foo'] == 1
예제 #26
0
    def test_viewargs(self, mocker):
        req = Request.from_values()
        req.view_args = {'foo': 'bar'}
        parser = RequestParser()
        parser.add_argument('foo', location=['view_args'])
        args = parser.parse_args(req)
        assert args['foo'] == 'bar'

        req = mocker.Mock()
        req.values = ()
        req.json = None
        req.view_args = {'foo': 'bar'}
        parser = RequestParser()
        parser.add_argument('foo', store_missing=True)
        args = parser.parse_args(req)
        assert args['foo'] is None
예제 #27
0
    def test_passing_arguments_object(self, app):
        req = Request.from_values('/bubble?foo=bar')
        parser = RequestParser()
        parser.add_argument(Argument('foo'))

        args = parser.parse_args(req)
        assert args['foo'] == 'bar'
예제 #28
0
    def test_trim_request_parser(self, app):
        req = Request.from_values('/bubble?foo= 1 &bar=bees&n=22')
        parser = RequestParser(trim=False)
        parser.add_argument('foo')
        args = parser.parse_args(req)
        assert args['foo'] == ' 1 '

        parser = RequestParser(trim=True)
        parser.add_argument('foo')
        args = parser.parse_args(req)
        assert args['foo'] == '1'

        parser = RequestParser(trim=True)
        parser.add_argument('foo', type=int)
        args = parser.parse_args(req)
        assert args['foo'] == 1
예제 #29
0
    def test_parse_unicode(self, app):
        req = Request.from_values('/bubble?foo=barß')
        parser = RequestParser()
        parser.add_argument('foo')

        args = parser.parse_args(req)
        assert args['foo'] == 'barß'
예제 #30
0
    def test_parse_unicode_app(self, app):
        parser = RequestParser()
        parser.add_argument('foo')

        with app.test_request_context('/bubble?foo=barß'):
            args = parser.parse_args()
            assert args['foo'] == 'barß'
    def post(self):
        parser = RequestParser(bundle_errors=True)
        parser.add_argument('username', type=str, required=True, location='json', help='username is required')
        parser.add_argument('password', type=str, required=True, location='json', help='password is required')
        parser.add_argument('rem', type=inputs.boolean, default=False, required=False, location='json',
                            help='rem is required')
        args = parser.parse_args(strict=True)
        user = User.query.filter((User.username == args.username) | (User.email == args.username)).first()
        if not user:
            return {'message': 'Incorrect username or password'}, 401
        else:
            if not check_password_hash(user.password, args.password):
                return {'message': 'Incorrect username or password'}, 401
            else:
                if not user.status:
                    return {'message': 'Your account is currently inactive'}, 401
                else:
                    send_mail_rq.queue(LOGIN_NOTIFY.format(name=user.full_name, app_name='Ngsapps', email=user.email,
                                                           time=str(datetime.utcnow()), ip=request.remote_addr,
                                                           user_agent=request.user_agent), [user.email],
                                       'Ngsapp Support')
                    # create JWT
                    access_token = create_access_token(identity=str(user.uuid))
                    refresh_token = create_refresh_token(identity=str(user.uuid))
                    resp = jsonify({'login': True, 'role': user.role})

                    set_access_cookies(resp, access_token)
                    set_refresh_cookies(resp, refresh_token)
                    resp.set_cookie('access_token_cookie', access_token)
                    # access_jti = get_jti(encoded_token=access_token)
                    # refresh_jti = get_jti(encoded_token=refresh_token)
                    # redis.set(access_jti, 'false', current_app.config['JWT_ACCESS_TOKEN_EXPIRES'] * 1.2)
                    # redis.set(refresh_jti, 'false', current_app.config['JWT_REFRESH_TOKEN_EXPIRES'] * 1.2)
                    return make_response(resp)
예제 #32
0
    def test_parse_unicode_app(self):
        parser = RequestParser()
        parser.add_argument('foo')

        with self.app.test_request_context('/bubble?foo=barß'):
            args = parser.parse_args()
            self.assertEqual(args['foo'], 'barß')
예제 #33
0
    def test_parse_unicode(self):
        req = Request.from_values('/bubble?foo=barß')
        parser = RequestParser()
        parser.add_argument('foo')

        args = parser.parse_args(req)
        self.assertEqual(args['foo'], 'barß')
예제 #34
0
    def test_parse_append_ignore(self, app):
        parser = RequestParser()
        parser.add_argument('foo', ignore=True, type=int, action='append',
                            store_missing=True),

        args = parser.parse_args()
        assert args['foo'] is None
예제 #35
0
    def test_trim_request_parser(self):
        req = Request.from_values('/bubble?foo= 1 &bar=bees&n=22')
        parser = RequestParser(trim=False)
        parser.add_argument('foo')
        args = parser.parse_args(req)
        self.assertEqual(args['foo'], ' 1 ')

        parser = RequestParser(trim=True)
        parser.add_argument('foo')
        args = parser.parse_args(req)
        self.assertEqual(args['foo'], '1')

        parser = RequestParser(trim=True)
        parser.add_argument('foo', type=int)
        args = parser.parse_args(req)
        self.assertEqual(args['foo'], 1)
예제 #36
0
    def test_viewargs(self):
        req = Request.from_values()
        req.view_args = {'foo': 'bar'}
        parser = RequestParser()
        parser.add_argument('foo', location=['view_args'])
        args = parser.parse_args(req)
        self.assertEqual(args['foo'], 'bar')

        req = Mock()
        req.values = ()
        req.json = None
        req.view_args = {'foo': 'bar'}
        parser = RequestParser()
        parser.add_argument('foo', store_missing=True)
        args = parser.parse_args(req)
        self.assertEqual(args['foo'], None)
예제 #37
0
    def test_passing_arguments_object(self):
        req = Request.from_values('/bubble?foo=bar')
        parser = RequestParser()
        parser.add_argument(Argument('foo'))

        args = parser.parse_args(req)
        self.assertEqual(args['foo'], 'bar')
예제 #38
0
class QueryPagination:
    """
    A query pagination class.

    Returns the paginated queryset of the given model and query using the request
    query parameters 'pageSize' and 'pageNumber'.
    """
    parser = None
    model = None

    def __init__(self, model=None, page_size_help='objects'):
        self.parser = RequestParser()
        self.model = model
        self.setup(page_size_help)

    def setup(self, page_size_help='objects'):
        """QueryPagination setup method"""
        self.parser.add_argument('pageSize',
                                 type=int,
                                 help=f'Number of {page_size_help} returned')
        self.parser.add_argument('pageNumber', type=int, help='Page number')

    def get_args(self):
        """Returns the pagination query parameters"""
        return self.parser.parse_args()

    def get_parser(self):
        """Returns the pagination RequestParser"""
        return self.parser

    def get_paginated_queryset(self, query={}):
        """
        Returns the paginated queryset according to the request parameters.

        If page size isn't provided but a page number was provided, the
        DEFAULT_PAGINATION_SIZE will be used.

        A BadRequest exception will be raised if the page number exceeds the
        actual maximum number of pages.
        """
        params = self.get_args()
        size = params['pageSize']
        data = []

        if params['pageNumber'] and not size:
            size = Config.DEFAULT_PAGINATION_SIZE

        try:
            if not query:
                data = self.model.query.paginate(params['pageNumber'],
                                                 size).items
            else:
                data = self.model.query.filter_by(**query).paginate(
                    params['pageNumber'], size).items
        except NotFound as err:
            raise BadRequest(
                "'pageNumber' parameter exceeds the actual maximum pages")

        return data
예제 #39
0
    def test_parse_choices_sensitive(self):
        with self.app.app_context():
            req = Request.from_values('/bubble?foo=BAT')

            parser = RequestParser()
            parser.add_argument('foo', choices=['bat'], case_sensitive=True),

            self.assertRaises(BadRequest, lambda: parser.parse_args(req))
예제 #40
0
    def test_parse_choices_insensitive(self):
        req = Request.from_values('/bubble?foo=BAT')

        parser = RequestParser()
        parser.add_argument('foo', choices=['bat'], case_sensitive=False),

        args = parser.parse_args(req)
        self.assertEqual('bat', args.get('foo'))

        # both choices and args are case_insensitive
        req = Request.from_values('/bubble?foo=bat')

        parser = RequestParser()
        parser.add_argument('foo', choices=['BAT'], case_sensitive=False),

        args = parser.parse_args(req)
        self.assertEqual('bat', args.get('foo'))
예제 #41
0
    def test_type_callable(self):
        req = Request.from_values('/bubble?foo=1')

        parser = RequestParser()
        parser.add_argument('foo', type=lambda x: x, required=False),

        args = parser.parse_args(req)
        self.assertEqual(args['foo'], '1')
예제 #42
0
 def test_none_argument(self):
     parser = RequestParser()
     parser.add_argument('foo', location='json')
     with self.app.test_request_context('/bubble', method='post',
                                   data=json.dumps({'foo': None}),
                                   content_type='application/json'):
         args = parser.parse_args()
         self.assertEqual(args['foo'], None)
예제 #43
0
    def test_parse_ignore(self):
        req = Request.from_values('/bubble?foo=bar')

        parser = RequestParser()
        parser.add_argument('foo', type=int, ignore=True, store_missing=True),

        args = parser.parse_args(req)
        self.assertEqual(args['foo'], None)