forked from balisujohn/localwriter
-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathtest_venv.py
More file actions
118 lines (92 loc) · 4.78 KB
/
Copy pathtest_venv.py
File metadata and controls
118 lines (92 loc) · 4.78 KB
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
# WriterAgent - AI Writing Assistant for LibreOffice
# Copyright (c) 2026 KeithCu (modifications and relicensing)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
from unittest.mock import MagicMock, patch
from plugin.calc.calc_addin_data import _resolve_python_data
from plugin.calc.python.venv import RunVenvPythonScript
from plugin.framework.tool import ToolContext
def test_resolve_python_data_prefers_data_range():
from plugin.scripting.calc_range import is_calc_range_payload
ctx = MagicMock()
ctx.doc = MagicMock()
with patch("plugin.calc.bridge.CalcBridge") as bridge_cls, patch("plugin.calc.inspector.CellInspector") as insp_cls:
insp = insp_cls.return_value
insp.read_range.return_value = [[{"value": 1}, {"value": 2}]]
py_data, err = _resolve_python_data(ctx, data_range="A1:B1", data=[[99]])
assert err is None
assert is_calc_range_payload(py_data)
assert py_data["data"] == [[1, 2]]
assert py_data["address"] == "A1:B1"
insp.read_range.assert_called_once_with("A1:B1")
def test_resolve_python_data_uses_data_param():
from plugin.scripting.calc_range import is_calc_range_payload
ctx = MagicMock()
py_data, err = _resolve_python_data(ctx, data_range=None, data=[[1, 2]])
assert err is None
assert is_calc_range_payload(py_data)
assert py_data["data"] == [[1, 2]]
@patch("plugin.calc.python.venv.run_code_in_user_venv")
def test_execute_passes_data(mock_run):
from plugin.scripting.calc_range import is_calc_range_payload
mock_run.return_value = {"status": "ok", "result": 1}
tool = RunVenvPythonScript()
ctx = ToolContext(doc=MagicMock(), ctx=MagicMock(), doc_type="calc", services=MagicMock())
packed = {"__wa_payload__": "calc_range", "shape": [1, 1], "data": [[10]]}
with patch("plugin.calc.python.venv.resolve_python_data_on_main_thread", return_value=(packed, None)):
out = tool.execute(ctx, code="result = float(np.sum(data))")
assert out["status"] == "ok"
mock_run.assert_called_once()
assert is_calc_range_payload(mock_run.call_args.kwargs["data"])
assert mock_run.call_args.kwargs["data"] == packed
@patch("plugin.framework.queue_executor.execute_on_main_thread")
@patch("plugin.calc.python.venv.run_code_in_user_venv")
def test_run_venv_python_resolves_calc_data_on_main_thread(mock_run, mock_main_thread):
mock_run.return_value = {"status": "ok", "result": 1}
call_order: list[str] = []
def main_thread(fn, *args, **kwargs):
call_order.append("main")
return fn(*args, **kwargs)
mock_main_thread.side_effect = main_thread
tool = RunVenvPythonScript()
ctx = ToolContext(doc=MagicMock(), ctx=MagicMock(), doc_type="calc", services=MagicMock())
with patch("plugin.calc.calc_addin_data._resolve_python_data", return_value=([42], None)) as mock_resolve:
out = tool.execute(ctx, code="result = data[0]", data_range="A1")
assert out["status"] == "ok"
assert call_order == ["main"]
mock_resolve.assert_called_once()
@patch("plugin.calc.python.venv.run_code_in_user_venv")
def test_execute_writer_ignores_data(mock_run):
mock_run.return_value = {"status": "ok", "result": 0}
tool = RunVenvPythonScript()
ctx = ToolContext(doc=MagicMock(), ctx=MagicMock(), doc_type="writer", services=MagicMock())
with patch("plugin.calc.python.venv.resolve_python_data_on_main_thread") as mock_resolve:
out = tool.execute(ctx, code="result = 1", data=[[1, 2]], data_range="A1:A2")
assert out["status"] == "ok"
mock_resolve.assert_not_called()
assert mock_run.call_args.kwargs["data"] is None
def test_get_parameters_calc_vs_writer():
tool = RunVenvPythonScript()
calc_props = tool.get_parameters("calc")["properties"]
writer_props = tool.get_parameters("writer")["properties"]
assert "data_range" in calc_props
assert "data" in calc_props
assert "data_range" not in writer_props
assert "data" not in writer_props
def test_calc_schema_includes_data_range():
from plugin.framework.tool import ToolRegistry
registry = ToolRegistry(services={})
registry.register(RunVenvPythonScript())
mock_sheet = MagicMock()
def supports(svc):
return svc == "com.sun.star.sheet.SpreadsheetDocument"
mock_sheet.supportsService = supports
schemas = registry.get_schemas("openai", doc=mock_sheet, active_domain="python")
py_schema = next(s for s in schemas if s["function"]["name"] == "run_venv_python_script")
props = py_schema["function"]["parameters"]["properties"]
assert "data_range" in props
assert "data" in props
assert "timeout_sec" not in props