182 lines
5.2 KiB
Python
182 lines
5.2 KiB
Python
|
|
"""
|
||
|
|
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
|