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.