diff --git a/test/WebService_test.py b/test/WebService_test.py index f72f7f590a32d04c7d20d292edfd67dfff0fa440..8641f809b72760340e8ef3e4c0a9fe230445557d 100644 --- a/test/WebService_test.py +++ b/test/WebService_test.py @@ -1,76 +1,154 @@ -"""Tests for WebService.py""" - +"""Unit Tests for WebService""" +from cgi import parse_qs +from datetime import datetime from nose.tools import assert_equals +from nose.tools import assert_raises +from nose.tools import assert_is_instance import sys from webtest import TestApp from geomagio.edge import EdgeFactory +from geomagio.WebService import _get_param from geomagio.WebService import WebService +from obspy.core.stream import Stream +from obspy.core.utcdatetime import UTCDateTime + + +APP = TestApp(WebService(EdgeFactory())) + + +def test__get_param(): + """WebService_test.test__get_param() + + Call function _get_param to make certain it gets back + the appropriate values and raises exceptions for invalid values. + """ + params = { + 'id': None, + 'elements': 'H,E,Z,F', + 'sampling_period': ['1', '60'], + } + assert_raises(Exception, _get_param, params, 'id', required=True) + elements = _get_param(params, 'elements') + assert_equals(elements, 'H,E,Z,F') + assert_raises(Exception, _get_param, params, 'sampling_period') + +def test_fetch(): + """WebService_test.test_fetch()) + + Call function WebService.fetch to confirm tht it returns an + obspy.core.stream object. + """ + service = WebService(EdgeFactory()) + query = service.parse(parse_qs('id=BOU&starttime=2016-06-06' + '&endtime=2016-06-07&elements=H,E,Z,F&sampling_period=60' + '&format=iaga2002&type=variation')) + timeseries = service.fetch(query) + assert_is_instance(timeseries, Stream) + + +def test_parse(): + """WebService_test.test_parse() + + Create WebService instance and call parse to confirm that query + string values are applied to the correct class attribute. Also + confirm that default values are applied correctly. + """ + service = WebService(EdgeFactory()) + query = service.parse(parse_qs('id=BOU&starttime=2016-06-06' + '&endtime=2016-06-07&elements=H,E,Z,F&sampling_period=60' + '&format=iaga2002&type=variation')) + assert_equals(query.observatory_id, 'BOU') + assert_equals(query.starttime, UTCDateTime(2016, 6, 6, 0)) + assert_equals(query.endtime, UTCDateTime(2016, 6, 7, 0)) + assert_equals(query.elements, ['H', 'E', 'Z', 'F']) + assert_equals(query.sampling_period, '60') + assert_equals(query.output_format, 'iaga2002') + assert_equals(query.data_type, 'variation') + # Test that defaults are set for unspecified values + now = datetime.now() + today = UTCDateTime(year=now.year, month=now.month, day=now.day, hour=0) + tomorrow = today + (24 * 60 * 60 - 1) + query = service.parse(parse_qs('id=BOU')) + assert_equals(query.observatory_id, 'BOU') + assert_equals(query.starttime, today) + assert_equals(query.endtime, tomorrow) + assert_equals(query.elements, ('X', 'Y', 'Z', 'F')) + assert_equals(query.sampling_period, '60') + assert_equals(query.output_format, 'iaga2002') + assert_equals(query.data_type, 'variation') -app = TestApp(WebService(EdgeFactory())) +def test_requests(): + """WebService_test.test_requests() -def test_bad_requests(): - """WebService_test.test_bad_requests() + Use TestApp to confirm correct response status, status int, + and content-type. """ - # Check bad request (values) - bad_values = [ + # Check invalid request (bad values) + invalid_values = [ '/', '/?id=bad', '/?id=BOU&starttime=2017-50-50', '/?id=BOU&starttime=2016-06-06&endtime=2017-50-50', '/?id=BOU&starttime=2016-06-06&endtime=2016-06-05', '/?id=BOU&elements=H,E,D,Z,F', + '/?id=BOU&sampling_period=20', '/?id=BOU&type=bad', '/?id=BOU&format=bad' ] - for bad_val in bad_values: + for invalid_val in invalid_values: try: - response = app.get(bad_val, expect_errors=True) + response = APP.get(invalid_val, expect_errors=True) assert_equals(response.status_int, 400) + assert_equals(response.status, '400 Bad Request') + assert_equals(response.content_type, 'text/plain') except Exception: exception = sys.exc_info()[1] message = exception.args[0] - print('FAIL: ' + message + '\nrequest = ' + bad_val) - # Check bad request (duplicates) + print('FAIL: ' + message + '\nrequest = ' + invalid_val) + # Check invalid request (duplicates) duplicate_values = [ '/?id=BOU&id=BOU', '/?id=BOU&starttime=2016-06-06&starttime=2016-06-06', '/?id=BOU&endtime=2017-50-50&endtime=2017-50-50', '/?id=BOU&elements=H,E,Z&elements=H,E,Z', + '/?id=BOU&sampling_period=1&sampling_period=60', '/?id=BOU&type=variation&type=variation', '/?id=BOU&format=iaga2002&format=iaga2002' ] for duplicate in duplicate_values: try: - response = app.get(duplicate, expect_errors=True) + response = APP.get(duplicate, expect_errors=True) assert_equals(response.status_int, 400) + assert_equals(response.status, '400 Bad Request') + assert_equals(response.content_type, 'text/plain') except Exception: exception = sys.exc_info()[1] message = exception.args[0] print('FAIL: ' + message + '\nrequest = ' + duplicate) - -def test_good_requests(): - """WebService_test.test_good_requests() - """ - # Check for upper and lower case - good_requests = [ + # Check valid request (upper and lower case) + valid_requests = [ '/?id=BOU', '/?id=bou', '/?id=bou&starttime=2016-06-06', '/?id=bou&starttime=2016-06-06&endtime=2016-06-07', '/?id=bou&elements=H,E,Z,F', '/?id=bou&elements=h,e,z,f', + '/?id=BOU&sampling_period=1', + '/?id=BOU&sampling_period=60', '/?id=BOU&type=variation', '/?id=BOU&type=VARIATION', '/?id=BOU&format=iaga2002', '/?id=BOU&format=IAGA2002' ] - for request in good_requests: + for request in valid_requests: try: - response = app.get(request) + response = APP.get(request) assert_equals(response.status_int, 200) + assert_equals(response.status, '200 OK') + assert_equals(response.content_type, 'text/plain') except Exception: exception = sys.exc_info()[1] message = exception.args[0]