From 32bb22008b5de6081c2d3f53a255bf0894251071 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Tue, 17 Mar 2026 17:59:28 +0800 Subject: [PATCH] test(07-03): add failing tests for cookie validation - 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 --- tests/test_auth/test_cookie_validation.py | 133 ++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 tests/test_auth/test_cookie_validation.py diff --git a/tests/test_auth/test_cookie_validation.py b/tests/test_auth/test_cookie_validation.py new file mode 100644 index 0000000..e2e69a1 --- /dev/null +++ b/tests/test_auth/test_cookie_validation.py @@ -0,0 +1,133 @@ +"""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