crawlee-python/tests/unit/sessions/test_models.py

81 lines
2.6 KiB
Python

from __future__ import annotations
from datetime import datetime, timedelta, timezone
import pytest
from crawlee.sessions._cookies import CookieParam
from crawlee.sessions._models import SessionModel
SESSION_CREATED_AT = datetime.now(timezone.utc)
@pytest.fixture
def session_direct() -> SessionModel:
"""Provide a SessionModel instance directly using fixed parameters."""
return SessionModel(
id='test_session',
max_age=timedelta(minutes=30),
user_data={'user_key': 'user_value'},
max_error_score=3.0,
error_score_decrement=0.5,
created_at=SESSION_CREATED_AT,
usage_count=0,
max_usage_count=10,
error_score=0.0,
cookies=[CookieParam({'name': 'cookie_key', 'value': 'cookie_value'})],
blocked_status_codes=[401, 403, 429],
)
@pytest.fixture
def session_args_camel() -> dict:
"""Provide session parameters as dictionary with camel case keys."""
return {
'id': 'test_session',
'maxAge': '00:30:00',
'userData': {'user_key': 'user_value'},
'maxErrorScore': 3.0,
'errorScoreDecrement': 0.5,
'createdAt': SESSION_CREATED_AT,
'usageCount': 0,
'maxUsageCount': 10,
'errorScore': 0.0,
'cookies': [CookieParam({'name': 'cookie_key', 'value': 'cookie_value'})],
'blockedStatusCodes': [401, 403, 429],
}
@pytest.fixture
def session_args_snake() -> dict:
"""Provide session parameters as dictionary with snake case keys."""
return {
'id': 'test_session',
'max_age': '00:30:00',
'user_data': {'user_key': 'user_value'},
'max_error_score': 3.0,
'error_score_decrement': 0.5,
'created_at': SESSION_CREATED_AT,
'usage_count': 0,
'max_usage_count': 10,
'error_score': 0.0,
'cookies': [CookieParam({'name': 'cookie_key', 'value': 'cookie_value'})],
'blocked_status_codes': [401, 403, 429],
}
def test_session_model(
session_direct: SessionModel,
session_args_camel: dict,
session_args_snake: dict,
) -> None:
"""Test equivalence of SessionModel instances created directly and from camelCase, and snake_case kwargs."""
session_camel = SessionModel(**session_args_camel)
session_snake = SessionModel(**session_args_snake)
assert session_direct == session_camel == session_snake
assert session_direct.id == session_camel.id == session_snake.id == 'test_session'
# Check that max_age is correctly parsed into a timedelta object
assert session_direct.max_age == session_camel.max_age == session_snake.max_age == timedelta(minutes=30)