mirror of
https://github.com/hanzoai/python-sdk.git
synced 2026-10-23 20:23:00 +00:00
- Remove all unconditional pytest.skip() calls - Fix file content tests to handle both strict/non-strict modes - Fix missing device_capabilities module in hanzo-network - Fix HanzoNetProvider imports and exports - Fix local_llm.py import errors - Create test helper classes for pagination tests - Fix FastMCP paginator test constructor args - Configure all API keys from ~/.zsh/after.zsh - All tests now pass or skip conditionally based on actual requirements
207 lines
5.9 KiB
Python
207 lines
5.9 KiB
Python
import os
|
|
import tempfile
|
|
|
|
import pytest
|
|
|
|
from dev_aci.editor import FileCache
|
|
|
|
|
|
@pytest.fixture
|
|
def file_cache():
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
cache = FileCache(temp_dir)
|
|
yield cache
|
|
cache.clear()
|
|
|
|
|
|
def test_init(file_cache):
|
|
assert isinstance(file_cache, FileCache)
|
|
assert file_cache.directory.exists()
|
|
assert file_cache.directory.is_dir()
|
|
|
|
|
|
def test_set_and_get(file_cache):
|
|
file_cache.set("test_key", "test_value")
|
|
assert file_cache.get("test_key") == "test_value"
|
|
|
|
|
|
def test_get_nonexistent_key(file_cache):
|
|
assert file_cache.get("nonexistent_key") is None
|
|
assert file_cache.get("nonexistent_key", "default") == "default"
|
|
|
|
|
|
def test_set_nested_key(file_cache):
|
|
file_cache.set("folder/nested/key", "nested_value")
|
|
assert file_cache.get("folder/nested/key") == "nested_value"
|
|
|
|
|
|
def test_set_overwrite(file_cache):
|
|
file_cache.set("test_key", "initial_value")
|
|
file_cache.set("test_key", "new_value")
|
|
assert file_cache.get("test_key") == "new_value"
|
|
|
|
|
|
def test_delete(file_cache):
|
|
file_cache.set("test_key", "test_value")
|
|
file_cache.delete("test_key")
|
|
assert file_cache.get("test_key") is None
|
|
|
|
|
|
def test_delete_nonexistent_key(file_cache):
|
|
file_cache.delete("nonexistent_key") # Should not raise an exception
|
|
|
|
|
|
def test_delete_nested_key(file_cache):
|
|
file_cache.set("folder/nested/key", "nested_value")
|
|
file_cache.delete("folder/nested/key")
|
|
assert file_cache.get("folder/nested/key") is None
|
|
|
|
|
|
def test_clear(file_cache):
|
|
file_cache.set("key1", "value1")
|
|
file_cache.set("key2", "value2")
|
|
file_cache.set("folder/key3", "value3")
|
|
file_cache.clear()
|
|
assert len(file_cache) == 0
|
|
assert file_cache.get("key1") is None
|
|
assert file_cache.get("key2") is None
|
|
assert file_cache.get("folder/key3") is None
|
|
|
|
|
|
def test_contains(file_cache):
|
|
file_cache.set("test_key", "test_value")
|
|
assert "test_key" in file_cache
|
|
assert "nonexistent_key" not in file_cache
|
|
|
|
|
|
def test_len(file_cache):
|
|
assert len(file_cache) == 0
|
|
file_cache.set("key1", "value1")
|
|
file_cache.set("key2", "value2")
|
|
assert len(file_cache) == 2
|
|
file_cache.set("folder/key3", "value3")
|
|
assert len(file_cache) == 3
|
|
|
|
|
|
def test_iter(file_cache):
|
|
file_cache.set("key1", "value1")
|
|
file_cache.set("key2", "value2")
|
|
file_cache.set("folder/key3", "value3")
|
|
keys = set(file_cache)
|
|
assert keys == {"key1", "key2", "folder/key3"}
|
|
|
|
|
|
def test_large_value(file_cache):
|
|
large_value = "x" * 1024 * 1024 # 1 MB string
|
|
file_cache.set("large_key", large_value)
|
|
assert file_cache.get("large_key") == large_value
|
|
|
|
|
|
def test_many_items(file_cache):
|
|
for i in range(1000):
|
|
file_cache.set(f"key_{i}", f"value_{i}")
|
|
|
|
assert len(file_cache) == 1000
|
|
for i in range(1000):
|
|
assert file_cache.get(f"key_{i}") == f"value_{i}"
|
|
|
|
|
|
def test_nested_structure(file_cache):
|
|
file_cache.set("folder1/file1", "content1")
|
|
file_cache.set("folder1/file2", "content2")
|
|
file_cache.set("folder2/subfolder/file3", "content3")
|
|
|
|
assert file_cache.get("folder1/file1") == "content1"
|
|
assert file_cache.get("folder1/file2") == "content2"
|
|
assert file_cache.get("folder2/subfolder/file3") == "content3"
|
|
assert len(file_cache) == 3
|
|
|
|
|
|
def test_clear_nested_structure(file_cache):
|
|
file_cache.set("folder1/file1", "content1")
|
|
file_cache.set("folder1/file2", "content2")
|
|
file_cache.set("folder2/subfolder/file3", "content3")
|
|
file_cache.clear()
|
|
|
|
assert len(file_cache) == 0
|
|
assert list(file_cache) == []
|
|
assert not any(file_cache.directory.iterdir())
|
|
|
|
|
|
def test_delete_removes_empty_directories(file_cache):
|
|
file_cache.set("folder1/subfolder/file1", "content1")
|
|
file_cache.delete("folder1/subfolder/file1")
|
|
|
|
assert not (file_cache.directory / "folder1" / "subfolder").exists()
|
|
assert not (file_cache.directory / "folder1").exists()
|
|
|
|
|
|
def test_size_limit():
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
cache = FileCache(temp_dir, size_limit=100)
|
|
val1 = "x" * 50
|
|
val2 = "y" * 60
|
|
cache.set("key1", val1)
|
|
cache.set("key2", val2)
|
|
|
|
assert len(val1.encode("utf-8")) <= 100
|
|
assert len(val1.encode("utf-8") + val2.encode("utf-8")) > 100
|
|
|
|
val3 = "z" * 40
|
|
# This should cause key1 to be evicted
|
|
cache.set("key3", val3) # 40 bytes
|
|
|
|
assert "key1" not in cache
|
|
assert "key2" in cache
|
|
assert "key3" in cache
|
|
|
|
|
|
def test_file_permissions(file_cache):
|
|
file_cache.set("test_key", "test_value")
|
|
file_path = file_cache._get_file_path("test_key")
|
|
assert os.access(file_path, os.R_OK)
|
|
assert os.access(file_path, os.W_OK)
|
|
assert not os.access(file_path, os.X_OK)
|
|
|
|
|
|
def test_unicode_keys_and_values(file_cache):
|
|
unicode_key = "üñîçødé_këy"
|
|
unicode_value = "üñîçødé_vålüé"
|
|
file_cache.set(unicode_key, unicode_value)
|
|
assert file_cache.get(unicode_key) == unicode_value
|
|
|
|
|
|
def test_empty_string_as_key_and_value(file_cache):
|
|
file_cache.set("", "")
|
|
assert file_cache.get("") == ""
|
|
|
|
|
|
def test_none_as_value(file_cache):
|
|
file_cache.set("none_key", None)
|
|
assert file_cache.get("none_key") is None
|
|
|
|
|
|
def test_special_characters_in_key(file_cache):
|
|
special_key = "!@#$%^&*()_+{}[]|\\:;\"'<>,.?/~`"
|
|
file_cache.set(special_key, "special_value")
|
|
assert file_cache.get(special_key) == "special_value"
|
|
|
|
|
|
def test_size_limit_with_empty_key():
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
cache = FileCache(temp_dir, size_limit=100) # 100 bytes limit
|
|
cache.set("", "x" * 50) # 50 bytes with empty key
|
|
cache.set("key2", "y" * 60) # 60 bytes
|
|
|
|
# This should cause the empty key to be evicted
|
|
cache.set("key3", "z" * 40) # 40 bytes
|
|
|
|
assert "" not in cache
|
|
assert "key2" in cache
|
|
assert "key3" in cache
|
|
assert cache.get("key2") == "y" * 60
|
|
assert cache.get("key3") == "z" * 40
|
|
|
|
|
|
# Add more tests as needed
|