test_data_science.py•2.37 kB
from __future__ import annotations
from datetime import datetime, timedelta, timezone
from unittest.mock import AsyncMock
import pytest
from keboola_mcp_server.clients.data_science import DataScienceClient
@pytest.mark.asyncio
async def test_tail_app_logs_with_lines_calls_get_text_with_lines() -> None:
    client = DataScienceClient.create('https://api.example.com', token=None)
    client.get_text = AsyncMock(return_value='LOGS')  # type: ignore[assignment]
    result = await client.tail_app_logs('app-123', since=None, lines=5)
    assert result == 'LOGS'
    client.get_text.assert_awaited_once_with(endpoint='apps/app-123/logs/tail', params={'lines': 5})
@pytest.mark.asyncio
async def test_tail_app_logs_with_lines_minimum_enforced() -> None:
    client = DataScienceClient.create('https://api.example.com', token=None)
    client.get_text = AsyncMock(return_value='LOGS')  # type: ignore[assignment]
    _ = await client.tail_app_logs('app-123', since=None, lines=0)
    client.get_text.assert_awaited_once_with(endpoint='apps/app-123/logs/tail', params={'lines': 1})
@pytest.mark.asyncio
async def test_tail_app_logs_with_since_calls_get_text_with_since_param() -> None:
    client = DataScienceClient.create('https://api.example.com', token=None)
    client.get_text = AsyncMock(return_value='LOGS')  # type: ignore[assignment]
    since = datetime.now(timezone.utc) - timedelta(days=1)
    result = await client.tail_app_logs('app-xyz', since=since, lines=None)
    assert result == 'LOGS'
    client.get_text.assert_awaited_once_with(
        endpoint='apps/app-xyz/logs/tail', params={'since': since.isoformat(timespec='microseconds')}
    )
@pytest.mark.asyncio
async def test_tail_app_logs_raises_when_both_since_and_lines_provided() -> None:
    client = DataScienceClient.create('https://api.example.com', token=None)
    with pytest.raises(ValueError, match='You cannot use both "since" and "lines"'):
        await client.tail_app_logs('app-123', since=datetime.now(timezone.utc), lines=10)
@pytest.mark.asyncio
async def test_tail_app_logs_raises_when_neither_param_provided() -> None:
    client = DataScienceClient.create('https://api.example.com', token=None)
    with pytest.raises(ValueError, match='Either "since" or "lines" must be provided.'):
        await client.tail_app_logs('app-123', since=None, lines=None)