diff --git a/server/tests/test_onlyoffice_callback_summary.py b/server/tests/test_onlyoffice_callback_summary.py new file mode 100644 index 0000000..3c685f0 --- /dev/null +++ b/server/tests/test_onlyoffice_callback_summary.py @@ -0,0 +1,78 @@ +import pytest +from unittest.mock import MagicMock, patch +from io import BytesIO +from openpyxl import Workbook +from app.services.agent_assets import AgentAssetService +from app.schemas.agent_asset import AgentAssetOnlyOfficeCallbackWrite + +def test_onlyoffice_callback_generates_summary_note(): + # Setup mock DB and repository + db = MagicMock() + service = AgentAssetService(db) + service.repository = MagicMock() + service.spreadsheet_manager = MagicMock() + service._ensure_ready = MagicMock() + + # Mock asset and metadata + asset = MagicMock() + asset.id = "test-asset" + asset.name = "测试规则" + service._require_spreadsheet_rule = MagicMock(return_value=asset) + service._resolve_working_version = MagicMock(return_value="v1") + + base_meta = MagicMock() + base_meta.file_name = "test.xlsx" + base_meta.storage_key = "old-key" + base_meta.checksum = "old-checksum" + service._resolve_spreadsheet_version_meta = MagicMock(return_value=("v1", base_meta)) + + # Create base workbook + base_wb = Workbook() + base_ws = base_wb.active + base_ws["A1"] = "old value" + + # Mock loading base workbook + service._load_spreadsheet_for_compare = MagicMock(return_value=base_wb) + service.spreadsheet_manager.resolve_storage_path = MagicMock() + + # Create new content (modified) + new_wb = Workbook() + new_ws = new_wb.active + new_ws["A1"] = "new value" # 1 cell changed + new_ws["B2"] = "added" # 1 more cell changed + + # Mock URL open to return new content + new_content_bio = BytesIO() + new_wb.save(new_content_bio) + new_content = new_content_bio.getvalue() + + with patch("app.services.agent_assets.urlopen") as mock_urlopen: + mock_response = MagicMock() + mock_response.read.return_value = new_content + mock_response.__enter__.return_value = mock_response + mock_urlopen.return_value = mock_response + + # Mock upload_rule_spreadsheet + service.upload_rule_spreadsheet = MagicMock() + + # Execute callback handler + payload = { + "status": 2, + "url": "http://onlyoffice/download", + "users": ["test_user"] + } + + service.handle_rule_spreadsheet_onlyoffice_callback( + "test-asset", + version="v1", + payload=payload + ) + + # Verify upload_rule_spreadsheet was called with correct change_note + service.upload_rule_spreadsheet.assert_called_once() + call_args = service.upload_rule_spreadsheet.call_args[1] + assert "涉及 1 个 Sheet,共 2 处改动" in call_args["change_note"] + assert call_args["actor"] == "test_user" + +if __name__ == "__main__": + pytest.main([__file__])