backend.tests.unit.database.test_models

  1import pytest
  2from datetime import datetime
  3from sqlalchemy.exc import IntegrityError
  4from backend.database.models import Worker, Entry
  5
  6
  7def test_create_worker_success(db_session, sample_worker_data):
  8    """
  9    Testuje poprawne utworzenie i zapisanie pracownika (Worker).
 10    """
 11    worker = Worker(
 12        name=sample_worker_data["name"],
 13        face_embedding=sample_worker_data["face_embedding"],
 14        expiration_date=sample_worker_data["expiration_date"],
 15        secret=sample_worker_data["secret"]
 16    )
 17
 18    db_session.session.add(worker)
 19    db_session.session.commit()
 20
 21    assert worker.id is not None
 22    assert worker.name == "Jan Kowalski"
 23    assert worker.secret == "super_secret_qr_code_content"
 24    assert isinstance(worker.face_embedding, bytes)
 25
 26
 27def test_create_worker_missing_fields(db_session):
 28    """
 29    Testuje, czy baza danych rzuca błąd (IntegrityError),
 30    gdy próbujemy zapisać pracownika bez wymaganych pól (nullable=False).
 31    """
 32    # Brak pola 'name' i 'secret'
 33    worker = Worker(
 34        face_embedding=b'some_data',
 35        expiration_date=datetime.now()
 36    )
 37
 38    db_session.session.add(worker)
 39
 40    with pytest.raises(IntegrityError):
 41        db_session.session.commit()
 42
 43
 44def test_create_entry_linked_to_worker(db_session, created_worker):
 45    """
 46    Testuje utworzenie wpisu (Entry) powiązanego z istniejącym pracownikiem.
 47    """
 48    entry = Entry(
 49        worker_id=created_worker.id,
 50        code=200,
 51        message="Access Granted",
 52        face_image=b'snapshot_blob'
 53    )
 54
 55    db_session.session.add(entry)
 56    db_session.session.commit()
 57
 58    assert entry.id is not None
 59    assert entry.worker_id == created_worker.id
 60    assert entry.message == "Access Granted"
 61
 62
 63def test_create_entry_without_worker(db_session):
 64    """
 65    Testuje utworzenie wpisu (Entry) bez powiązania z pracownikiem (worker_id jest nullable).
 66    Np. w przypadku próby wejścia osoby nierozpoznanej.
 67    """
 68    entry = Entry(
 69        worker_id=None,
 70        code=404,
 71        message="User not found",
 72        face_image=b'unknown_face_blob'
 73    )
 74
 75    db_session.session.add(entry)
 76    db_session.session.commit()
 77
 78    assert entry.id is not None
 79    assert entry.worker_id is None
 80
 81
 82def test_entry_default_date(db_session):
 83    """
 84    Testuje, czy pole 'date' w modelu Entry otrzymuje domyślną wartość (server_default),
 85    jeśli nie zostanie podane przy tworzeniu obiektu.
 86    """
 87    entry = Entry(
 88        code=200,
 89        message="Test Date",
 90        worker_id=None
 91    )
 92
 93    db_session.session.add(entry)
 94    db_session.session.commit()
 95
 96    # Po commicie musimy odświeżyć obiekt, aby pobrać wartość wygenerowaną przez serwer bazy danych
 97    db_session.session.refresh(entry)
 98
 99    assert entry.date is not None
100    assert isinstance(entry.date, datetime)
101
102
103def test_entry_missing_required_fields(db_session):
104    """
105    Testuje brak wymaganych pól w modelu Entry (code, message).
106    """
107    entry = Entry(
108        worker_id=None
109        # Brak code i message
110    )
111
112    db_session.session.add(entry)
113
114    with pytest.raises(IntegrityError):
115        db_session.session.commit()
def test_create_worker_success(db_session, sample_worker_data):
 8def test_create_worker_success(db_session, sample_worker_data):
 9    """
10    Testuje poprawne utworzenie i zapisanie pracownika (Worker).
11    """
12    worker = Worker(
13        name=sample_worker_data["name"],
14        face_embedding=sample_worker_data["face_embedding"],
15        expiration_date=sample_worker_data["expiration_date"],
16        secret=sample_worker_data["secret"]
17    )
18
19    db_session.session.add(worker)
20    db_session.session.commit()
21
22    assert worker.id is not None
23    assert worker.name == "Jan Kowalski"
24    assert worker.secret == "super_secret_qr_code_content"
25    assert isinstance(worker.face_embedding, bytes)

Testuje poprawne utworzenie i zapisanie pracownika (Worker).

def test_create_worker_missing_fields(db_session):
28def test_create_worker_missing_fields(db_session):
29    """
30    Testuje, czy baza danych rzuca błąd (IntegrityError),
31    gdy próbujemy zapisać pracownika bez wymaganych pól (nullable=False).
32    """
33    # Brak pola 'name' i 'secret'
34    worker = Worker(
35        face_embedding=b'some_data',
36        expiration_date=datetime.now()
37    )
38
39    db_session.session.add(worker)
40
41    with pytest.raises(IntegrityError):
42        db_session.session.commit()

Testuje, czy baza danych rzuca błąd (IntegrityError), gdy próbujemy zapisać pracownika bez wymaganych pól (nullable=False).

def test_create_entry_linked_to_worker(db_session, created_worker):
45def test_create_entry_linked_to_worker(db_session, created_worker):
46    """
47    Testuje utworzenie wpisu (Entry) powiązanego z istniejącym pracownikiem.
48    """
49    entry = Entry(
50        worker_id=created_worker.id,
51        code=200,
52        message="Access Granted",
53        face_image=b'snapshot_blob'
54    )
55
56    db_session.session.add(entry)
57    db_session.session.commit()
58
59    assert entry.id is not None
60    assert entry.worker_id == created_worker.id
61    assert entry.message == "Access Granted"

Testuje utworzenie wpisu (Entry) powiązanego z istniejącym pracownikiem.

def test_create_entry_without_worker(db_session):
64def test_create_entry_without_worker(db_session):
65    """
66    Testuje utworzenie wpisu (Entry) bez powiązania z pracownikiem (worker_id jest nullable).
67    Np. w przypadku próby wejścia osoby nierozpoznanej.
68    """
69    entry = Entry(
70        worker_id=None,
71        code=404,
72        message="User not found",
73        face_image=b'unknown_face_blob'
74    )
75
76    db_session.session.add(entry)
77    db_session.session.commit()
78
79    assert entry.id is not None
80    assert entry.worker_id is None

Testuje utworzenie wpisu (Entry) bez powiązania z pracownikiem (worker_id jest nullable). Np. w przypadku próby wejścia osoby nierozpoznanej.

def test_entry_default_date(db_session):
 83def test_entry_default_date(db_session):
 84    """
 85    Testuje, czy pole 'date' w modelu Entry otrzymuje domyślną wartość (server_default),
 86    jeśli nie zostanie podane przy tworzeniu obiektu.
 87    """
 88    entry = Entry(
 89        code=200,
 90        message="Test Date",
 91        worker_id=None
 92    )
 93
 94    db_session.session.add(entry)
 95    db_session.session.commit()
 96
 97    # Po commicie musimy odświeżyć obiekt, aby pobrać wartość wygenerowaną przez serwer bazy danych
 98    db_session.session.refresh(entry)
 99
100    assert entry.date is not None
101    assert isinstance(entry.date, datetime)

Testuje, czy pole 'date' w modelu Entry otrzymuje domyślną wartość (server_default), jeśli nie zostanie podane przy tworzeniu obiektu.

def test_entry_missing_required_fields(db_session):
104def test_entry_missing_required_fields(db_session):
105    """
106    Testuje brak wymaganych pól w modelu Entry (code, message).
107    """
108    entry = Entry(
109        worker_id=None
110        # Brak code i message
111    )
112
113    db_session.session.add(entry)
114
115    with pytest.raises(IntegrityError):
116        db_session.session.commit()

Testuje brak wymaganych pól w modelu Entry (code, message).