test_app.py•6.84 kB
"""Tests for SpaceX MCP app.py module."""
import pytest
import requests
from unittest.mock import Mock, MagicMock
from app import SpaceXAPI, format_launch_data
@pytest.fixture
def spacex_api():
"""Create a SpaceXAPI instance for testing."""
return SpaceXAPI()
class TestSpaceXAPIInit:
"""Test SpaceXAPI initialization."""
def test_spacex_api_init(self, spacex_api):
"""Verify SpaceXAPI initializes correctly."""
assert isinstance(spacex_api.session, requests.Session)
assert spacex_api.BASE_URL == "https://api.spacexdata.com/v4"
class TestGetLatestLaunch:
"""Test get_latest_launch method."""
def test_get_latest_launch_success(self, spacex_api, mocker):
"""Verify get_latest_launch returns data on success."""
test_data = {"flight_number": 100, "name": "Test Mission", "success": True}
mock_response = Mock()
mock_response.json.return_value = test_data
mock_response.raise_for_status.return_value = None
mock_get = mocker.patch.object(spacex_api.session, 'get', return_value=mock_response)
result = spacex_api.get_latest_launch()
mock_get.assert_called_once_with(
"https://api.spacexdata.com/v4/launches/latest",
timeout=30
)
assert result == test_data
def test_get_latest_launch_failure(self, spacex_api, mocker, capsys):
"""Verify get_latest_launch handles HTTP errors gracefully."""
mock_get = mocker.patch.object(
spacex_api.session,
'get',
side_effect=requests.RequestException("Connection error")
)
result = spacex_api.get_latest_launch()
assert result is None
captured = capsys.readouterr()
assert "API çağrısı başarısız" in captured.err
class TestGetUpcomingLaunches:
"""Test get_upcoming_launches method."""
def test_get_upcoming_launches_success_with_limit(self, spacex_api, mocker):
"""Verify get_upcoming_launches works with custom limit."""
test_data = [
{"flight_number": 101, "name": "Mission 1"},
{"flight_number": 102, "name": "Mission 2"},
{"flight_number": 103, "name": "Mission 3"}
]
mock_response = Mock()
mock_response.json.return_value = test_data
mock_response.raise_for_status.return_value = None
mock_get = mocker.patch.object(spacex_api.session, 'get', return_value=mock_response)
result = spacex_api.get_upcoming_launches(limit=3)
mock_get.assert_called_once_with(
"https://api.spacexdata.com/v4/launches/upcoming",
params={"limit": 3},
timeout=30
)
assert result == test_data
def test_get_upcoming_launches_default_limit(self, spacex_api, mocker):
"""Verify get_upcoming_launches uses default limit of 5."""
mock_response = Mock()
mock_response.json.return_value = []
mock_response.raise_for_status.return_value = None
mock_get = mocker.patch.object(spacex_api.session, 'get', return_value=mock_response)
spacex_api.get_upcoming_launches()
mock_get.assert_called_once_with(
"https://api.spacexdata.com/v4/launches/upcoming",
params={"limit": 5},
timeout=30
)
def test_get_upcoming_launches_failure(self, spacex_api, mocker, capsys):
"""Verify get_upcoming_launches handles errors."""
mock_get = mocker.patch.object(
spacex_api.session,
'get',
side_effect=requests.RequestException("Network error")
)
result = spacex_api.get_upcoming_launches()
assert result is None
captured = capsys.readouterr()
assert "API çağrısı başarısız" in captured.err
class TestGetCompanyInfo:
"""Test get_company_info method."""
def test_get_company_info_success(self, spacex_api, mocker):
"""Verify get_company_info returns data."""
test_data = {
"name": "SpaceX",
"founder": "Elon Musk",
"founded": 2002
}
mock_response = Mock()
mock_response.json.return_value = test_data
mock_response.raise_for_status.return_value = None
mock_get = mocker.patch.object(spacex_api.session, 'get', return_value=mock_response)
result = spacex_api.get_company_info()
mock_get.assert_called_once_with(
"https://api.spacexdata.com/v4/company",
timeout=30
)
assert result == test_data
def test_get_company_info_failure(self, spacex_api, mocker, capsys):
"""Verify get_company_info handles errors."""
mock_get = mocker.patch.object(
spacex_api.session,
'get',
side_effect=requests.RequestException("API error")
)
result = spacex_api.get_company_info()
assert result is None
captured = capsys.readouterr()
assert "API çağrısı başarısız" in captured.err
class TestFormatLaunchData:
"""Test format_launch_data function."""
def test_format_launch_data_with_complete_data(self):
"""Verify format_launch_data formats complete launch data."""
launch_data = {
"flight_number": 200,
"name": "Starship",
"date_utc": "2025-01-15",
"success": True,
"details": "Test flight"
}
result = format_launch_data(launch_data)
assert "🚀 SpaceX Fırlatma Bilgisi" in result
assert "200" in result
assert "Starship" in result
assert "2025-01-15" in result
assert "Başarılı" in result
assert "Test flight" in result
def test_format_launch_data_with_missing_fields(self):
"""Verify format_launch_data handles missing fields."""
launch_data = {}
result = format_launch_data(launch_data)
assert "Bilinmiyor" in result
def test_format_launch_data_with_null_data(self):
"""Verify format_launch_data handles None input."""
result = format_launch_data(None)
assert result == "Fırlatma verisi bulunamadı."
def test_format_launch_data_failed_launch(self):
"""Verify format_launch_data shows failed status."""
launch_data = {
"success": False,
"flight_number": 5,
"name": "Failed",
"date_utc": "2020-01-01"
}
result = format_launch_data(launch_data)
assert "Başarısız" in result