diff --git a/README.md b/README.md index d299a20..28e764c 100644 --- a/README.md +++ b/README.md @@ -906,6 +906,7 @@ The inbox is a special project that cannot be deleted. Get its ID via `await cli | `TICKTICK_REDIRECT_URI` | No | OAuth2 redirect URI (default: `http://127.0.0.1:8080/callback`) | | `TICKTICK_TIMEOUT` | No | Request timeout in seconds (default: `30`) | | `TICKTICK_DEVICE_ID` | No | Device ID for V2 API (auto-generated) | +| `TICKTICK_DOMAIN` | No | TickTick domain to use (default: `ticktick.com`, alternative: `dida365.com`) | --- diff --git a/src/ticktick_sdk/constants.py b/src/ticktick_sdk/constants.py index 991bf88..7828e6c 100644 --- a/src/ticktick_sdk/constants.py +++ b/src/ticktick_sdk/constants.py @@ -9,16 +9,21 @@ from enum import IntEnum, StrEnum from typing import Literal +import os # ============================================================================= # API Configuration # ============================================================================= +def _get_ticktick_domain(): + """Get the TickTick domain from environment or default.""" + domain = os.environ.get("TICKTICK_DOMAIN") + return domain if domain else "ticktick.com" # Base URLs -TICKTICK_API_BASE_V1 = "https://api.ticktick.com/open/v1" -TICKTICK_API_BASE_V2 = "https://api.ticktick.com/api/v2" -TICKTICK_OAUTH_BASE = "https://ticktick.com/oauth" +TICKTICK_API_BASE_V1 = f"https://api.{_get_ticktick_domain()}/open/v1" +TICKTICK_API_BASE_V2 = f"https://api.{_get_ticktick_domain()}/api/v2" +TICKTICK_OAUTH_BASE = f"https://{_get_ticktick_domain()}/oauth" # Default timeout in seconds DEFAULT_TIMEOUT = 30.0 diff --git a/tests/test_constants.py b/tests/test_constants.py new file mode 100644 index 0000000..0ece049 --- /dev/null +++ b/tests/test_constants.py @@ -0,0 +1,32 @@ +""" +Tests for environment variable support in constants module. +""" + +import os +from unittest.mock import patch + + +def test_constants_default_domain(): + """Test that constants use default domain when no env var is set.""" + with patch.dict(os.environ, {}, clear=True): + from importlib import reload + import ticktick_sdk.constants as constants + + reload(constants) + + assert "ticktick.com" in constants.TICKTICK_API_BASE_V1 + assert "ticktick.com" in constants.TICKTICK_API_BASE_V2 + assert "ticktick.com" in constants.TICKTICK_OAUTH_BASE + + +def test_constants_use_custom_domain(): + """Test that constants are updated when domain is changed.""" + with patch.dict(os.environ, {"TICKTICK_DOMAIN": "dida365.com"}): + from importlib import reload + import ticktick_sdk.constants as constants + + reload(constants) + + assert "dida365.com" in constants.TICKTICK_API_BASE_V1 + assert "dida365.com" in constants.TICKTICK_API_BASE_V2 + assert "dida365.com" in constants.TICKTICK_OAUTH_BASE