import pytest from app.services.vision import has_images from app.services.cache_layer import make_cache_key, compute_embedding, cosine_similarity class TestProxyRouter: def test_has_images_text_only(self): messages = [{"role": "user", "content": "Hello"}] assert has_images(messages) is False def test_has_images_with_image_url(self): messages = [{"role": "user", "content": [{"type": "image_url", "image_url": {"url": "https://example.com/img.jpg"}}]}] assert has_images(messages) is True def test_has_images_with_content_list_text(self): messages = [{"role": "user", "content": [{"type": "text", "text": "describe this"}]}] assert has_images(messages) is False def test_make_cache_key_deterministic(self): messages = [{"role": "user", "content": "hello"}] key1 = make_cache_key("gpt-4", messages) key2 = make_cache_key("gpt-4", messages) assert key1 == key2 def test_make_cache_key_different_model(self): messages = [{"role": "user", "content": "hello"}] key1 = make_cache_key("gpt-4", messages) key2 = make_cache_key("gpt-3.5", messages) assert key1 != key2 def test_compute_embedding(self): emb = compute_embedding("hello world") assert len(emb) == 256 assert all(isinstance(v, float) for v in emb) def test_cosine_similarity_identical(self): emb = compute_embedding("test") sim = cosine_similarity(emb, emb) assert abs(sim - 1.0) < 0.001 def test_cosine_similarity_orthogonal(self): a = [1.0] + [0.0] * 255 b = [0.0] * 256 b[0] = 1.0 sim = cosine_similarity(a, b) assert abs(sim - 1.0) < 0.001 def test_cosine_similarity_different(self): a = compute_embedding("hello world") b = compute_embedding("goodbye universe") assert cosine_similarity(a, b) < 0.99