mirror of
https://github.com/simonw/dclient.git
synced 2026-07-24 01:44:32 +02:00
104 lines
3.8 KiB
Python
104 lines
3.8 KiB
Python
"""Tests for v1 → v2 config migration."""
|
|
|
|
from dclient.cli import _migrate_v1_to_v2
|
|
import json
|
|
import pathlib
|
|
|
|
|
|
def test_migration_simple(tmpdir):
|
|
"""Migrate a simple aliases.json with a database-in-URL alias."""
|
|
config_dir = pathlib.Path(tmpdir)
|
|
aliases_file = config_dir / "aliases.json"
|
|
aliases_file.write_text(json.dumps({"content": "https://datasette.io/content"}))
|
|
|
|
_migrate_v1_to_v2(config_dir)
|
|
|
|
config = json.loads((config_dir / "config.json").read_text())
|
|
assert config["instances"]["content"]["url"] == "https://datasette.io"
|
|
assert config["instances"]["content"]["default_database"] == "content"
|
|
assert config["default_instance"] is None
|
|
|
|
# Original should be renamed
|
|
assert (config_dir / "aliases.json.bak").exists()
|
|
assert not (config_dir / "aliases.json").exists()
|
|
|
|
|
|
def test_migration_no_path_segment(tmpdir):
|
|
"""Migrate an alias that has no database in the URL."""
|
|
config_dir = pathlib.Path(tmpdir)
|
|
aliases_file = config_dir / "aliases.json"
|
|
aliases_file.write_text(json.dumps({"local": "http://localhost:8001"}))
|
|
|
|
_migrate_v1_to_v2(config_dir)
|
|
|
|
config = json.loads((config_dir / "config.json").read_text())
|
|
assert config["instances"]["local"]["url"] == "http://localhost:8001"
|
|
assert config["instances"]["local"]["default_database"] is None
|
|
|
|
|
|
def test_migration_with_auth(tmpdir):
|
|
"""Auth keys are migrated from URLs to alias names."""
|
|
config_dir = pathlib.Path(tmpdir)
|
|
aliases_file = config_dir / "aliases.json"
|
|
aliases_file.write_text(json.dumps({"content": "https://datasette.io/content"}))
|
|
auth_file = config_dir / "auth.json"
|
|
auth_file.write_text(json.dumps({"https://datasette.io/content": "tok123"}))
|
|
|
|
_migrate_v1_to_v2(config_dir)
|
|
|
|
new_auths = json.loads((config_dir / "auth.json").read_text())
|
|
assert "content" in new_auths
|
|
assert new_auths["content"] == "tok123"
|
|
|
|
# Old auth should be backed up
|
|
assert (config_dir / "auth.json.bak").exists()
|
|
|
|
|
|
def test_migration_auth_url_fallback(tmpdir):
|
|
"""Auth entries without matching aliases are kept as URL keys."""
|
|
config_dir = pathlib.Path(tmpdir)
|
|
aliases_file = config_dir / "aliases.json"
|
|
aliases_file.write_text(json.dumps({}))
|
|
auth_file = config_dir / "auth.json"
|
|
auth_file.write_text(json.dumps({"https://other.example.com": "tok456"}))
|
|
|
|
_migrate_v1_to_v2(config_dir)
|
|
|
|
new_auths = json.loads((config_dir / "auth.json").read_text())
|
|
assert new_auths["https://other.example.com"] == "tok456"
|
|
|
|
|
|
def test_migration_skips_if_config_exists(tmpdir):
|
|
"""If config.json already exists, migration is skipped."""
|
|
config_dir = pathlib.Path(tmpdir)
|
|
(config_dir / "config.json").write_text(json.dumps({"existing": True}))
|
|
(config_dir / "aliases.json").write_text(json.dumps({"foo": "https://bar.com"}))
|
|
|
|
_migrate_v1_to_v2(config_dir)
|
|
|
|
# config.json should be untouched
|
|
assert json.loads((config_dir / "config.json").read_text()) == {"existing": True}
|
|
# aliases.json should NOT be renamed
|
|
assert (config_dir / "aliases.json").exists()
|
|
|
|
|
|
def test_migration_skips_if_no_aliases(tmpdir):
|
|
"""If aliases.json doesn't exist, migration is skipped."""
|
|
config_dir = pathlib.Path(tmpdir)
|
|
|
|
_migrate_v1_to_v2(config_dir)
|
|
|
|
assert not (config_dir / "config.json").exists()
|
|
|
|
|
|
def test_migration_multi_path_segments(tmpdir):
|
|
"""URL with multiple path segments stores URL as-is."""
|
|
config_dir = pathlib.Path(tmpdir)
|
|
aliases_file = config_dir / "aliases.json"
|
|
aliases_file.write_text(json.dumps({"deep": "https://example.com/a/b/c"}))
|
|
|
|
_migrate_v1_to_v2(config_dir)
|
|
|
|
config = json.loads((config_dir / "config.json").read_text())
|
|
assert config["instances"]["deep"]["url"] == "https://example.com/a/b/c"
|
|
assert config["instances"]["deep"]["default_database"] is None
|