X-Git-Url: https://git.jsancho.org/?p=datasette-pytables.git;a=blobdiff_plain;f=tests%2Ftest_api.py;h=39c41228019dfbebb53c84803dc7ffa05d29ebb9;hp=834a65df893e2dff7bf2946991c913ad5cd80b8a;hb=b3ecaa0810240531236a9b89d74d0c6b07346f83;hpb=0577f9755ad56ce5205e84d5c9facef4846f317a diff --git a/tests/test_api.py b/tests/test_api.py index 834a65d..39c4122 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,5 +1,6 @@ from .fixtures import app_client import pytest +from urllib.parse import urlencode pytest.fixture(scope='module')(app_client) @@ -55,19 +56,170 @@ def test_database_page(app_client): def test_custom_sql(app_client): response = app_client.get( - '/test_tables.json?sql=select+identity+from+[/group1/table1]&_shape=objects', + '/test_tables.json?' + urlencode({ + 'sql': 'select identity from [/group1/table1] where speed > 100 and idnumber < 55', + '_shape': 'objects' + }), gather_request=False ) data = response.json + print("*************************", data) assert { - 'sql': 'select identity from [/group1/table1]', + 'sql': 'select identity from [/group1/table1] where speed > 100 and idnumber < 55', 'params': {} } == data['query'] + assert 4 == len(data['rows']) assert [ - {'identity': 'This is particle: 0'}, - {'identity': 'This is particle: 1'}, - {'identity': 'This is particle: 2'} + {'identity': 'This is particle: 51'}, + {'identity': 'This is particle: 52'}, + {'identity': 'This is particle: 53'}, + {'identity': 'This is particle: 54'} + ] == data['rows'] + assert ['identity'] == data['columns'] + assert 'test_tables' == data['database'] + assert False == data['truncated'] + +def test_custom_pytables_sql(app_client): + response = app_client.get( + '/test_tables.json?' + urlencode({ + 'sql': 'select identity from [/group1/table1] where (speed > 100) & (speed < 500)', + '_shape': 'objects' + }), + gather_request=False + ) + data = response.json + assert { + 'sql': 'select identity from [/group1/table1] where (speed > 100) & (speed < 500)', + 'params': {} + } == data['query'] + assert 199 == len(data['rows']) + assert [ + {'identity': 'This is particle: 51'}, + {'identity': 'This is particle: 52'}, + {'identity': 'This is particle: 53'} ] == data['rows'][:3] assert ['identity'] == data['columns'] assert 'test_tables' == data['database'] assert data['truncated'] + +def test_invalid_custom_sql(app_client): + response = app_client.get( + '/test_tables.json?sql=.schema', + gather_request=False + ) + assert response.status == 400 + assert response.json['ok'] is False + assert 'Statement must be a SELECT' == response.json['error'] + +def test_table_json(app_client): + response = app_client.get( + '/test_tables/%2Fgroup2%2Ftable2.json?_shape=objects', + gather_request=False + ) + assert response.status == 200 + data = response.json + assert data['query']['sql'] == 'select rowid, * from [/group2/table2] order by rowid limit 51' + assert data['rows'][3:6] == [{ + 'rowid': 3, + 'identity': 'This is particle: 3', + 'idnumber': 3, + 'speed': 6.0 + }, { + 'rowid': 4, + 'identity': 'This is particle: 4', + 'idnumber': 4, + 'speed': 8.0 + }, { + 'rowid': 5, + 'identity': 'This is particle: 5', + 'idnumber': 5, + 'speed': 10.0 + }] + +def test_table_not_exists_json(app_client): + assert { + 'ok': False, + 'error': 'Table not found: blah', + 'status': 404, + 'title': None, + } == app_client.get( + '/test_tables/blah.json', gather_request=False + ).json + +def test_table_shape_arrays(app_client): + response = app_client.get( + '/test_tables/%2Fgroup2%2Ftable2.json?_shape=arrays', + gather_request=False + ) + assert [ + [6, 'This is particle: 6', 6, 12.0], + [7, 'This is particle: 7', 7, 14.0], + ] == response.json['rows'][6:8] + +def test_table_shape_objects(app_client): + response = app_client.get( + '/test_tables/%2Fgroup2%2Ftable2.json?_shape=objects', + gather_request=False + ) + assert [{ + 'rowid': 6, + 'identity': 'This is particle: 6', + 'idnumber': 6, + 'speed': 12.0, + }, { + 'rowid': 7, + 'identity': 'This is particle: 7', + 'idnumber': 7, + 'speed': 14.0, + }] == response.json['rows'][6:8] + +def test_table_shape_array(app_client): + response = app_client.get( + '/test_tables/%2Fgroup2%2Ftable2.json?_shape=array', + gather_request=False + ) + assert [{ + 'rowid': 6, + 'identity': 'This is particle: 6', + 'idnumber': 6, + 'speed': 12.0, + }, { + 'rowid': 7, + 'identity': 'This is particle: 7', + 'idnumber': 7, + 'speed': 14.0, + }] == response.json[6:8] + +def test_table_shape_invalid(app_client): + response = app_client.get( + '/test_tables/%2Fgroup2%2Ftable2.json?_shape=invalid', + gather_request=False + ) + assert { + 'ok': False, + 'error': 'Invalid _shape: invalid', + 'status': 400, + 'title': None, + } == response.json + +@pytest.mark.parametrize('path, expected_rows, expected_pages', [ + ('/test_tables/%2Farray1.json', 2, 1), + ('/test_tables/%2Farray1.json?_size=1', 2, 2), + ('/test_tables/%2Fgroup1%2Farray2.json?_size=1000', 10000, 10), +]) +def test_paginate_tables_and_arrays(app_client, path, expected_rows, expected_pages): + fetched = [] + count = 0 + while path: + response = app_client.get(path, gather_request=False) + print("*****", response.json) + assert 200 == response.status + count += 1 + fetched.extend(response.json['rows']) + path = response.json['next_url'] + if path: + assert response.json['next'] + assert '_next={}'.format(response.json['next']) in path + + assert expected_rows == len(fetched) + assert expected_pages == count