]> git.jsancho.org Git - datasette-pytables.git/blobdiff - tests/test_api.py
RELEASING.md update
[datasette-pytables.git] / tests / test_api.py
index 17ac230b9cecb7bb3fd70a83c58be613d1d24935..5d0bfdcc212c0d432bdf6d0982d6b99e1bdc7a69 100644 (file)
@@ -1,5 +1,6 @@
 from .fixtures import app_client
 import pytest
+from urllib.parse import urlencode
 
 pytest.fixture(scope='module')(app_client)
 
@@ -9,7 +10,7 @@ def test_homepage(app_client):
     assert response.json.keys() == {'test_tables': 0}.keys()
     d = response.json['test_tables']
     assert d['name'] == 'test_tables'
-    assert d['tables_count'] == 4
+    assert d['tables_count'] == 5
 
 def test_database_page(app_client):
     response = app_client.get('/test_tables.json', gather_request=False)
@@ -17,7 +18,7 @@ def test_database_page(app_client):
     assert 'test_tables' == data['database']
     assert [{
         'name': '/array1',
-        'columns': [],
+        'columns': ['value'],
         'primary_keys': [],
         'count': 2,
         'label_column': None,
@@ -26,7 +27,7 @@ def test_database_page(app_client):
         'foreign_keys': {'incoming': [], 'outgoing': []}
     }, {
         'name': '/group1/array2',
-        'columns': [],
+        'columns': ['value'],
         'primary_keys': [],
         'count': 10000,
         'label_column': None,
@@ -42,6 +43,15 @@ def test_database_page(app_client):
         'hidden': False,
         'fts_table': None,
         'foreign_keys': {'incoming': [], 'outgoing': []}
+    }, {
+        'name': '/group2/multi',
+        'columns': ['value'],
+        'primary_keys': [],
+        'count': 10,
+        'label_column': None,
+        'hidden': False,
+        'fts_table': None,
+        'foreign_keys': {'incoming': [], 'outgoing': []}
     }, {
         'name': '/group2/table2',
         'columns': ['identity', 'idnumber', 'speed'],
@@ -55,7 +65,10 @@ 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]',
+            '_shape': 'objects'
+        }),
         gather_request=False
     )
     data = response.json
@@ -63,16 +76,64 @@ def test_custom_sql(app_client):
         'sql': 'select identity from [/group1/table1]',
         'params': {}
     } == data['query']
-    assert 50 == len(data['rows'])
+    assert 1000 == len(data['rows'])
     assert [
         {'identity': 'This is particle:  0'},
         {'identity': 'This is particle:  1'},
-        {'identity': 'This is particle:  2'}
-    ] == data['rows'][:3]
+        {'identity': 'This is particle:  2'},
+        {'identity': 'This is particle:  3'}
+    ] == data['rows'][:4]
     assert ['identity'] == data['columns']
     assert 'test_tables' == data['database']
     assert data['truncated']
 
+def test_custom_complex_sql(app_client):
+    response = app_client.get(
+        '/test_tables.json?' + urlencode({
+            'sql': 'select identity from [/group1/table1] where speed > 100 and idnumber < 55',
+            '_shape': 'objects'
+        }),
+        gather_request=False
+    )
+    data = response.json
+    assert {
+        '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: 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 not 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 not data['truncated']
+
 def test_invalid_custom_sql(app_client):
     response = app_client.get(
         '/test_tables.json?sql=.schema',
@@ -126,3 +187,72 @@ def test_table_shape_arrays(app_client):
         [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),
+    ('/test_tables/%2Fgroup2%2Fmulti.json?_size=5', 10, 2),
+])
+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