From d0122786db3fe13bafba74854fcd9d961d21ae5d Mon Sep 17 00:00:00 2001 From: John Krauss Date: Thu, 12 May 2016 14:21:31 -0400 Subject: [PATCH] first-pass automatic testing --- .gitignore | 2 ++ scripts/README.md | 15 +++++++++ scripts/autotest.py | 66 ++++++++++++++++++++++++++++++++++++++++ scripts/requirements.txt | 3 ++ 4 files changed, 86 insertions(+) create mode 100644 scripts/README.md create mode 100644 scripts/autotest.py create mode 100644 scripts/requirements.txt diff --git a/.gitignore b/.gitignore index 4e3e7f4..a855859 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ src/pg/observatory--current--dev.sql src/pg/observatory--dev--current.sql src/pg/observatory--dev.sql +venv +*.pyc diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..16e0803 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,15 @@ +## Automatic tests and utilities + +### Installation + +Python 2.7 should cover you. Virtualenv recommended. + + virtualenv venv + source venv/bin/activate + pip install -r requirements.txt + +### Execution + +Run automated tests against a hostname: + + (venv) OBS_HOSTNAME= OBS_API_KEY=foobar nosetests autotest.py diff --git a/scripts/autotest.py b/scripts/autotest.py new file mode 100644 index 0000000..092c800 --- /dev/null +++ b/scripts/autotest.py @@ -0,0 +1,66 @@ +from nose.tools import assert_equal +from nose_parameterized import parameterized + +import os +import re +import requests + +HOSTNAME = os.environ['OBS_HOSTNAME'] +API_KEY = os.environ['OBS_API_KEY'] + +def query(q, **options): + ''' + Query the account. Returned is the response, wrapped by the requests + library. + ''' + url = 'https://{hostname}/api/v2/sql'.format(hostname=HOSTNAME) + params = options.copy() + params['q'] = re.sub(r'\s+', ' ', q) + params['api_key'] = API_KEY + return requests.get(url, params=params) + +MEASURE_COLUMNS = [(r['id'], ) for r in query(''' +SELECT id FROM observatory.obs_column +WHERE type ILIKE 'numeric' +AND weight > 0 +''').json()['rows']] + +CATEGORY_COLUMNS = [(r['id'], ) for r in query(''' +SELECT id FROM observatory.obs_column +WHERE type ILIKE 'text' +AND weight > 0 +''').json()['rows']] + +BOUNDARY_COLUMNS = [(r['id'], ) for r in query(''' +SELECT id FROM observatory.obs_column +WHERE type ILIKE 'geometry' +AND weight > 0 +''').json()['rows']] + + +@parameterized(MEASURE_COLUMNS) +def test_measure_points(column_id): + resp = query(''' +SELECT * +FROM cdb_observatory.OBS_GetMeasure(cdb_observatory._TestPoint(), + '{column_id}') + '''.format(column_id=column_id)) + assert_equal(resp.status_code, 200) + +@parameterized(CATEGORY_COLUMNS) +def test_category_points(column_id): + resp = query(''' +SELECT * +FROM cdb_observatory.OBS_GetCategory(cdb_observatory._TestPoint(), + '{column_id}') + '''.format(column_id=column_id)) + assert_equal(resp.status_code, 200) + +@parameterized(BOUNDARY_COLUMNS) +def test_boundary_points(column_id): + resp = query(''' +SELECT * +FROM cdb_observatory.OBS_GetBoundary(cdb_observatory._TestPoint(), + '{column_id}') + '''.format(column_id=column_id)) + assert_equal(resp.status_code, 200) diff --git a/scripts/requirements.txt b/scripts/requirements.txt new file mode 100644 index 0000000..838bc0e --- /dev/null +++ b/scripts/requirements.txt @@ -0,0 +1,3 @@ +requests +nose +nose_parameterized