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

135 lines
4.7 KiB
Python

from __future__ import annotations
import pytest
from crawlee.sessions._cookies import CookieParam, PlaywrightCookieParam, SessionCookies
@pytest.fixture
def cookie_dict() -> CookieParam:
return CookieParam(
{
'name': 'test_cookie',
'value': 'test_value',
'domain': 'example.com',
'path': '/test',
'expires': 1735689600,
'http_only': True,
'secure': True,
'same_site': 'Strict',
}
)
@pytest.fixture
def session_cookies(cookie_dict: CookieParam) -> SessionCookies:
session_cookies = SessionCookies()
session_cookies.set(**cookie_dict)
return session_cookies
def test_set_basic_cookie() -> None:
"""Test setting a basic cookie with minimal attributes."""
session_cookies = SessionCookies()
session_cookies.set('test', 'value')
cookies = list(session_cookies.jar)
assert len(cookies) == 1
cookie = cookies[0]
assert cookie.name == 'test'
assert cookie.value == 'value'
assert cookie.path == '/'
assert not cookie.secure
assert not cookie.has_nonstandard_attr('httpOnpy')
def test_set_cookie_with_all_attributes(session_cookies: SessionCookies, cookie_dict: CookieParam) -> None:
"""Test setting a cookie with all available attributes."""
cookies = list(session_cookies.jar)
assert len(cookies) == 1
cookie = cookies[0]
assert cookie.name == cookie_dict.get('name')
assert cookie.value == cookie_dict.get('value')
assert cookie.path == cookie_dict.get('path')
assert cookie.domain == cookie_dict.get('domain')
assert cookie.expires == cookie_dict.get('expires')
assert cookie.has_nonstandard_attr('HttpOnly')
assert cookie.secure
assert cookie.get_nonstandard_attr('SameSite') == 'Strict'
def test_convert_cookie_to_dict(session_cookies: SessionCookies, cookie_dict: CookieParam) -> None:
"""Test converting Cookie object to dictionary representation."""
cookies = list(session_cookies.jar)
assert len(cookies) == 1
cookie = cookies[0]
converted_cookie_dict = session_cookies._convert_cookie_to_dict(cookie)
assert converted_cookie_dict == cookie_dict
def test_convert_dict_format(session_cookies: SessionCookies) -> None:
"""Test normalizing cookie attributes between internal and browser formats."""
internal_format = CookieParam({'name': 'test', 'value': 'value', 'http_only': True, 'same_site': 'Lax'})
# Test internal to browser format
browser_format = session_cookies._to_playwright(internal_format)
assert 'httpOnly' in browser_format
assert 'sameSite' in browser_format
assert 'http_only' not in browser_format
assert 'same_site' not in browser_format
# Test browser to internal format
browser_format = PlaywrightCookieParam({'name': 'test', 'value': 'value', 'httpOnly': True, 'sameSite': 'Lax'})
internal_format = session_cookies._from_playwright(browser_format)
assert 'http_only' in internal_format
assert 'same_site' in internal_format
assert 'httpOnly' not in internal_format
assert 'sameSite' not in internal_format
def test_get_cookies_as_browser_format(session_cookies: SessionCookies, cookie_dict: CookieParam) -> None:
"""Test getting cookies in browser-compatible format."""
browser_cookies = session_cookies.get_cookies_as_playwright_format()
assert len(browser_cookies) == 1
cookie = browser_cookies[0]
assert 'httpOnly' in cookie
assert 'sameSite' in cookie
assert cookie['httpOnly'] == cookie_dict.get('http_only')
assert cookie['sameSite'] == cookie_dict.get('same_site')
def test_get_cookies_as_dicts(session_cookies: SessionCookies, cookie_dict: CookieParam) -> None:
"""Test get list of dictionary from a SessionCookies."""
test_session_cookies = session_cookies.get_cookies_as_dicts()
assert [cookie_dict] == test_session_cookies
def test_store_cookie(session_cookies: SessionCookies) -> None:
"""Test storing a Cookie object directly."""
test_session_cookies = SessionCookies()
cookies = list(session_cookies.jar)
test_session_cookies.store_cookie(cookies[0])
assert test_session_cookies == session_cookies
def test_store_multidomain_cookies() -> None:
"""Test of storing cookies with the same name for different domains"""
session_cookies = SessionCookies()
session_cookies.set(name='a', value='1', domain='test.io')
session_cookies.set(name='a', value='2', domain='notest.io')
check_cookies = {
item.get('domain'): (item['name'], item['value']) for item in session_cookies.get_cookies_as_dicts()
}
assert len(check_cookies) == 2
assert check_cookies['test.io'] == ('a', '1')
assert check_cookies['notest.io'] == ('a', '2')