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
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)
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
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)
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)
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', '<=')
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()
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', '<=')
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)
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)
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
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") }
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)
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')
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'
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)
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 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ß'
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
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
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)
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ß')
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ß')
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
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)
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)
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')
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
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))
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'))
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')
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)
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)