punimtag/tests/conftest.py
2025-08-15 00:57:39 -08:00

139 lines
3.2 KiB
Python

"""
PunimTag Test Configuration
Shared fixtures and configuration for all tests.
"""
import pytest
import sqlite3
import tempfile
import os
import sys
from pathlib import Path
# Add src to path for imports
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
from backend.app import app
@pytest.fixture
def test_db():
"""Create a temporary test database."""
db_fd, db_path = tempfile.mkstemp()
# Create test database schema
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Create tables
cursor.execute('''
CREATE TABLE images (
id INTEGER PRIMARY KEY,
filename TEXT NOT NULL,
path TEXT NOT NULL,
date_taken TEXT
)
''')
cursor.execute('''
CREATE TABLE faces (
id INTEGER PRIMARY KEY,
image_id INTEGER,
person_id INTEGER,
encoding BLOB,
left INTEGER,
top INTEGER,
right INTEGER,
bottom INTEGER
)
''')
cursor.execute('''
CREATE TABLE people (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
cursor.execute('''
CREATE TABLE tags (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE
)
''')
cursor.execute('''
CREATE TABLE image_tags (
image_id INTEGER,
tag_id INTEGER,
PRIMARY KEY (image_id, tag_id)
)
''')
conn.commit()
conn.close()
yield db_path
# Cleanup
os.close(db_fd)
os.unlink(db_path)
@pytest.fixture
def client(test_db):
"""Create a test client with test database."""
app.config['TESTING'] = True
app.config['DATABASE_PATH'] = test_db
with app.test_client() as client:
yield client
@pytest.fixture
def sample_photos(test_db):
"""Add sample photos to the test database."""
conn = sqlite3.connect(test_db)
cursor = conn.cursor()
photos = [
('photo1.jpg', '/test/path/photo1.jpg', '2023-01-01'),
('photo2.jpg', '/test/path/photo2.jpg', '2023-01-02'),
('photo3.jpg', '/test/path/photo3.jpg', '2023-01-03')
]
cursor.executemany(
'INSERT INTO images (filename, path, date_taken) VALUES (?, ?, ?)',
photos
)
conn.commit()
conn.close()
return photos
@pytest.fixture
def sample_faces(test_db):
"""Add sample faces to the test database."""
conn = sqlite3.connect(test_db)
cursor = conn.cursor()
# Add a person first
cursor.execute('INSERT INTO people (name) VALUES (?)', ('Test Person',))
person_id = cursor.lastrowid
# Add faces
faces = [
(1, person_id, b'fake_encoding_1', 100, 100, 200, 200),
(2, person_id, b'fake_encoding_2', 150, 150, 250, 250),
(3, None, b'fake_encoding_3', 200, 200, 300, 300), # Unidentified face
]
cursor.executemany(
'INSERT INTO faces (image_id, person_id, encoding, left, top, right, bottom) VALUES (?, ?, ?, ?, ?, ?, ?)',
faces
)
conn.commit()
conn.close()
return faces