backend.tests.conftest

 1import os
 2import pytest
 3import datetime
 4from backend.app import create_app
 5from backend.database.models import db as _db, Worker
 6
 7
 8@pytest.fixture(scope="session")
 9def app():
10    """
11    Tworzy instancję aplikacji Flask skonfigurowaną do testów.
12    Używa bazy danych w pamięci (SQLite :memory:).
13    Scope='session' oznacza, że aplikacja jest tworzona raz na całe uruchomienie testów,
14    ale kontekst bazy danych będzie resetowany w innych fixturach.
15    """
16    # Ustawiamy zmienną środowiskową, aby app.py wybrał in-memory DB
17    # Zanim wywołamy create_app()
18    os.environ["FLASK_DB_PATH"] = ":memory:"
19
20    app = create_app()
21
22    app.config.update({
23        "TESTING": True,
24        "DEBUG": False,
25        # Nadpisujemy na wszelki wypadek, choć zmienna ENV wyżej powinna to załatwić
26        "SQLALCHEMY_DATABASE_URI": "sqlite:///:memory:"
27    })
28
29    yield app
30
31    # Sprzątanie po zakończeniu wszystkich testów (opcjonalne dla :memory:)
32    os.environ.pop("FLASK_DB_PATH", None)
33
34
35@pytest.fixture(scope="function")
36def client(app):
37    """
38    Klient testowy do wykonywania zapytań HTTP (GET, POST itp.) do naszej aplikacji.
39    """
40    return app.test_client()
41
42
43@pytest.fixture(scope="function")
44def runner(app):
45    """
46    Runner do testowania komend CLI (jeśli będziesz takie pisał).
47    """
48    return app.test_cli_runner()
49
50
51@pytest.fixture(scope="function")
52def db_session(app):
53    """
54    Fixture, która tworzy czystą bazę danych przed każdym testem
55    i usuwa ją po teście. Zapewnia izolację danych.
56    """
57    with app.app_context():
58        _db.create_all()  # Tworzy tabele (Workers, Entries)
59
60        yield _db  # Tu dzieje się test
61
62        _db.session.remove()
63        _db.drop_all()  # Czyści bazę po teście
64
65
66@pytest.fixture(scope="function")
67def sample_worker_data():
68    """
69    Zwraca słownik z danymi przykładowego pracownika.
70    Przydatne, gdy chcemy utworzyć pracownika ręcznie w teście.
71    """
72    return {
73        "name": "Jan Kowalski",
74        "face_embedding": b'fake_binary_embedding_data_123',  # Symulacja BLOBa
75        "expiration_date": datetime.datetime.now() + datetime.timedelta(days=365),
76        "secret": "super_secret_qr_code_content"
77    }
78
79
80@pytest.fixture(scope="function")
81def created_worker(db_session, sample_worker_data):
82    """
83    Tworzy i zapisuje pracownika w bazie danych.
84    Użyj tej fixtury, jeśli test wymaga, aby pracownik już istniał w bazie.
85    """
86    worker = Worker(
87        name=sample_worker_data["name"],
88        face_embedding=sample_worker_data["face_embedding"],
89        expiration_date=sample_worker_data["expiration_date"],
90        secret=sample_worker_data["secret"]
91    )
92    db_session.session.add(worker)
93    db_session.session.commit()
94
95    return worker
@pytest.fixture(scope='session')
def app():
 9@pytest.fixture(scope="session")
10def app():
11    """
12    Tworzy instancję aplikacji Flask skonfigurowaną do testów.
13    Używa bazy danych w pamięci (SQLite :memory:).
14    Scope='session' oznacza, że aplikacja jest tworzona raz na całe uruchomienie testów,
15    ale kontekst bazy danych będzie resetowany w innych fixturach.
16    """
17    # Ustawiamy zmienną środowiskową, aby app.py wybrał in-memory DB
18    # Zanim wywołamy create_app()
19    os.environ["FLASK_DB_PATH"] = ":memory:"
20
21    app = create_app()
22
23    app.config.update({
24        "TESTING": True,
25        "DEBUG": False,
26        # Nadpisujemy na wszelki wypadek, choć zmienna ENV wyżej powinna to załatwić
27        "SQLALCHEMY_DATABASE_URI": "sqlite:///:memory:"
28    })
29
30    yield app
31
32    # Sprzątanie po zakończeniu wszystkich testów (opcjonalne dla :memory:)
33    os.environ.pop("FLASK_DB_PATH", None)

Tworzy instancję aplikacji Flask skonfigurowaną do testów. Używa bazy danych w pamięci (SQLite :memory:). Scope='session' oznacza, że aplikacja jest tworzona raz na całe uruchomienie testów, ale kontekst bazy danych będzie resetowany w innych fixturach.

@pytest.fixture(scope='function')
def client(app):
36@pytest.fixture(scope="function")
37def client(app):
38    """
39    Klient testowy do wykonywania zapytań HTTP (GET, POST itp.) do naszej aplikacji.
40    """
41    return app.test_client()

Klient testowy do wykonywania zapytań HTTP (GET, POST itp.) do naszej aplikacji.

@pytest.fixture(scope='function')
def runner(app):
44@pytest.fixture(scope="function")
45def runner(app):
46    """
47    Runner do testowania komend CLI (jeśli będziesz takie pisał).
48    """
49    return app.test_cli_runner()

Runner do testowania komend CLI (jeśli będziesz takie pisał).

@pytest.fixture(scope='function')
def db_session(app):
52@pytest.fixture(scope="function")
53def db_session(app):
54    """
55    Fixture, która tworzy czystą bazę danych przed każdym testem
56    i usuwa ją po teście. Zapewnia izolację danych.
57    """
58    with app.app_context():
59        _db.create_all()  # Tworzy tabele (Workers, Entries)
60
61        yield _db  # Tu dzieje się test
62
63        _db.session.remove()
64        _db.drop_all()  # Czyści bazę po teście

Fixture, która tworzy czystą bazę danych przed każdym testem i usuwa ją po teście. Zapewnia izolację danych.

@pytest.fixture(scope='function')
def sample_worker_data():
67@pytest.fixture(scope="function")
68def sample_worker_data():
69    """
70    Zwraca słownik z danymi przykładowego pracownika.
71    Przydatne, gdy chcemy utworzyć pracownika ręcznie w teście.
72    """
73    return {
74        "name": "Jan Kowalski",
75        "face_embedding": b'fake_binary_embedding_data_123',  # Symulacja BLOBa
76        "expiration_date": datetime.datetime.now() + datetime.timedelta(days=365),
77        "secret": "super_secret_qr_code_content"
78    }

Zwraca słownik z danymi przykładowego pracownika. Przydatne, gdy chcemy utworzyć pracownika ręcznie w teście.

@pytest.fixture(scope='function')
def created_worker(db_session, sample_worker_data):
81@pytest.fixture(scope="function")
82def created_worker(db_session, sample_worker_data):
83    """
84    Tworzy i zapisuje pracownika w bazie danych.
85    Użyj tej fixtury, jeśli test wymaga, aby pracownik już istniał w bazie.
86    """
87    worker = Worker(
88        name=sample_worker_data["name"],
89        face_embedding=sample_worker_data["face_embedding"],
90        expiration_date=sample_worker_data["expiration_date"],
91        secret=sample_worker_data["secret"]
92    )
93    db_session.session.add(worker)
94    db_session.session.commit()
95
96    return worker

Tworzy i zapisuje pracownika w bazie danych. Użyj tej fixtury, jeśli test wymaga, aby pracownik już istniał w bazie.