From 2b041eef88a386dca3d8555384baa2d7c6558597 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Fri, 1 Aug 2025 19:08:14 +0100 Subject: [PATCH] time: Add tests for local timezone detection and handling in get_local_tz function --- src/time/test/time_server_test.py | 70 ++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/src/time/test/time_server_test.py b/src/time/test/time_server_test.py index 8129fb5b5f..97a6ea1f09 100644 --- a/src/time/test/time_server_test.py +++ b/src/time/test/time_server_test.py @@ -2,8 +2,10 @@ from freezegun import freeze_time from mcp.shared.exceptions import McpError import pytest +from unittest.mock import patch +from zoneinfo import ZoneInfo -from mcp_server_time.server import TimeServer +from mcp_server_time.server import TimeServer, get_local_tz @pytest.mark.parametrize( @@ -458,3 +460,69 @@ def test_convert_time(test_time, source_tz, time_str, target_tz, expected): assert result.source.is_dst == expected["source"]["is_dst"] assert result.target.is_dst == expected["target"]["is_dst"] assert result.time_difference == expected["time_difference"] + + +def test_get_local_tz_with_override(): + """Test that timezone override works correctly.""" + result = get_local_tz("America/New_York") + assert str(result) == "America/New_York" + assert isinstance(result, ZoneInfo) + + +def test_get_local_tz_with_invalid_override(): + """Test that invalid timezone override raises an error.""" + with pytest.raises(Exception): # ZoneInfo will raise an exception + get_local_tz("Invalid/Timezone") + + +@patch('mcp_server_time.server.get_localzone_name') +def test_get_local_tz_with_valid_iana_name(mock_get_localzone): + """Test that valid IANA timezone names from tzlocal work correctly.""" + mock_get_localzone.return_value = "Europe/London" + result = get_local_tz() + assert str(result) == "Europe/London" + assert isinstance(result, ZoneInfo) + + +@patch('mcp_server_time.server.get_localzone_name') +def test_get_local_tz_when_none_returned(mock_get_localzone): + """Test error when tzlocal returns None.""" + mock_get_localzone.return_value = None + with pytest.raises(McpError, match="Could not determine local timezone"): + get_local_tz() + + +@patch('mcp_server_time.server.get_localzone_name') +def test_get_local_tz_handles_windows_timezones(mock_get_localzone): + """Test that tzlocal properly handles Windows timezone names. + + Note: tzlocal should convert Windows names like 'Pacific Standard Time' + to proper IANA names like 'America/Los_Angeles'. + """ + # tzlocal should return IANA names even on Windows + mock_get_localzone.return_value = "America/Los_Angeles" + result = get_local_tz() + assert str(result) == "America/Los_Angeles" + assert isinstance(result, ZoneInfo) + + +@pytest.mark.parametrize( + "timezone_name", + [ + "America/New_York", + "Europe/Paris", + "Asia/Tokyo", + "Australia/Sydney", + "Africa/Cairo", + "America/Sao_Paulo", + "Pacific/Auckland", + "UTC", + ], +) +@patch('mcp_server_time.server.get_localzone_name') +def test_get_local_tz_various_timezones(mock_get_localzone, timezone_name): + """Test various timezone names that tzlocal might return.""" + mock_get_localzone.return_value = timezone_name + result = get_local_tz() + assert str(result) == timezone_name + assert isinstance(result, ZoneInfo)