From 407795b61217205625f2d4e084afbf69f1db781b Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sat, 11 Nov 2017 09:47:59 -0800 Subject: [PATCH] Initial unit tests against our Sanic app Refs #50 I had to disable the build metadata function to get these tests to work sensibly. I need to completely rethink how that mechanism works. --- datasette/app.py | 2 +- setup.py | 5 +++- tests/test_app.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 tests/test_app.py diff --git a/datasette/app.py b/datasette/app.py index 7f7c1bad..edfc183a 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -34,7 +34,7 @@ SQL_TIME_LIMIT_MS = 1000 connections = threading.local() -def ensure_build_metadata(files, regenerate=False): +def ensure_build_metadata(files, regenerate=True): build_metadata = app_root / BUILD_METADATA if build_metadata.exists() and not regenerate: return json.loads(build_metadata.read_text()) diff --git a/setup.py b/setup.py index 7e699d14..3d00eabd 100644 --- a/setup.py +++ b/setup.py @@ -18,5 +18,8 @@ setup( datasette=datasette.cli:cli ''', setup_requires=['pytest-runner'], - tests_require=['pytest'], + tests_require=[ + 'pytest==3.2.3', + 'aiohttp==2.3.2', + ], ) diff --git a/tests/test_app.py b/tests/test_app.py new file mode 100644 index 00000000..b79c327b --- /dev/null +++ b/tests/test_app.py @@ -0,0 +1,60 @@ +from datasette.app import Datasette +import os +import pytest +import sqlite3 +import tempfile + + +@pytest.fixture(scope='module') +def three_table_app_client(): + with tempfile.TemporaryDirectory() as tmpdir: + filepath = os.path.join(tmpdir, 'three_tables.db') + conn = sqlite3.connect(filepath) + conn.executescript(THREE_TABLES) + os.chdir(os.path.dirname(filepath)) + yield Datasette([filepath]).app().test_client + + +def test_homepage(three_table_app_client): + _, response = three_table_app_client.get('/') + assert response.status == 200 + assert 'three_tables' in response.text + + # Now try the JSON + _, response = three_table_app_client.get('/.json') + assert response.status == 200 + assert response.json.keys() == {'three_tables': 0}.keys() + d = response.json['three_tables'] + assert d['name'] == 'three_tables' + assert d['tables_count'] == 3 + + +def test_database_page(three_table_app_client): + _, response = three_table_app_client.get('/three_tables', allow_redirects=False) + assert response.status == 302 + _, response = three_table_app_client.get('/three_tables') + assert 'three_tables' in response.text + + + + +THREE_TABLES = ''' +CREATE TABLE simple_primary_key ( + pk varchar(30) primary key, + content text +); + +CREATE TABLE compound_primary_key ( + pk1 varchar(30), + pk2 varchar(30), + content text, + PRIMARY KEY (pk1, pk2) +); + +CREATE TABLE no_primary_key ( + content text +); + +INSERT INTO simple_primary_key VALUES (1, 'hello'); +INSERT INTO simple_primary_key VALUES (2, 'world'); +'''