diff --git a/tests/test_auth/test_cookie_persistence.py b/tests/test_auth/test_cookie_persistence.py new file mode 100644 index 0000000..5b2f417 --- /dev/null +++ b/tests/test_auth/test_cookie_persistence.py @@ -0,0 +1,136 @@ +"""Tests for Cookie persistence functionality + +Tests CookieManager class for saving and loading cookies from ~/.kb_env file. +""" + +import stat +import pytest +from pathlib import Path + +from kb_workflow.auth.cookie_manager import CookieManager + + +class TestCookieManager: + """Test suite for CookieManager class""" + + def test_save_cookie_creates_file(self, tmp_path: Path): + """Test that saving cookie creates the env file""" + # Arrange + env_file = tmp_path / ".kb_env" + manager = CookieManager(env_path=env_file) + cookie_str = "z_c0=token123; _zap=zap_value" + + # Act + manager.save_cookie(cookie_str) + + # Assert + assert env_file.exists() + content = env_file.read_text(encoding="utf-8") + assert 'ZHIHU_COOKIE="z_c0=token123; _zap=zap_value"' in content + + def test_save_cookie_updates_existing(self, tmp_path: Path): + """Test that saving cookie updates existing ZHIHU_COOKIE line""" + # Arrange + env_file = tmp_path / ".kb_env" + env_file.write_text('ZHIHU_COOKIE="old_cookie"\n', encoding="utf-8") + manager = CookieManager(env_path=env_file) + new_cookie = "z_c0=new_token" + + # Act + manager.save_cookie(new_cookie) + + # Assert + content = env_file.read_text(encoding="utf-8") + assert 'ZHIHU_COOKIE="z_c0=new_token"' in content + assert "old_cookie" not in content + + def test_save_cookie_appends_new(self, tmp_path: Path): + """Test that saving cookie appends new line when ZHIHU_COOKIE doesn't exist""" + # Arrange + env_file = tmp_path / ".kb_env" + env_file.write_text("OTHER_VAR=value\n", encoding="utf-8") + manager = CookieManager(env_path=env_file) + cookie_str = "z_c0=token" + + # Act + manager.save_cookie(cookie_str) + + # Assert + content = env_file.read_text(encoding="utf-8") + assert "OTHER_VAR=value" in content + assert 'ZHIHU_COOKIE="z_c0=token"' in content + + def test_save_cookie_preserves_other_lines(self, tmp_path: Path): + """Test that saving cookie preserves other configuration lines""" + # Arrange + env_file = tmp_path / ".kb_env" + env_file.write_text( + "KB_BASE_PATH=/path/to/kb\nOTHER_VAR=value\n", + encoding="utf-8" + ) + manager = CookieManager(env_path=env_file) + cookie_str = "z_c0=token" + + # Act + manager.save_cookie(cookie_str) + + # Assert + content = env_file.read_text(encoding="utf-8") + assert "KB_BASE_PATH=/path/to/kb" in content + assert "OTHER_VAR=value" in content + assert 'ZHIHU_COOKIE="z_c0=token"' in content + + def test_save_cookie_sets_file_permissions(self, tmp_path: Path): + """Test that saved file has 600 permissions""" + # Arrange + env_file = tmp_path / ".kb_env" + manager = CookieManager(env_path=env_file) + cookie_str = "z_c0=token" + + # Act + manager.save_cookie(cookie_str) + + # Assert + file_stat = env_file.stat() + file_mode = stat.filemode(file_stat.st_mode) + # Check owner read/write only (600) + assert (file_stat.st_mode & 0o777) == 0o600, f"Expected 600, got {oct(file_stat.st_mode & 0o777)}" + + def test_load_cookie_returns_saved(self, tmp_path: Path): + """Test that loading cookie returns previously saved value""" + # Arrange + env_file = tmp_path / ".kb_env" + manager = CookieManager(env_path=env_file) + cookie_str = "z_c0=token123; _zap=zap_value" + + # Act + manager.save_cookie(cookie_str) + loaded = manager.load_cookie() + + # Assert + assert loaded == "z_c0=token123; _zap=zap_value" + + def test_load_cookie_empty_if_not_exists(self, tmp_path: Path): + """Test that loading cookie returns empty string if file doesn't exist""" + # Arrange + env_file = tmp_path / ".kb_env" + manager = CookieManager(env_path=env_file) + + # Act + loaded = manager.load_cookie() + + # Assert + assert loaded == "" + + def test_load_cookie_empty_if_key_not_found(self, tmp_path: Path): + """Test that loading cookie returns empty string if key not in file""" + # Arrange + env_file = tmp_path / ".kb_env" + env_file.write_text("OTHER_VAR=value\n", encoding="utf-8") + manager = CookieManager(env_path=env_file) + + # Act + loaded = manager.load_cookie() + + # Assert + assert loaded == ""