32bb22008b
- Test validate_cookie_valid - valid cookie returns user info - Test validate_cookie_expired - expired cookie returns False - Test validate_cookie_empty - empty cookie returns False - Test validate_cookie_malformed - network error handling - Test validate_cookie_other_status_code - non-200/401 handling Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
134 lines
4.6 KiB
Python
134 lines
4.6 KiB
Python
"""Tests for Cookie validation functionality.
|
|
|
|
Tests the validate_cookie method in ZhihuLogin class.
|
|
"""
|
|
|
|
from unittest.mock import MagicMock, patch, AsyncMock
|
|
import pytest
|
|
|
|
from kb_workflow.auth.zhihu_login import ZhihuLogin, CookieValidationResult
|
|
|
|
|
|
class TestCookieValidation:
|
|
"""Test suite for cookie validation."""
|
|
|
|
@pytest.fixture
|
|
def mock_browser_with_request(self):
|
|
"""Mock browser with request API support."""
|
|
browser = MagicMock()
|
|
browser.browser = MagicMock()
|
|
browser.page = MagicMock()
|
|
|
|
# Create mock response
|
|
mock_response = MagicMock()
|
|
mock_response.status = 200
|
|
mock_response.json = AsyncMock(return_value={
|
|
"id": 12345678,
|
|
"name": "TestUser",
|
|
"url_token": "testuser"
|
|
})
|
|
|
|
# Setup page.request.get to return mock response
|
|
browser.page.request = MagicMock()
|
|
browser.page.request.get = AsyncMock(return_value=mock_response)
|
|
|
|
browser.close = MagicMock()
|
|
browser.start = MagicMock()
|
|
|
|
return browser, mock_response
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_validate_cookie_valid(self, mock_browser_with_request, intermediate_path):
|
|
"""Test 1: validate_cookie_valid - Valid cookie returns valid=True with user info."""
|
|
# Arrange
|
|
mock_browser, _ = mock_browser_with_request
|
|
login = ZhihuLogin(intermediate_path=intermediate_path)
|
|
login.browser = mock_browser
|
|
|
|
# Act
|
|
result = await login.validate_cookie("z_c0=valid_cookie_value")
|
|
|
|
# Assert
|
|
assert isinstance(result, CookieValidationResult)
|
|
assert result.valid is True
|
|
assert result.username == "TestUser"
|
|
assert result.user_id == "12345678"
|
|
assert result.reason is None
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_validate_cookie_expired(self, mock_browser_with_request, intermediate_path):
|
|
"""Test 2: validate_cookie_expired - Expired cookie returns valid=False."""
|
|
# Arrange
|
|
mock_browser, mock_response = mock_browser_with_request
|
|
mock_response.status = 401
|
|
|
|
login = ZhihuLogin(intermediate_path=intermediate_path)
|
|
login.browser = mock_browser
|
|
|
|
# Act
|
|
result = await login.validate_cookie("z_c0=expired_cookie_value")
|
|
|
|
# Assert
|
|
assert isinstance(result, CookieValidationResult)
|
|
assert result.valid is False
|
|
assert result.reason == "Cookie expired"
|
|
assert result.username is None
|
|
assert result.user_id is None
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_validate_cookie_empty(self, intermediate_path):
|
|
"""Test 3: validate_cookie_empty - Empty cookie returns valid=False."""
|
|
# Arrange
|
|
login = ZhihuLogin(intermediate_path=intermediate_path)
|
|
login.browser = MagicMock()
|
|
login.browser.page = None # No page means no cookie loaded
|
|
|
|
# Act
|
|
result = await login.validate_cookie()
|
|
|
|
# Assert
|
|
assert isinstance(result, CookieValidationResult)
|
|
assert result.valid is False
|
|
assert "No cookie" in result.reason
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_validate_cookie_malformed(self, intermediate_path):
|
|
"""Test 4: validate_cookie_malformed - Malformed cookie returns valid=False."""
|
|
# Arrange
|
|
mock_browser = MagicMock()
|
|
mock_browser.browser = MagicMock()
|
|
mock_browser.page = MagicMock()
|
|
mock_browser.page.request = MagicMock()
|
|
mock_browser.page.request.get = AsyncMock(side_effect=Exception("Network error"))
|
|
mock_browser.close = MagicMock()
|
|
mock_browser.start = MagicMock()
|
|
|
|
login = ZhihuLogin(intermediate_path=intermediate_path)
|
|
login.browser = mock_browser
|
|
|
|
# Act
|
|
result = await login.validate_cookie("invalid_format_cookie")
|
|
|
|
# Assert
|
|
assert isinstance(result, CookieValidationResult)
|
|
assert result.valid is False
|
|
assert "Network error" in result.reason
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_validate_cookie_other_status_code(self, mock_browser_with_request, intermediate_path):
|
|
"""Test 5: validate_cookie with non-200/401 status code."""
|
|
# Arrange
|
|
mock_browser, mock_response = mock_browser_with_request
|
|
mock_response.status = 500
|
|
|
|
login = ZhihuLogin(intermediate_path=intermediate_path)
|
|
login.browser = mock_browser
|
|
|
|
# Act
|
|
result = await login.validate_cookie("z_c0=some_cookie")
|
|
|
|
# Assert
|
|
assert isinstance(result, CookieValidationResult)
|
|
assert result.valid is False
|
|
assert "500" in result.reason
|