import pytest from unittest.mock import AsyncMock, patch from dolibarr_mcp.config import Config from dolibarr_mcp.dolibarr_client import DolibarrClient @pytest.mark.asyncio class TestInvoiceAtomic: @pytest.fixture def client(self): config = Config( dolibarr_url="https://test.dolibarr.com/api/index.php", api_key="test_key" ) return DolibarrClient(config) @patch('aiohttp.ClientSession.request') async def test_add_invoice_line(self, mock_request, client): mock_response = AsyncMock() mock_response.status = 200 mock_response.text.return_value = '123' # Returns line ID usually mock_request.return_value.__aenter__.return_value = mock_response async with client: await client.add_invoice_line( invoice_id=1, desc="Test Line", qty=1, subprice=100, product_id=99 ) # Verify call args, kwargs = mock_request.call_args assert args[0] == "POST" assert args[1] == "https://test.dolibarr.com/api/index.php/invoices/1/lines" assert kwargs['json'] == { "desc": "Test Line", "qty": 1, "subprice": 100, "fk_product": 99 } @patch('aiohttp.ClientSession.request') async def test_update_invoice_line(self, mock_request, client): mock_response = AsyncMock() mock_response.status = 200 mock_response.text.return_value = '{"success": 1}' mock_request.return_value.__aenter__.return_value = mock_response async with client: await client.update_invoice_line( invoice_id=1, line_id=10, qty=5 ) args, kwargs = mock_request.call_args assert args[0] == "PUT" assert args[1] == "https://test.dolibarr.com/api/index.php/invoices/1/lines/10" assert kwargs['json'] == {"qty": 5} @patch('aiohttp.ClientSession.request') async def test_delete_invoice_line(self, mock_request, client): mock_response = AsyncMock() mock_response.status = 200 mock_response.text.return_value = '{"success": 1}' mock_request.return_value.__aenter__.return_value = mock_response async with client: await client.delete_invoice_line(invoice_id=1, line_id=10) args, kwargs = mock_request.call_args assert args[0] == "DELETE" assert args[1] == "https://test.dolibarr.com/api/index.php/invoices/1/lines/10" @patch('aiohttp.ClientSession.request') async def test_validate_invoice(self, mock_request, client): mock_response = AsyncMock() mock_response.status = 200 mock_response.text.return_value = '{"success": 1}' mock_request.return_value.__aenter__.return_value = mock_response async with client: await client.validate_invoice(invoice_id=1, warehouse_id=5) args, kwargs = mock_request.call_args assert args[0] == "POST" assert args[1] == "https://test.dolibarr.com/api/index.php/invoices/1/validate" assert kwargs['json'] == {"idwarehouse": 5, "not_trigger": 0}