"""Pytest configuration and fixtures""" import os import pytest import tempfile import shutil import yaml from app import create_app from app.models.user import User @pytest.fixture def app(): """Create application for testing""" app = create_app('testing') # Create temporary data directory with app.app_context(): os.makedirs(app.config['DATA_DIR'], exist_ok=True) yield app # Cleanup temporary directory with app.app_context(): if os.path.exists(app.config['DATA_DIR']): shutil.rmtree(app.config['DATA_DIR']) @pytest.fixture def client(app): """Create test client""" return app.test_client() @pytest.fixture def runner(app): """Create test CLI runner""" return app.test_cli_runner() @pytest.fixture def admin_user(app): """Create administrator user for testing""" with app.app_context(): user = User.create( username='admin', email='admin@example.com', password='admin123', role='administrator' ) yield user # Cleanup user.delete() @pytest.fixture def test_product(app): """Create test product for testing""" with app.app_context(): product_dir = os.path.join(app.config['DATA_DIR'], 'products', 'prod_0001') os.makedirs(product_dir, exist_ok=True) # Create product config config = { 'product_id': 'prod_0001', 'name': 'Test Product', 'owner_language': 'en', 'slug': 'test-product', 'submission_url_slug': 'test-product', 'archived': False } config_file = os.path.join(product_dir, 'config.yaml') with open(config_file, 'w') as f: yaml.dump(config, f) yield config # Cleanup handled by app fixture @pytest.fixture def product_owner_user(app, test_product): """Create product owner user for testing""" with app.app_context(): user = User.create( username='owner', email='owner@example.com', password='owner123', role='product_owner', product_ids=['prod_0001'] ) yield user # Cleanup user.delete() @pytest.fixture def authenticated_admin_client(client, admin_user): """Create authenticated admin client""" with client: client.post('/login', data={ 'username': 'admin', 'password': 'admin123' }, follow_redirects=True) yield client @pytest.fixture def authenticated_owner_client(client, product_owner_user): """Create authenticated product owner client""" with client: client.post('/login', data={ 'username': 'owner', 'password': 'owner123' }, follow_redirects=True) yield client