File size: 5,269 Bytes
b4ac377
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.

"""Tests for the openenv fork command."""

from unittest.mock import MagicMock, patch

from openenv.cli.__main__ import app
from typer.testing import CliRunner

runner = CliRunner()


def test_fork_requires_source_space() -> None:
    """Test that fork requires SOURCE_SPACE argument."""
    result = runner.invoke(app, ["fork"])
    assert result.exit_code != 0
    assert "source" in result.output.lower() or "argument" in result.output.lower()


def test_fork_validates_source_space_format() -> None:
    """Test that fork validates source space format (owner/name)."""
    result = runner.invoke(app, ["fork", "invalid-no-slash"])
    assert result.exit_code != 0
    assert "format" in result.output.lower() or "invalid" in result.output.lower()


def test_fork_calls_duplicate_space_with_from_id() -> None:
    """Test that fork calls HfApi.duplicate_space with correct from_id."""
    with (
        patch("openenv.cli.commands.fork.whoami") as mock_whoami,
        patch("openenv.cli.commands.fork.HfApi") as mock_hf_api_class,
    ):
        mock_whoami.return_value = {"name": "testuser"}
        mock_api = MagicMock()
        mock_api.duplicate_space.return_value = (
            "https://huggingface.co/spaces/testuser/source-space"
        )
        mock_hf_api_class.return_value = mock_api

        result = runner.invoke(app, ["fork", "owner/source-space"])

        assert result.exit_code == 0
        mock_api.duplicate_space.assert_called_once()
        call_kwargs = mock_api.duplicate_space.call_args[1]
        assert call_kwargs["from_id"] == "owner/source-space"
        assert call_kwargs["private"] is False
        # HF API requires hardware; default to free cpu-basic when not specified
        assert call_kwargs["hardware"] == "cpu-basic"


def test_fork_passes_private_and_to_id() -> None:
    """Test that fork passes --private and --repo-id to duplicate_space."""
    with (
        patch("openenv.cli.commands.fork.whoami") as mock_whoami,
        patch("openenv.cli.commands.fork.HfApi") as mock_hf_api_class,
    ):
        mock_whoami.return_value = {"name": "testuser"}
        mock_api = MagicMock()
        mock_api.duplicate_space.return_value = (
            "https://huggingface.co/spaces/myuser/my-fork"
        )
        mock_hf_api_class.return_value = mock_api

        result = runner.invoke(
            app,
            ["fork", "owner/source-space", "--private", "--repo-id", "myuser/my-fork"],
        )

        assert result.exit_code == 0
        call_kwargs = mock_api.duplicate_space.call_args[1]
        assert call_kwargs["private"] is True
        assert call_kwargs["to_id"] == "myuser/my-fork"


def test_fork_passes_variables_and_secrets() -> None:
    """Test that fork passes --set-env and --set-secret to duplicate_space."""
    with (
        patch("openenv.cli.commands.fork.whoami") as mock_whoami,
        patch("openenv.cli.commands.fork.HfApi") as mock_hf_api_class,
    ):
        mock_whoami.return_value = {"name": "testuser"}
        mock_api = MagicMock()
        mock_api.duplicate_space.return_value = (
            "https://huggingface.co/spaces/testuser/source-space"
        )
        mock_hf_api_class.return_value = mock_api

        result = runner.invoke(
            app,
            [
                "fork",
                "owner/source-space",
                "--set-env",
                "KEY1=val1",
                "--set-secret",
                "SECRET1=secretval",
            ],
        )

        assert result.exit_code == 0
        call_kwargs = mock_api.duplicate_space.call_args[1]
        assert call_kwargs["variables"] == [{"key": "KEY1", "value": "val1"}]
        assert call_kwargs["secrets"] == [{"key": "SECRET1", "value": "secretval"}]


def test_fork_validates_set_env_format() -> None:
    """Test that fork validates KEY=VALUE format for --set-env."""
    with patch("openenv.cli.commands.fork.whoami") as mock_whoami:
        mock_whoami.return_value = {"name": "testuser"}

        result = runner.invoke(
            app,
            ["fork", "owner/source-space", "--set-env", "no-equals-sign"],
        )

        assert result.exit_code != 0
        assert "KEY=VALUE" in result.output or "format" in result.output.lower()


def test_fork_handles_duplicate_space_error() -> None:
    """Test that fork handles duplicate_space API errors."""
    with (
        patch("openenv.cli.commands.fork.whoami") as mock_whoami,
        patch("openenv.cli.commands.fork.HfApi") as mock_hf_api_class,
    ):
        mock_whoami.return_value = {"name": "testuser"}
        mock_api = MagicMock()
        mock_api.duplicate_space.side_effect = Exception("Space not found")
        mock_hf_api_class.return_value = mock_api

        result = runner.invoke(app, ["fork", "owner/source-space"])

        assert result.exit_code != 0
        assert "fork" in result.output.lower() or "failed" in result.output.lower()