mirror of
https://github.com/simonw/dclient.git
synced 2026-07-23 17:34:32 +02:00
101 lines
3.2 KiB
Python
101 lines
3.2 KiB
Python
from click.testing import CliRunner
|
|
from dclient.cli import cli
|
|
import json
|
|
import pathlib
|
|
|
|
|
|
def test_query_error(httpx_mock):
|
|
httpx_mock.add_response(
|
|
json={
|
|
"ok": False,
|
|
"error": "Statement must be a SELECT",
|
|
"status": 400,
|
|
"title": "Invalid SQL",
|
|
},
|
|
status_code=400,
|
|
)
|
|
runner = CliRunner()
|
|
result = runner.invoke(cli, ["query", "https://example.com", "hello"])
|
|
assert result.exit_code == 1
|
|
assert result.output == "Error: Invalid SQL: Statement must be a SELECT\n"
|
|
|
|
|
|
def test_query(httpx_mock):
|
|
httpx_mock.add_response(
|
|
json={
|
|
"ok": True,
|
|
"database": "fixtures",
|
|
"query_name": None,
|
|
"rows": [{"5 * 2": 10}],
|
|
"truncated": False,
|
|
"columns": ["5 * 2"],
|
|
"query": {"sql": "select 5 * 2", "params": {}},
|
|
"error": None,
|
|
"private": False,
|
|
"allow_execute_sql": True,
|
|
},
|
|
status_code=200,
|
|
)
|
|
runner = CliRunner()
|
|
result = runner.invoke(cli, ["query", "https://example.com", "hello"])
|
|
assert result.exit_code == 0
|
|
assert json.loads(result.output) == [{"5 * 2": 10}]
|
|
|
|
|
|
def test_aliases(mocker, tmpdir, httpx_mock):
|
|
mocker.patch("dclient.cli.get_config_dir", return_value=pathlib.Path(tmpdir))
|
|
runner = CliRunner()
|
|
result = runner.invoke(cli, ["alias", "list"])
|
|
assert result.exit_code == 0
|
|
assert result.output == ""
|
|
|
|
result = runner.invoke(cli, ["alias", "add", "foo", "https://example.com/foo"])
|
|
assert result.exit_code == 0
|
|
assert result.output == ""
|
|
|
|
result = runner.invoke(cli, ["alias", "list"])
|
|
assert result.exit_code == 0
|
|
assert result.output == "foo = https://example.com/foo\n"
|
|
|
|
# --json mode:
|
|
result = runner.invoke(cli, ["alias", "list", "--json"])
|
|
assert result.exit_code == 0
|
|
assert json.loads(result.output) == {"foo": "https://example.com/foo"}
|
|
|
|
# Check the aliases file
|
|
aliases_file = pathlib.Path(tmpdir) / "aliases.json"
|
|
assert json.loads(aliases_file.read_text()) == {"foo": "https://example.com/foo"}
|
|
|
|
# Try a query against that alias
|
|
httpx_mock.add_response(
|
|
json={
|
|
"ok": True,
|
|
"database": "foo",
|
|
"query_name": None,
|
|
"rows": [{"11 * 3": 33}],
|
|
"truncated": False,
|
|
"columns": ["11 * 3"],
|
|
"query": {"sql": "select 11 * 3", "params": {}},
|
|
"error": None,
|
|
"private": False,
|
|
"allow_execute_sql": True,
|
|
},
|
|
status_code=200,
|
|
)
|
|
result = runner.invoke(cli, ["query", "foo", "select 11 * 3"])
|
|
assert result.exit_code == 0
|
|
assert json.loads(result.output) == [{"11 * 3": 33}]
|
|
|
|
# Should have hit https://example.com/foo.json
|
|
url = httpx_mock.get_request().url
|
|
assert url == "https://example.com/foo.json?sql=select+11+%2A+3&_shape=objects"
|
|
|
|
# Remove alias
|
|
result = runner.invoke(cli, ["alias", "remove", "invalid"])
|
|
assert result.exit_code == 1
|
|
assert result.output == "Error: No such alias\n"
|
|
|
|
result = runner.invoke(cli, ["alias", "remove", "foo"])
|
|
assert result.exit_code == 0
|
|
assert result.output == ""
|
|
assert json.loads(aliases_file.read_text()) == {}
|