78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
from typer.testing import CliRunner
|
|
|
|
from reyna_cli.cli import app
|
|
from reyna_cli.remarkable import build_launch_agent, build_sync_agent, data_root, extract_page_ids, parse_udp_message
|
|
|
|
|
|
runner = CliRunner()
|
|
|
|
|
|
def test_parse_udp_message_preserves_paperpro_identity_and_document_change():
|
|
message = (
|
|
"device=paperpro ts=2026-08-03T03:20:00Z ip=192.168.68.136 "
|
|
"event=document_change details=uuid=abc name=Quick_sheets file=abc/page.rm"
|
|
)
|
|
|
|
parsed = parse_udp_message(message)
|
|
|
|
assert parsed["device"] == "paperpro"
|
|
assert parsed["event"] == "document_change"
|
|
assert parsed["ip"] == "192.168.68.136"
|
|
assert parsed["details"] == "uuid=abc name=Quick_sheets file=abc/page.rm"
|
|
|
|
|
|
def test_extract_page_ids_handles_paperpro_cpages_last_opened_shape():
|
|
assert extract_page_ids({"cPages": {"lastOpened": {"value": "current-page"}}}) == ["current-page"]
|
|
|
|
|
|
def test_data_root_honors_environment_override(tmp_path, monkeypatch):
|
|
expected = tmp_path / "paperpro"
|
|
monkeypatch.setenv("REYNA_REMARKABLE_ROOT", str(expected))
|
|
|
|
assert data_root() == expected
|
|
|
|
|
|
def test_launch_agent_runs_reyna_cli_udp_listener_from_configured_root(tmp_path):
|
|
plist = build_launch_agent(
|
|
python_bin=Path("/usr/bin/python3"),
|
|
cli_module="reyna_cli.cli",
|
|
root=tmp_path / "paperpro",
|
|
)
|
|
|
|
serialized = json.dumps(plist)
|
|
assert plist["Label"] == "com.reynafamily.reyna-cli.remarkable-listener"
|
|
assert plist["ProgramArguments"] == [
|
|
"/usr/bin/python3",
|
|
"-m",
|
|
"reyna_cli.cli",
|
|
"remarkable",
|
|
"listen",
|
|
]
|
|
assert plist["KeepAlive"] is True
|
|
assert "REYNA_REMARKABLE_ROOT" in serialized
|
|
|
|
|
|
def test_sync_agent_runs_every_thirty_seconds_with_same_local_root(tmp_path):
|
|
plist = build_sync_agent(
|
|
python_bin=Path("/usr/bin/python3"),
|
|
cli_module="reyna_cli.cli",
|
|
root=tmp_path / "paperpro",
|
|
)
|
|
|
|
assert plist["Label"] == "com.reynafamily.reyna-cli.remarkable-sync"
|
|
assert plist["ProgramArguments"][-2:] == ["remarkable", "sync"]
|
|
assert plist["StartInterval"] == 30
|
|
assert plist["RunAtLoad"] is True
|
|
|
|
|
|
def test_remarkable_cli_exposes_service_management():
|
|
result = runner.invoke(app, ["remarkable", "--help"])
|
|
|
|
assert result.exit_code == 0
|
|
assert "listen" in result.stdout
|
|
assert "service-install" in result.stdout
|
|
assert "service-status" in result.stdout
|