import pytest import sys import os import flask from flask_sqlalchemy import SQLAlchemy from flask_login import login_user # Add the project root directory to the Python path sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from app import create_app, db from app.models import User, Folder from app.auth import auth import uuid @pytest.fixture(scope="function") def app(): """Create a fresh app with in-memory database for each test.""" app = create_app('testing') app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False # Recommended for Flask-SQLAlchemy with app.app_context(): db.create_all() # Create tables for your models db.session.begin() yield app # Yield the app for tests to use db.session.close() db.drop_all() # Clean up after tests @pytest.fixture def client(app): """A test client for the app.""" return app.test_client() @pytest.fixture(scope="function") def mock_user(app): """Create a mock user for testing.""" user = User( first_name='Test', last_name='User', email='test@example.com', password_hash='hashed_password' # Will be properly hashed in real tests ) db.session.add(user) db.session.commit() return user @pytest.fixture(scope="function") def authenticated_client(client, mock_user): """Create a test client with authenticated user.""" with client.session_transaction() as sess: sess['_user_id'] = str(mock_user.id) sess['_fresh'] = True return client @pytest.fixture(scope="function") def mock_folder(app, mock_user): """Create a mock folder for testing.""" folder = Folder( user_id=mock_user.id, name='Test Folder', rule_text='Test rule', priority=1 ) db.session.add(folder) db.session.commit() return folder @pytest.fixture(scope="function") def mock_user_with_password(app): """Create a mock user with proper password hashing for testing.""" user = User( first_name='Test', last_name='User', email='test@example.com' ) user.set_password('testpassword') db.session.add(user) db.session.commit() return user