mirror of
https://github.com/simonw/dclient.git
synced 2026-07-24 09:54:32 +02:00
Replace aliases.json with config.json storing instances with default_database. Instance resolution: -i flag → config default → DATASETTE_URL. Database resolution: -d flag → instance default_database → DATASETTE_DATABASE. Token resolution: --token → auth.json by alias → auth.json by URL → DATASETTE_TOKEN. Add click-default-group dependency for bare SQL shortcut support. Add DCLIENT_CONFIG_DIR env var to override config directory. Rewrite query, insert, get, and actor commands for v2 API where instance is always -i flag. Add upsert command sharing insert implementation. Add databases, tables, schema, plugins commands. Add default_query hidden command for bare SQL shortcut. Add alias default, alias default-db subcommands. Add auth status subcommand. refs #29 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
from click.testing import CliRunner
|
|
from dclient.cli import cli
|
|
import pathlib
|
|
import json
|
|
|
|
|
|
def test_auth(mocker, tmpdir):
|
|
mocker.patch("dclient.cli.get_config_dir", return_value=pathlib.Path(tmpdir))
|
|
runner = CliRunner()
|
|
result = runner.invoke(cli, ["auth", "list"])
|
|
assert result.exit_code == 0
|
|
assert result.output.startswith("Tokens file:")
|
|
# Should only have one line
|
|
assert len([line for line in result.output.split("\n") if line.strip()]) == 1
|
|
|
|
# Now add a token (keys are now alias names or URLs)
|
|
result2 = runner.invoke(cli, ["auth", "add", "prod"], input="xyz\n")
|
|
assert result2.exit_code == 0
|
|
|
|
# Check the tokens file
|
|
auth_file = pathlib.Path(tmpdir) / "auth.json"
|
|
assert json.loads(auth_file.read_text()) == {"prod": "xyz"}
|
|
|
|
# auth list should show that now
|
|
result3 = runner.invoke(cli, ["auth", "list"])
|
|
assert result3.output.startswith("Tokens file:")
|
|
assert "prod" in result3.output
|
|
|
|
# Remove should fail with an incorrect key
|
|
result4 = runner.invoke(cli, ["auth", "remove", "nonexistent"])
|
|
assert result4.exit_code == 1
|
|
assert result4.output == "Error: No such URL or alias\n"
|
|
|
|
# Remove should work with the correct key
|
|
result5 = runner.invoke(cli, ["auth", "remove", "prod"])
|
|
assert result5.exit_code == 0
|
|
assert result5.output == ""
|
|
|
|
# Check the tokens file
|
|
auth_file = pathlib.Path(tmpdir) / "auth.json"
|
|
assert json.loads(auth_file.read_text()) == {}
|