import pytest from unittest.mock import AsyncMock, MagicMock, patch from agent_service.tools.odoo_client import OdooClient, WriteResult @pytest.fixture def odoo(): client = OdooClient(url='http://localhost:8069', db='test', api_key='testkey') return client @pytest.mark.asyncio async def test_search_read_returns_list(odoo): with patch.object(odoo, '_call', new=AsyncMock(return_value=[ {'id': 1, 'name': 'Invoice 1'}, ])): result = await odoo.search_read('account.move', [('state', '=', 'posted')], ['name']) assert isinstance(result, list) assert result[0]['id'] == 1 @pytest.mark.asyncio async def test_write_returns_write_result(odoo): with patch.object(odoo, '_call', new=AsyncMock(return_value=True)), \ patch.object(odoo, 'search_read', new=AsyncMock(return_value=[{'id': 1, 'name': 'test'}])): result = await odoo.write('account.move', [1], {'state': 'posted'}) assert isinstance(result, WriteResult) assert result.success is True @pytest.mark.asyncio async def test_write_result_has_before_after(odoo): before = [{'id': 1, 'amount_residual': 1000.0}] after = [{'id': 1, 'amount_residual': 0.0}] call_count = 0 async def mock_search_read(*args, **kwargs): nonlocal call_count call_count += 1 return before if call_count == 1 else after with patch.object(odoo, '_call', new=AsyncMock(return_value=True)), \ patch.object(odoo, 'search_read', new=mock_search_read): result = await odoo.write('account.move', [1], {'amount_residual': 0}) assert result.before == before[0] assert result.after == after[0] @pytest.mark.asyncio async def test_unlink_logs_warning(odoo, caplog): import logging with patch.object(odoo, '_call', new=AsyncMock(return_value=True)): with caplog.at_level(logging.WARNING): await odoo.unlink('account.move', [99]) assert any('unlink' in r.message.lower() or '99' in r.message for r in caplog.records)