import os import pytest from app import create_app, db from app.config import Config class TestConfig(Config): """Test configuration that overrides the base configuration.""" TESTING = True DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' WTF_CSRF_ENABLED = False LOG_LEVEL = 'DEBUG' # Override required settings for testing SECRET_KEY = 'testing-secret-key-not-used-in-production' MAIL_SUPPRESS_SEND = True RATELIMIT_ENABLED = False # Testing-specific settings RATELIMIT_DEFAULT = "1000 per day;100 per hour;20 per minute" CACHE_TYPE = "SimpleCache" def get_test_config(): """Get test configuration.""" return TestConfig() @pytest.fixture(scope='session') def app(): """Create and configure a Flask app for testing.""" app = create_app('testing') app.config.update(get_test_config()) # Create the database and load test data with app.app_context(): db.create_all() yield app db.session.remove() db.drop_all() @pytest.fixture(scope='session') def client(app): """A test client for the app.""" return app.test_client() @pytest.fixture(scope='session') def runner(app): """A test CLI runner for the app.""" return app.test_cli_runner() @pytest.fixture(scope='function') def test_db(app): """Create a fresh database for each test.""" with app.app_context(): db.create_all() yield db db.session.remove() db.drop_all()