tests: update test_commands.py

This commit is contained in:
Re-bin 2026-02-14 01:02:58 +00:00
parent 12540ba8cb
commit 3b580fd6c8

View File

@ -1,7 +1,6 @@
import os
import shutil import shutil
from pathlib import Path from pathlib import Path
from unittest.mock import MagicMock, patch from unittest.mock import patch
import pytest import pytest
from typer.testing import CliRunner from typer.testing import CliRunner
@ -13,12 +12,12 @@ runner = CliRunner()
@pytest.fixture @pytest.fixture
def mock_paths(): def mock_paths():
"""Mock configuration and workspace paths for isolation.""" """Mock config/workspace paths for test isolation."""
with patch("nanobot.config.loader.get_config_path") as mock_config_path, \ with patch("nanobot.config.loader.get_config_path") as mock_cp, \
patch("nanobot.config.loader.save_config") as mock_save_config, \ patch("nanobot.config.loader.save_config") as mock_sc, \
patch("nanobot.utils.helpers.get_workspace_path") as mock_ws_path: patch("nanobot.config.loader.load_config") as mock_lc, \
patch("nanobot.utils.helpers.get_workspace_path") as mock_ws:
# Create temporary paths
base_dir = Path("./test_onboard_data") base_dir = Path("./test_onboard_data")
if base_dir.exists(): if base_dir.exists():
shutil.rmtree(base_dir) shutil.rmtree(base_dir)
@ -27,25 +26,18 @@ def mock_paths():
config_file = base_dir / "config.json" config_file = base_dir / "config.json"
workspace_dir = base_dir / "workspace" workspace_dir = base_dir / "workspace"
mock_config_path.return_value = config_file mock_cp.return_value = config_file
mock_ws_path.return_value = workspace_dir mock_ws.return_value = workspace_dir
mock_sc.side_effect = lambda config: config_file.write_text("{}")
# We need save_config to actually write the file for existence checks to work
def side_effect_save_config(config):
with open(config_file, "w") as f:
f.write("{}")
mock_save_config.side_effect = side_effect_save_config
yield config_file, workspace_dir yield config_file, workspace_dir
# Cleanup
if base_dir.exists(): if base_dir.exists():
shutil.rmtree(base_dir) shutil.rmtree(base_dir)
def test_onboard_fresh_install(mock_paths): def test_onboard_fresh_install(mock_paths):
"""Test onboarding with no existing files.""" """No existing config — should create from scratch."""
config_file, workspace_dir = mock_paths config_file, workspace_dir = mock_paths
result = runner.invoke(app, ["onboard"]) result = runner.invoke(app, ["onboard"])
@ -54,81 +46,47 @@ def test_onboard_fresh_install(mock_paths):
assert "Created config" in result.stdout assert "Created config" in result.stdout
assert "Created workspace" in result.stdout assert "Created workspace" in result.stdout
assert "nanobot is ready" in result.stdout assert "nanobot is ready" in result.stdout
assert config_file.exists() assert config_file.exists()
assert workspace_dir.exists()
assert (workspace_dir / "AGENTS.md").exists() assert (workspace_dir / "AGENTS.md").exists()
assert (workspace_dir / "memory" / "MEMORY.md").exists() assert (workspace_dir / "memory" / "MEMORY.md").exists()
def test_onboard_existing_config_no_overwrite(mock_paths): def test_onboard_existing_config_refresh(mock_paths):
"""Test onboarding with existing config, user declines overwrite.""" """Config exists, user declines overwrite — should refresh (load-merge-save)."""
config_file, workspace_dir = mock_paths config_file, workspace_dir = mock_paths
# Pre-create config
config_file.write_text('{"existing": true}') config_file.write_text('{"existing": true}')
# Input "n" for overwrite prompt
result = runner.invoke(app, ["onboard"], input="n\n") result = runner.invoke(app, ["onboard"], input="n\n")
assert result.exit_code == 0 assert result.exit_code == 0
assert "Config already exists" in result.stdout assert "Config already exists" in result.stdout
assert "existing values preserved" in result.stdout
# Verify config was NOT changed
assert '{"existing": true}' in config_file.read_text()
# Verify workspace was still created
assert "Created workspace" in result.stdout
assert workspace_dir.exists() assert workspace_dir.exists()
assert (workspace_dir / "AGENTS.md").exists() assert (workspace_dir / "AGENTS.md").exists()
def test_onboard_existing_config_overwrite(mock_paths): def test_onboard_existing_config_overwrite(mock_paths):
"""Test onboarding with existing config, user checks overwrite.""" """Config exists, user confirms overwrite — should reset to defaults."""
config_file, workspace_dir = mock_paths config_file, workspace_dir = mock_paths
# Pre-create config
config_file.write_text('{"existing": true}') config_file.write_text('{"existing": true}')
# Input "y" for overwrite prompt
result = runner.invoke(app, ["onboard"], input="y\n") result = runner.invoke(app, ["onboard"], input="y\n")
assert result.exit_code == 0 assert result.exit_code == 0
assert "Config already exists" in result.stdout assert "Config already exists" in result.stdout
assert "Created config" in result.stdout assert "Config reset to defaults" in result.stdout
# Verify config WAS changed (our mock writes "{}")
test_content = config_file.read_text()
assert test_content == "{}" or test_content == ""
assert workspace_dir.exists() assert workspace_dir.exists()
def test_onboard_existing_workspace_safe_create(mock_paths): def test_onboard_existing_workspace_safe_create(mock_paths):
"""Test onboarding with existing workspace safely creates templates without prompting.""" """Workspace exists — should not recreate, but still add missing templates."""
config_file, workspace_dir = mock_paths config_file, workspace_dir = mock_paths
# Pre-create workspace
workspace_dir.mkdir(parents=True) workspace_dir.mkdir(parents=True)
# Scenario: Config exists (keep it), Workspace exists (add templates automatically)
config_file.write_text("{}") config_file.write_text("{}")
inputs = "n\n" # No overwrite config result = runner.invoke(app, ["onboard"], input="n\n")
result = runner.invoke(app, ["onboard"], input=inputs)
assert result.exit_code == 0 assert result.exit_code == 0
# Workspace exists message
# Depending on implementation, it might say "Workspace already exists" or just proceed.
# Code in commands.py Line 180: if not workspace.exists(): ...
# It does NOT print "Workspace already exists" if it exists.
# It only prints "Created workspace" if it created it.
assert "Created workspace" not in result.stdout assert "Created workspace" not in result.stdout
# Should NOT prompt for templates
assert "Create missing default templates?" not in result.stdout
# But SHOULD create them (since _create_workspace_templates is called unconditionally)
assert "Created AGENTS.md" in result.stdout assert "Created AGENTS.md" in result.stdout
assert (workspace_dir / "AGENTS.md").exists() assert (workspace_dir / "AGENTS.md").exists()