File size: 6,193 Bytes
6a7089a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
"""
Functional tests for plugin command handlers.

Uses mocks so no real PinchTab server is required. Ensures each command
builds correct request and handles response.
"""

import json
from unittest.mock import patch, MagicMock

import pytest

# Import after path fix in conftest
import cli  # noqa: E402


@pytest.fixture
def base_url():
    return "http://localhost:9867"


@pytest.fixture
def token():
    return None


def test_health_success(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {"ok": True}
        result = cli.cmd_health({}, base_url, token)
    assert result["status"] == "success"
    assert "data" in result
    m.assert_called_once()
    call_args = m.call_args
    assert call_args[0][2] == "/health"  # path without instance prefix


def test_health_with_instance_id(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {}
        cli.cmd_health({"instance-id": "inst_abc"}, base_url, token)
    m.assert_called_once()
    assert "/instances/inst_abc/health" in m.call_args[0][2]


def test_navigate_requires_url(base_url, token):
    result = cli.cmd_navigate({}, base_url, token)
    assert result["status"] == "error"
    assert result["error_type"] == "validation_error"


def test_navigate_success(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {}
        result = cli.cmd_navigate({"url": "https://pinchtab.com"}, base_url, token)
    assert result["status"] == "success"
    m.assert_called_once()
    body = m.call_args[1]["body"]
    assert body["url"] == "https://pinchtab.com"


def test_navigate_with_options(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {}
        cli.cmd_navigate({
            "url": "https://pinchtab.com",
            "block-images": True,
            "new-tab": True,
            "timeout": 60,
        }, base_url, token)
    body = m.call_args[1]["body"]
    assert body["blockImages"] is True
    assert body["newTab"] is True
    assert body["timeout"] == 60


def test_snapshot_query_params(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {"nodes": []}
        cli.cmd_snapshot({
            "filter": "interactive",
            "format": "compact",
            "max-tokens": 2000,
        }, base_url, token)
    m.assert_called_once()
    query = m.call_args[1]["query"]
    assert query.get("filter") == "interactive"
    assert query.get("format") == "compact"
    assert query.get("maxTokens") == 2000


def test_action_click(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {}
        result = cli.cmd_action({
            "kind": "click",
            "ref": "e5",
        }, base_url, token)
    assert result["status"] == "success"
    body = m.call_args[1]["body"]
    assert body["kind"] == "click"
    assert body["ref"] == "e5"


def test_action_type(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {}
        cli.cmd_action({"kind": "type", "ref": "e3", "text": "hello"}, base_url, token)
    body = m.call_args[1]["body"]
    assert body["kind"] == "type"
    assert body["text"] == "hello"


def test_action_requires_kind(base_url, token):
    result = cli.cmd_action({"ref": "e5"}, base_url, token)
    assert result["status"] == "error"
    assert result["error_type"] == "validation_error"


def test_instance_stop_requires_instance_id(base_url, token):
    result = cli.cmd_instance_stop({}, base_url, token)
    assert result["status"] == "error"
    assert "instance-id" in result["error"].lower()


def test_instance_stop_success(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {"id": "inst_xyz", "status": "stopped"}
        result = cli.cmd_instance_stop({"instance-id": "inst_xyz"}, base_url, token)
    assert result["status"] == "success"
    m.assert_called_once()
    assert m.call_args[0][2] == "/instances/inst_xyz/stop"


def test_pdf_requires_tab_id(base_url, token):
    result = cli.cmd_pdf({}, base_url, token)
    assert result["status"] == "error"
    assert result["error_type"] == "validation_error"


def test_pdf_success(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {"data": "base64..."}
        result = cli.cmd_pdf({"tab-id": "tab_abc", "instance-id": "inst_1"}, base_url, token)
    assert result["status"] == "success"
    assert m.call_args[0][2] == "/instances/inst_1/tabs/tab_abc/pdf"


def test_instances_list(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = [{"id": "inst_1", "port": "9868"}]
        result = cli.cmd_instances({}, base_url, token)
    assert result["status"] == "success"
    assert "instances" in result
    assert len(result["instances"]) == 1


def test_instance_start_body(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {"id": "inst_new", "status": "starting"}
        cli.cmd_instance_start({
            "profile-id": "prof_123",
            "mode": "headed",
            "port": 9999,
        }, base_url, token)
    body = m.call_args[1]["body"]
    assert body["profileId"] == "prof_123"
    assert body["mode"] == "headed"
    assert body["port"] == "9999"


def test_evaluate_requires_expression(base_url, token):
    result = cli.cmd_evaluate({}, base_url, token)
    assert result["status"] == "error"
    assert result["error_type"] == "validation_error"


def test_evaluate_success(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {"result": "Page title"}
        result = cli.cmd_evaluate({"expression": "document.title"}, base_url, token)
    assert result["status"] == "success"
    body = m.call_args[1]["body"]
    assert body["expression"] == "document.title"


def test_api_error_propagated(base_url, token):
    with patch("cli._api_request") as m:
        m.return_value = {"status": "error", "error": "Connection refused", "error_type": "connection_error"}
        result = cli.cmd_health({}, base_url, token)
    assert result["status"] == "error"
    assert result["error_type"] == "connection_error"