import unittest
from unittest.mock import patch

import pytest

from pypos.core.base_service import BaseService

# edited by glg
pytestmark = [pytest.mark.unit]


class BaseServiceRetryDelegationTests(unittest.TestCase):
    def test_request_with_retry_delegates_and_maps_arguments(self):
        service = BaseService(http_client=object())
        sentinel = object()

        with patch("pypos.core.base_service._request_with_retry", return_value=sentinel) as mocked:
            result = service.request_with_retry(
                "POST",
                "https://example.com/api",
                retries=2,
                backoff_seconds=0.5,
                timeout=7,
                retry_on=(RuntimeError,),
                params={"q": "1"},
                data={"a": "b"},
                headers={"X-Test": "1"},
                verify=False,
            )

        self.assertIs(result, sentinel)
        mocked.assert_called_once()
        _, kwargs = mocked.call_args
        self.assertEqual(kwargs["max_retry"], 3)
        self.assertEqual(kwargs["backoff_sec"], 0.5)
        self.assertEqual(kwargs["timeout"], 7)
        self.assertEqual(kwargs["params"], {"q": "1"})
        self.assertEqual(kwargs["data"], {"a": "b"})
        self.assertEqual(kwargs["headers"], {"X-Test": "1"})
        self.assertEqual(kwargs["request_kwargs"], {"verify": False})


if __name__ == "__main__":
    unittest.main()
