malvin 0.2.4

Non-interactive research and coding agent
"""Unit tests for ops/fast_task.py (no live agent)."""

from __future__ import annotations

import errno

import fast_task
from click.testing import CliRunner
from toolchain_repos import load_ops_entry


def test_fast_task_self_tests_via_cli() -> None:
    cli = load_ops_entry("fast_task").fast_task_cli
    runner = CliRunner()
    result = runner.invoke(cli, ["self-test"], catch_exceptions=False)
    assert result.exit_code == 0, result.output
    assert "ALL fast_task self-tests OK" in result.output


def test_fast_task_cli_tasks() -> None:
    cli = load_ops_entry("fast_task").fast_task_cli
    runner = CliRunner()
    result = runner.invoke(cli, ["tasks"])
    assert result.exit_code == 0, result.output
    assert "FT-01" in result.output


def test_fast_task_default_results_falls_back_when_read_only(monkeypatch, tmp_path) -> None:
    monkeypatch.setattr(fast_task, "ft_default_results_dir", lambda: tmp_path / "readonly")
    monkeypatch.setattr(fast_task, "REPO_ROOT", tmp_path)
    original_mkdir = fast_task.Path.mkdir

    def deny_default(self, *args, **kwargs):
        if self == (tmp_path / "readonly" / "FT-01"):
            raise OSError(errno.EROFS, "read-only")
        return original_mkdir(self, *args, **kwargs)

    monkeypatch.setattr(fast_task.Path, "mkdir", deny_default)
    run_root = fast_task.ft_run_root("FT-01", None)
    assert run_root.is_dir()
    assert run_root.is_relative_to(tmp_path / ".malvin" / "fast_task_results")


def test_fast_task_kiss_coverage_witnesses() -> None:
    ops = load_ops_entry("fast_task")
    _ = (
        fast_task.ft_default_results_dir,
        fast_task.ft_timestamp_dir,
        fast_task.ft_list_task_ids,
        fast_task.ft_resolve_task_dir,
        fast_task._ft_copy_ignore,
        fast_task.ft_stage_workspace,
        fast_task.ft_ensure_staged_git,
        fast_task.ft_assert_stage_isolated,
        fast_task.ft_resolve_malvin_binary,
        fast_task.ft_resolve_malvin_main_binary,
        fast_task._ft_dry_run_stub_binary,
        fast_task._ft_resolve_host_binary,
        fast_task.ft_resolve_cursor_sdk_bridge_dir,
        fast_task.ft_resolve_node_bin,
        fast_task.ft_resolve_codex_bin,
        fast_task.ft_resolve_codex_package,
        fast_task.ft_resolve_codex_auth_file,
        fast_task.ft_normalize_agent,
        fast_task.ft_malvin_args_request_pi,
        fast_task.ft_malvin_args_request_codex,
        fast_task.ft_malvin_args_request_creative,
        fast_task.ft_assert_creative_compatible,
        fast_task.ft_dockerfile_for_agent,
        fast_task.ft_assert_dockerfile_nonleak,
        fast_task.ft_docker_available,
        fast_task.ft_ensure_agent_image,
        fast_task.ft_cursor_env_args,
        fast_task.ft_run_malvin_logs_dir,
        fast_task.ft_docker_agent_cmd,
        fast_task.ft_assert_agent_cmd_nonleak,
        fast_task.ft_relay_subprocess_stdout,
        fast_task._ft_kill_process_group,
        fast_task.ft_preflight_workspace_mount,
        fast_task.ft_grade_on_host,
        fast_task.ft_print_evaluation_summary,
        fast_task.ft_exit_from_evaluation,
        fast_task.ft_run_solve,
        fast_task.ft_cli_list_tasks,
        fast_task.ft_cli_solve,
        fast_task.ft_cli_self_test,
        ops.fast_task_cli,
        ops.fast_tasks_list_cmd,
        ops.fast_task_solve,
        ops.fast_task_selftest_cmd,
        fast_task.run_fast_task_self_tests,
        fast_task._ft_test_list_and_resolve_tasks,
        fast_task._ft_test_stage_workspace_isolated,
        fast_task._ft_test_dockerfile_nonleak,
        fast_task._ft_test_docker_agent_cmd_nonleak,
        fast_task._ft_test_docker_agent_cmd_cursor,
        fast_task._ft_test_docker_agent_cmd_pi,
        fast_task._ft_test_docker_agent_cmd_codex,
        fast_task._ft_assert_solve_creative_dry_runs,
        fast_task._ft_test_assert_agent_cmd_rejects_task_root,
        fast_task._ft_test_grade_on_host_starter_reward_zero,
        fast_task._ft_test_solve_checks_docker_before_build,
        fast_task._ft_test_solve_help_and_dry_run,
        fast_task._ft_test_solve_main_dry_run,
        fast_task._ft_test_resolve_malvin_binary_prefers_current_repo_build,
        fast_task._ft_test_resolve_malvin_main_binary,
        fast_task._ft_test_resolve_agent_helpers,
        fast_task._ft_relay_stdout_spy,
        fast_task._ft_echo_capture,
        fast_task._ft_test_relay_streams_before_wait,
        fast_task._ft_test_relay_timeout_kills_slow_command,
        fast_task._ft_test_print_evaluation_includes_reward,
        fast_task._ft_test_helpers_and_cli_surface,
        fast_task._ft_test_exit_from_evaluation,
        fast_task._ft_test_ensure_agent_image_dry_run,
        fast_task._ft_test_default_results_dir,
        fast_task.ft_redact_cmd_tokens,
        fast_task.ft_redact_cmd_for_display,
        fast_task._ft_test_redact_cmd_for_display,
        fast_task._ft_test_preflight_requires_host_plan,
        fast_task.DEFAULT_AGENT_TIMEOUT_SEC,
        fast_task.AGENT_TIMEOUT_ENV,
        fast_task.ft_agent_timeout_sec,
        fast_task.TIMEOUT_EXIT_CODE,
        fast_task.AGENT_MALVIN,
        fast_task.AGENT_CURSOR,
        fast_task.AGENT_CHOICES,
        fast_task.EXTERNAL_AGENTS,
        fast_task.CURSOR_AGENT_SHELL,
        fast_task.CURSOR_SDK_BRIDGE_REMOTE,
        fast_task.CURSOR_SDK_BRIDGE_JS_REMOTE,
    )
    assert True