135 lines
4.7 KiB
Python
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')
|