""" Pytest configuration and fixtures for Tablet Management System tests """ import pytest import sqlite3 import os import sys from datetime import datetime # Add project root to path for imports sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @pytest.fixture def test_db_path(): """Path to test database""" return 'test_tablets.db' @pytest.fixture def init_test_db(test_db_path): """Initialize a fresh test database with schema""" # Remove existing test database if it exists if os.path.exists(test_db_path): os.remove(test_db_path) conn = sqlite3.connect(test_db_path) cursor = conn.cursor() # Create tables cursor.execute(''' CREATE TABLE IF NOT EXISTS tablets ( id INTEGER PRIMARY KEY AUTOINCREMENT, brand TEXT NOT NULL, model TEXT NOT NULL, serial_number TEXT UNIQUE NOT NULL, status TEXT DEFAULT 'available', notes TEXT ) ''') cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT, phone TEXT, identification TEXT UNIQUE ) ''') cursor.execute(''' CREATE TABLE IF NOT EXISTS loans ( id INTEGER PRIMARY KEY AUTOINCREMENT, tablet_id INTEGER NOT NULL, user_id INTEGER NOT NULL, loan_date TEXT NOT NULL, return_date TEXT, status TEXT DEFAULT 'active', FOREIGN KEY (tablet_id) REFERENCES tablets (id), FOREIGN KEY (user_id) REFERENCES users (id) ) ''') cursor.execute(''' CREATE TABLE IF NOT EXISTS non_loanable_devices ( id INTEGER PRIMARY KEY AUTOINCREMENT, brand TEXT NOT NULL, model TEXT NOT NULL, serial_number TEXT UNIQUE NOT NULL, device_type TEXT NOT NULL, location TEXT, status TEXT DEFAULT 'available', notes TEXT, purchase_date TEXT, purchase_cost REAL ) ''') conn.commit() conn.close() yield test_db_path # Cleanup: remove test database if os.path.exists(test_db_path): os.remove(test_db_path) @pytest.fixture def db_conn(init_test_db): """Get a database connection to the test database""" conn = sqlite3.connect(init_test_db) conn.row_factory = sqlite3.Row yield conn conn.close() @pytest.fixture def sample_tablets(db_conn): """Insert sample tablets into test database""" cursor = db_conn.cursor() tablets = [ ('Samsung', 'Galaxy Tab S7', 'SN001', 'available'), ('Apple', 'iPad Pro', 'SN002', 'available'), ('Lenovo', 'Tab P11', 'SN003', 'available'), ('Microsoft', 'Surface Pro', 'SN004', 'loaned'), ] for brand, model, serial, status in tablets: cursor.execute(''' INSERT INTO tablets (brand, model, serial_number, status) VALUES (?, ?, ?, ?) ''', (brand, model, serial, status)) db_conn.commit() return tablets @pytest.fixture def sample_users(db_conn): """Insert sample users into test database""" cursor = db_conn.cursor() users = [ ('John Doe', 'john@example.com', '1234567890', 'ID001'), ('Jane Smith', 'jane@example.com', '0987654321', 'ID002'), ('Bob Johnson', 'bob@example.com', '5551234567', 'ID003'), ] for name, email, phone, identification in users: cursor.execute(''' INSERT INTO users (name, email, phone, identification) VALUES (?, ?, ?, ?) ''', (name, email, phone, identification)) db_conn.commit() return users @pytest.fixture def sample_loans(db_conn, sample_tablets, sample_users): """Insert sample loans into test database""" cursor = db_conn.cursor() # Get tablet and user IDs cursor.execute("SELECT id FROM tablets WHERE serial_number = 'SN004'") loaned_tablet = cursor.fetchone() cursor.execute("SELECT id FROM users WHERE identification = 'ID001'") user1 = cursor.fetchone() cursor.execute("SELECT id FROM users WHERE identification = 'ID002'") user2 = cursor.fetchone() if loaned_tablet and user1: # Active loan for SN004 to user1 loan_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S') cursor.execute(''' INSERT INTO loans (tablet_id, user_id, loan_date, status) VALUES (?, ?, ?, 'active') ''', (loaned_tablet['id'], user1['id'], loan_date)) if user2: # Returned loan for SN001 to user2 loan_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S') return_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S') cursor.execute(''' INSERT INTO loans (tablet_id, user_id, loan_date, return_date, status) VALUES (?, ?, ?, ?, 'returned') ''', (1, user2['id'], loan_date, return_date)) db_conn.commit() @pytest.fixture def populated_db(db_conn, sample_tablets, sample_users, sample_loans): """Database with all sample data loaded""" return db_conn