From b204ff56f6e76a9f244a165a55d4e47fe2d260e8 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Mon, 24 Jul 2023 14:52:25 -0700 Subject: [PATCH] First insert test, using a mock - refs #8 --- dclient/cli.py | 13 +++++++++---- tests/test_insert.py | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 tests/test_insert.py diff --git a/dclient/cli.py b/dclient/cli.py index 9046cb9..aebf56d 100644 --- a/dclient/cli.py +++ b/dclient/cli.py @@ -7,6 +7,7 @@ from sqlite_utils.utils import rows_from_file, Format, TypeTracker, progressbar import sys from .utils import token_for_url + def get_config_dir(): return pathlib.Path(click.get_app_dir("io.datasette.dclient")) @@ -182,10 +183,14 @@ def insert( bytes_so_far = 0 for batch in _batches(rows, batch_size): if file_size is not None: - bytes_consumed_so_far = fp.tell() - new_bytes = bytes_consumed_so_far - bytes_so_far - bar.update(new_bytes) - bytes_so_far += new_bytes + try: + bytes_consumed_so_far = fp.tell() + new_bytes = bytes_consumed_so_far - bytes_so_far + bar.update(new_bytes) + bytes_so_far += new_bytes + except ValueError: + # File has likely been closed, so fp.tell() fails + pass types = None if first and not no_detect_types: # Detect types on first batch diff --git a/tests/test_insert.py b/tests/test_insert.py new file mode 100644 index 0000000..8e9b794 --- /dev/null +++ b/tests/test_insert.py @@ -0,0 +1,40 @@ +from click.testing import CliRunner +from dclient.cli import cli +import json +import pathlib + + +def test_insert_mocked(httpx_mock, tmpdir): + httpx_mock.add_response( + json={ + "ok": True, + "database": "data", + "table": "table1", + "table_url": "http://localhost:8012/data/table1", + "table_api_url": "http://localhost:8012/data/table1.json", + "schema": "CREATE TABLE [table1] (...)", + "row_count": 100, + } + ) + (tmpdir / "data.csv") + path = pathlib.Path(tmpdir) / "data.csv" + path.write_text("a,b,c\n1,2,3\n") + runner = CliRunner() + result = runner.invoke( + cli, + [ + "insert", + "https://localhost:8012/data", + "table1", + str(path), + "--csv", + "--token", + "x", + ], + catch_exceptions=False, + ) + assert result.exit_code == 0 + assert result.output == "Inserting rows\n" + request = httpx_mock.get_request() + assert request.headers["authorization"] == "Bearer x" + assert json.loads(request.read()) == {"rows": [{"a": 1, "b": 2, "c": 3}]}