"""Test flask.""" from datetime import date from datetime import datetime import json import pytest from owsresponse import response from owsresponse.adaptors import flask def test_flaskify_dict_response(): """Test flaskifying a response. """ resp = flask.flaskify(response.Response(message=dict(key='value'))) assert resp.data == b'{"key": "value"}' assert resp.mimetype == 'application/json' assert resp.status_code == 200 def test_flaskify_list_response(): """Test flaskifying a response. """ resp = flask.flaskify(response.Response(message=['value1', 'value2'])) assert resp.data == b'["value1", "value2"]' assert resp.mimetype == 'application/json' assert resp.status_code == 200 def test_flaskify_string_response(): """Test flaskifying a response. """ resp = flask.flaskify(response.Response(message='value1')) assert resp.data == b'value1' assert resp.mimetype == 'text/plain' assert resp.status_code == 200 def test_flaskify_error_response(): """Flaskify an error response. """ resp = flask.flaskify(response.create_fatal_response('Fatal Error')) assert resp.status_code == 500 data = json.loads(resp.data.decode('utf8')) assert data == {'message': 'Fatal Error', 'code': 'internal_error'} class DateTime: """A fake neotime.DateTime object.""" def __init__(self, year, month, day, hour, minute, second): self.native = datetime(year, month, day, hour, minute, second) self.date_str = str(self.native) def __str__(self): return self.date_str def to_native(self): return self.native @pytest.mark.parametrize( 'input_date, date_str', [ (datetime(2020, 1, 1, 1, 1, 1), '2020-01-01T01:01:01.000000Z'), (date(2020, 1, 1), '2020-01-01T00:00:00.000000Z'), (DateTime(2020, 1, 1, 1, 1, 1), '2020-01-01T01:01:01.000000Z'), ('not_date', 'not_date') ] ) def test_flaskify_date_object(input_date, date_str): resp = flask.flaskify( response.Response(message=dict(some_date=input_date))) assert resp.data == b'{"some_date": "' + date_str.encode() + b'"}' assert resp.mimetype == 'application/json' assert resp.status_code == 200 def test_flaskify_date_object_custom_serializer_class(): input_date = datetime(2020, 1, 1, 1, 1, 1) date_str = '2020-01-01 01:01:01' date_format = '%Y-%m-%d %H:%M:%S' class CustomDateEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime(date_format) return super(CustomDateEncoder, self).encode(obj) resp = flask.flaskify( response.Response(message=dict(some_date=input_date)), encoder=CustomDateEncoder) assert resp.data == b'{"some_date": "' + date_str.encode() + b'"}' assert resp.mimetype == 'application/json' assert resp.status_code == 200 def test_flaskify_not_serializable_type(): """Test encoding non-serializable data.""" data = {2020, 1} # set is not serializable with pytest.raises(TypeError): flask.flaskify(response.Response(message=dict(some_date=data)))