Files
jellyfin-scene-search/tests/test_meili.py
T
2026-10-06 16:39:24 +01:00

55 lines
1.7 KiB
Python

from __future__ import annotations
import json
import unittest
from unittest.mock import Mock
import numpy as np
from scene_search.meili import Meili
class MeiliVectorSerializationTests(unittest.TestCase):
def test_numpy_float32_vector_is_json_serializable(self) -> None:
vector = np.asarray([0.125, -0.25, 0.5], dtype=np.float32)
converted = Meili._json_vector(vector)
self.assertEqual(converted, [0.125, -0.25, 0.5])
self.assertTrue(all(type(value) is float for value in converted))
json.dumps({"vector": converted}, allow_nan=False)
def test_clear_documents_deletes_all_index_documents(self) -> None:
meili = Meili("http://localhost:7700", "key", "scenes")
response = Mock()
response.ok = True
meili.ensure_index = Mock()
meili.session.delete = Mock(return_value=response)
meili.clear_documents()
meili.ensure_index.assert_called_once()
meili.session.delete.assert_called_once_with(
"http://localhost:7700/indexes/scenes/documents"
)
def test_search_vector_adds_optional_filter(self) -> None:
meili = Meili("http://localhost:7700", "key", "scenes")
response = Mock()
response.ok = True
response.json.return_value = {"hits": []}
meili.session.post = Mock(return_value=response)
meili.search_vector(
[0.1, 0.2],
"query",
filter_expression='source_kind = "jellyfin"',
)
payload = meili.session.post.call_args.kwargs["json"]
self.assertEqual(payload["filter"], 'source_kind = "jellyfin"')
if __name__ == "__main__":
unittest.main()