/ aegisvision / tests / test_vectors.py
swadhinbiswas feat: AegisVision v2 — AI enterprise surveillance & monitoring platform · 8/8/2026
7ad9221
60 lines · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""VectorDB multi-embedding semantics: one vector per photo, grouped by person."""

import pytest


def test_add_and_query_single():
    from app.db.vector_db import vector_db

    vector_db.add_face_embedding("EMP1::a.jpg", "EMP1", [1.0, 0.0] * 64, {"name": "Alice"})
    result = vector_db.query_face([1.0, 0.0] * 64)
    assert result["match_id"] == "EMP1"
    assert result["metadata"]["name"] == "Alice"
    assert result["distance"] < 0.01


def test_multiple_photos_do_not_overwrite():
    from app.db.vector_db import vector_db

    vector_db.add_face_embedding("EMP1::a.jpg", "EMP1", [1.0, 0.0] * 64, {"name": "Alice"})
    vector_db.add_face_embedding("EMP1::b.jpg", "EMP1", [0.9, 0.1] * 64, {"name": "Alice"})
    assert vector_db.count_embeddings() == 2

    result = vector_db.query_face([0.9, 0.1] * 64)
    assert result["match_id"] == "EMP1"
    assert result["distance"] < 0.01


def test_delete_person_removes_all_vectors():
    from app.db.vector_db import vector_db

    vector_db.add_face_embedding("EMP1::a.jpg", "EMP1", [1.0, 0.0] * 64, {"name": "Alice"})
    vector_db.add_face_embedding("EMP1::b.jpg", "EMP1", [0.9, 0.1] * 64, {"name": "Alice"})
    vector_db.add_face_embedding("EMP2::a.jpg", "EMP2", [0.0, 1.0] * 64, {"name": "Bob"})

    vector_db.delete_person_embeddings("EMP1")
    assert vector_db.count_embeddings() == 1
    assert vector_db.count_persons() == 1


def test_empty_db_returns_no_match():
    from app.db.vector_db import vector_db

    assert vector_db.count_embeddings() == 0
    result = vector_db.query_face([0.5] * 128)
    assert result["match_id"] is None


def test_rebuilds_collection_when_embedding_dim_changes():
    """Backend swap (dlib 128-d -> insightface 512-d) must not leave the index unusable."""
    from app.db.vector_db import vector_db

    vector_db.add_face_embedding("EMP1::a.jpg", "EMP1", [0.1] * 4, {"name": "Alice"})
    assert vector_db.count_embeddings() == 1

    # Authoring writes vectors with a different dimensionality: dim mismatch is
    # detected on first write of the new shape and the collection is rebuilt.
    vector_db.add_face_embedding("EMP2::a.jpg", "EMP2", [0.2] * 8, {"name": "Bob"})
    assert vector_db.count_embeddings() == 1
    result = vector_db.query_face([0.2] * 8)
    assert result["match_id"] == "EMP2"