Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions kbcstorage/tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -508,10 +508,13 @@ def export_raw(self, table_id, limit=None, file_format='rfc',
}
if not isinstance(table_id, str) or table_id == '':
raise ValueError("Invalid table_id '{}'.".format(table_id))
if limit is not None and limit is not isinstance(table_id, int):
raise ValueError("Invalid limit '{}'.".format(limit))
if limit is not None:
if not isinstance(limit, int) or isinstance(limit, bool) or limit < 1:
raise ValueError("Invalid limit '{}'.".format(limit))
params['limit'] = limit
if file_format not in ('rfc', 'escaped', 'raw'):
raise ValueError("Invalid format '{}'.".format(file_format))
params['format'] = file_format
if changed_since is not None:
if not isinstance(changed_since, str):
raise ValueError("Invalid changed_since '{}'.".
Expand Down
44 changes: 44 additions & 0 deletions tests/mocks/test_tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Test basic functionality of the Tables endpoint
"""
import unittest
from urllib.parse import parse_qs

import responses

Expand Down Expand Up @@ -33,3 +34,46 @@ def test_list(self):
)
tables_list = self.tables.list()
assert isinstance(tables_list, list)

@responses.activate
def test_export_raw_sends_limit_and_format(self):
"""
export_raw passes limit and format to the export-async request
"""
responses.add(
responses.Response(
method='POST',
url='https://connection.keboola.com/v2/storage/tables/in.c-bucket.table/export-async',
json={'id': 1, 'status': 'waiting'}
)
)
self.tables.export_raw('in.c-bucket.table', limit=10, file_format='escaped')
request_body = parse_qs(responses.calls[0].request.body, keep_blank_values=True)
assert request_body['limit'] == ['10']
assert request_body['format'] == ['escaped']

@responses.activate
def test_export_raw_omits_limit_when_not_set(self):
"""
export_raw does not send limit when it is None
"""
responses.add(
responses.Response(
method='POST',
url='https://connection.keboola.com/v2/storage/tables/in.c-bucket.table/export-async',
json={'id': 1, 'status': 'waiting'}
)
)
self.tables.export_raw('in.c-bucket.table')
request_body = parse_qs(responses.calls[0].request.body, keep_blank_values=True)
assert 'limit' not in request_body
assert request_body['format'] == ['rfc']

def test_export_raw_rejects_invalid_limit(self):
"""
export_raw raises ValueError for a limit that is not a positive int
"""
for invalid_limit in ('10', 10.5, True, 0, -1):
with self.subTest(limit=invalid_limit):
with self.assertRaises(ValueError):
self.tables.export_raw('in.c-bucket.table', limit=invalid_limit)
Loading