ArchiveBox/archivebox/tests/test_cli_version.py
2026-06-07 20:51:28 -07:00

143 lines
4.8 KiB
Python

#!/usr/bin/env python3
"""
Tests for archivebox version command.
Verify version output and system information reporting.
"""
import os
import re
import tempfile
from pathlib import Path
from archivebox.config.paths import tmp_dir_socket_path_is_short_enough
from archivebox.tests.conftest import run_archivebox_cmd
def _make_deep_collection_dir(tmp_path: Path) -> Path:
deep_dir = tmp_path / "deep-collection"
for idx in range(6):
deep_dir /= f"segment-{idx}-1234567890abcdef"
deep_dir.mkdir(parents=True)
return deep_dir
def _extract_location_path(output: str, key: str) -> Path:
for line in output.splitlines():
if key not in line:
continue
columns = [column for column in re.split(r"\s{2,}", line.strip()) if column]
if len(columns) >= 5 and columns[1] == key:
return Path(os.path.expanduser(columns[-1]))
raise AssertionError(f"Did not find a {key} location line in output:\n{output}")
def test_version_quiet_outputs_version_number(tmp_path):
"""Test that version --quiet outputs just the version number."""
result = run_archivebox_cmd(["version", "--quiet"])
assert result.returncode == 0
version = result.stdout.strip()
assert version
# Version should be semver-ish format (e.g., 0.8.0)
parts = version.split(".")
assert len(parts) >= 2
def test_version_flag_outputs_version_number(tmp_path):
"""Test that top-level --version reports the package version."""
result = run_archivebox_cmd(["--version"])
assert result.returncode == 0
version = result.stdout.strip()
assert version
assert len(version.split(".")) >= 2
def test_version_shows_system_info_in_initialized_dir(tmp_path, initialized_archive):
"""Test that version shows system metadata in initialized directory."""
result = run_archivebox_cmd(["version"])
output = result.stdout
assert "ArchiveBox" in output
# Should show system info
assert any(x in output for x in ["ARCH=", "OS=", "PYTHON="])
def test_version_shows_binaries_after_init(tmp_path, initialized_archive):
"""Test that version shows binary dependencies in initialized directory."""
result = run_archivebox_cmd(["version"])
output = result.stdout
# Should show binary section
assert "Binary" in output or "Dependencies" in output
def test_version_shows_data_locations(tmp_path, initialized_archive):
"""Test that version shows data directory locations."""
result = run_archivebox_cmd(["version"])
output = result.stdout
# Should show paths
assert any(x in output for x in ["Data", "Code", "location"])
def test_version_in_uninitialized_dir_still_works(tmp_path):
"""Test that version command works even without initialized data dir."""
empty_dir = tmp_path / "empty"
empty_dir.mkdir()
result = run_archivebox_cmd(["version", "--quiet"], cwd=empty_dir)
# Should still output version
assert result.returncode == 0
assert len(result.stdout.strip()) > 0
def test_version_auto_selects_short_tmp_dir_for_deep_collection_path(tmp_path):
"""Test the real CLI init/version flow auto-selects a short TMP_DIR outside deep collections."""
data_dir = _make_deep_collection_dir(tmp_path)
default_tmp_dir = data_dir / "tmp"
extra_env = {"ARCHIVEBOX_ALLOW_NO_UNIX_SOCKETS": "true"}
with tempfile.TemporaryDirectory(prefix="abx-home-") as home_tmp:
home_dir = Path(home_tmp)
env = {
"HOME": str(home_dir),
"USE_COLOR": "False",
"SHOW_PROGRESS": "False",
**extra_env,
}
init_result = run_archivebox_cmd(["init", "--quick"], cwd=data_dir, env=env, timeout=180)
assert init_result.returncode == 0, init_result.stdout + init_result.stderr
version_result = run_archivebox_cmd(["version"], cwd=data_dir, env=env, timeout=180)
output = version_result.stdout + version_result.stderr
assert version_result.returncode == 0, output
assert "ArchiveBox" in output
assert "TMP_DIR" in output
assert "Error with configured TMP_DIR" not in output
reported_tmp_dir = _extract_location_path(output, "TMP_DIR")
if not reported_tmp_dir.is_absolute():
reported_tmp_dir = (data_dir / reported_tmp_dir).resolve()
assert reported_tmp_dir.exists()
assert not reported_tmp_dir.is_relative_to(default_tmp_dir)
assert tmp_dir_socket_path_is_short_enough(reported_tmp_dir)
def test_version_help_lists_quiet_flag(tmp_path):
"""Test that version --help documents the quiet output mode."""
result = run_archivebox_cmd(["version", "--help"])
assert result.returncode == 0
assert "--quiet" in result.stdout or "-q" in result.stdout
def test_version_invalid_option_fails(tmp_path):
"""Test that invalid version options fail cleanly."""
result = run_archivebox_cmd(["version", "--invalid-option"])
assert result.returncode != 0