Spaces:
Build error
Build error
| from unittest.mock import AsyncMock, Mock, patch | |
| import httpx | |
| import pytest | |
| from pydantic import SecretStr | |
| from openhands.integrations.github.github_service import GitHubService | |
| from openhands.integrations.service_types import AuthenticationError | |
| async def test_github_service_token_handling(): | |
| # Test initialization with SecretStr token | |
| token = SecretStr('test-token') | |
| service = GitHubService(user_id=None, token=token) | |
| assert service.token == token | |
| assert service.token.get_secret_value() == 'test-token' | |
| # Test headers contain the token correctly | |
| headers = await service._get_github_headers() | |
| assert headers['Authorization'] == 'Bearer test-token' | |
| assert headers['Accept'] == 'application/vnd.github.v3+json' | |
| # Test initialization without token | |
| service = GitHubService(user_id='test-user') | |
| assert service.token == SecretStr('') | |
| async def test_github_service_token_refresh(): | |
| # Test that token refresh is only attempted when refresh=True | |
| token = SecretStr('test-token') | |
| service = GitHubService(user_id=None, token=token) | |
| assert not service.refresh | |
| # Test token expiry detection | |
| assert service._has_token_expired(401) | |
| assert not service._has_token_expired(200) | |
| assert not service._has_token_expired(404) | |
| # Test get_latest_token returns a copy of the current token | |
| latest_token = await service.get_latest_token() | |
| assert isinstance(latest_token, SecretStr) | |
| assert latest_token.get_secret_value() == 'test-token' # Compare with known value | |
| async def test_github_service_fetch_data(): | |
| # Mock httpx.AsyncClient for testing API calls | |
| mock_response = AsyncMock() | |
| mock_response.status_code = 200 | |
| mock_response.json.return_value = {'login': 'test-user'} | |
| mock_response.raise_for_status = Mock() | |
| mock_client = AsyncMock() | |
| mock_client.get.return_value = mock_response | |
| mock_client.__aenter__.return_value = mock_client | |
| mock_client.__aexit__.return_value = None | |
| with patch('httpx.AsyncClient', return_value=mock_client): | |
| service = GitHubService(user_id=None, token=SecretStr('test-token')) | |
| _ = await service._make_request('https://api.github.com/user') | |
| # Verify the request was made with correct headers | |
| mock_client.get.assert_called_once() | |
| call_args = mock_client.get.call_args | |
| headers = call_args[1]['headers'] | |
| assert headers['Authorization'] == 'Bearer test-token' | |
| # Test error handling with 401 status code | |
| mock_response.status_code = 401 | |
| mock_response.raise_for_status.side_effect = httpx.HTTPStatusError( | |
| message='401 Unauthorized', request=Mock(), response=mock_response | |
| ) | |
| # Reset the mock to test error handling | |
| mock_client.get.reset_mock() | |
| mock_client.get.return_value = mock_response | |
| with pytest.raises(AuthenticationError): | |
| _ = await service._make_request('https://api.github.com/user') | |