def test_etag_set_etag_in_response(self, app, schemas, paginate): blp = Blueprint("test", __name__) etag_schema = schemas.DocEtagSchema item = {"item_id": 1, "db_field": 0} if paginate: extra_data = (("X-Pagination", "Dummy pagination header"), ) else: extra_data = tuple() etag = blp._generate_etag(item, extra_data=extra_data) etag_with_schema = blp._generate_etag(item, etag_schema, extra_data=extra_data) with app.test_request_context("/"): resp = Response() if extra_data: resp.headers["X-Pagination"] = "Dummy pagination header" get_appcontext()["result_dump"] = item blp._set_etag_in_response(resp, None) assert resp.get_etag() == (etag, False) with app.test_request_context("/"): resp = Response() if extra_data: resp.headers["X-Pagination"] = "Dummy pagination header" get_appcontext()["result_raw"] = item blp._set_etag_in_response(resp, etag_schema) assert resp.get_etag() == (etag_with_schema, False)
def test_etag_set_etag_in_response(self, app, schemas, paginate): blp = Blueprint('test', __name__) etag_schema = schemas.DocEtagSchema item = {'item_id': 1, 'db_field': 0} if paginate: extra_data = (('X-Pagination', 'Dummy pagination header'),) else: extra_data = tuple() etag = blp._generate_etag(item, extra_data=extra_data) etag_with_schema = blp._generate_etag( item, etag_schema, extra_data=extra_data) with app.test_request_context('/'): resp = Response() if extra_data: resp.headers['X-Pagination'] = 'Dummy pagination header' get_appcontext()['result_dump'] = item blp._set_etag_in_response(resp, None) assert resp.get_etag() == (etag, False) with app.test_request_context('/'): resp = Response() if extra_data: resp.headers['X-Pagination'] = 'Dummy pagination header' get_appcontext()['result_raw'] = item blp._set_etag_in_response(resp, etag_schema) assert resp.get_etag() == (etag_with_schema, False)
def wrapper(*args, **kwargs): # If this decorator is used for as an alternative response, # return without serializing if alt_response: return func(*args, **kwargs) # Execute decorated function result_raw, status, headers = unpack_tuple_response( func(*args, **kwargs)) # If return value is a werkzeug BaseResponse, return it if isinstance(result_raw, BaseResponse): set_status_and_headers_in_response( result_raw, status, headers) return result_raw # Dump result with schema if specified if schema is None: result_dump = result_raw else: result_dump = schema.dump(result_raw) # Store result in appcontext (may be used for ETag computation) appcontext = get_appcontext() appcontext['result_raw'] = result_raw appcontext['result_dump'] = result_dump # Build response resp = jsonify(self._prepare_response_content(result_dump)) set_status_and_headers_in_response(resp, status, headers) if status is None: resp.status_code = code return resp
def _prepare_response_content(data): if data is not None: ret = {"data": data} page_meta = get_appcontext().get("pagination_metadata") if page_meta is not None: ret["pagination"] = page_meta return ret return None
def _prepare_response_content(data): if data is not None: ret = {'data': data} page_meta = get_appcontext().get('pagination_metadata') if page_meta is not None: ret['pagination'] = page_meta return ret return None
def test_etag_duplicate_header(self, app): """Check duplicate header results in a different ETag""" class CustomBlueprint(Blueprint): ETAG_INCLUDE_HEADERS = Blueprint.ETAG_INCLUDE_HEADERS + ["X-test"] blp = CustomBlueprint("test", __name__, url_prefix="/test") with app.test_request_context("/"): resp = Response() resp.headers.add("X-test", "Test") get_appcontext()["result_dump"] = {} blp._set_etag_in_response(resp, None) etag_1 = resp.get_etag() with app.test_request_context("/"): resp = Response() resp.headers.add("X-test", "Test") resp.headers.add("X-test", "Test") get_appcontext()["result_dump"] = {} blp._set_etag_in_response(resp, None) etag_2 = resp.get_etag() assert etag_1 != etag_2
def test_etag_duplicate_header(self, app): """Check duplicate header results in a different ETag""" class CustomBlueprint(Blueprint): ETAG_INCLUDE_HEADERS = Blueprint.ETAG_INCLUDE_HEADERS + ['X-test'] blp = CustomBlueprint('test', __name__, url_prefix='/test') with app.test_request_context('/'): resp = Response() resp.headers.add('X-test', 'Test') get_appcontext()['result_dump'] = {} blp._set_etag_in_response(resp, None) etag_1 = resp.get_etag() with app.test_request_context('/'): resp = Response() resp.headers.add('X-test', 'Test') resp.headers.add('X-test', 'Test') get_appcontext()['result_dump'] = {} blp._set_etag_in_response(resp, None) etag_2 = resp.get_etag() assert etag_1 != etag_2
def _set_pagination_metadata(self, page_params, result, headers): page_meta = self._make_pagination_metadata( page_params.page, page_params.page_size, page_params.item_count) get_appcontext()["pagination_metadata"] = page_meta return result, headers