""" Configuration pytest et fixtures globales pour les tests FabNum. Ce fichier contient les fixtures partagées entre tous les tests. """ import pytest import sys import tempfile import networkx as nx from pathlib import Path # Ajouter le répertoire racine au PYTHONPATH pour les imports ROOT_DIR = Path(__file__).parent.parent sys.path.insert(0, str(ROOT_DIR)) @pytest.fixture(scope="session") def test_data_dir(): """Chemin vers le dossier des données de test.""" return Path(__file__).parent / "fixtures" @pytest.fixture(scope="session") def sample_dot_file(test_data_dir): """Chemin vers le fichier DOT de test.""" return test_data_dir / "sample_graph.dot" @pytest.fixture def temp_log_dir(tmp_path): """Crée un répertoire temporaire pour les logs de test.""" log_dir = tmp_path / "logs" log_dir.mkdir() return log_dir @pytest.fixture def simple_graph(): """ Crée un graphe NetworkX simple pour les tests. Structure: ProduitA (niveau 0) → ComposantB (niveau 1) → MineraiC (niveau 2) """ G = nx.DiGraph() # Produit final G.add_node("ProduitA", niveau=0, label="Produit A") # Composant G.add_node("ComposantB", niveau=1, label="Composant B") # Minerai G.add_node("MineraiC", niveau=2, label="Minerai C", ivc=25) # Opération G.add_node("Fabrication_ComposantB", niveau=10, ihh_pays=30, ihh_acteurs=20) # Pays d'opération G.add_node("Chine_Fabrication_ComposantB", niveau=11) # Pays géographique G.add_node("Chine_geographique", niveau=99, isg=54, label="Chine") # Arêtes G.add_edge("ProduitA", "ComposantB") G.add_edge("ComposantB", "MineraiC", ics=0.5) G.add_edge("ComposantB", "Fabrication_ComposantB") G.add_edge("Fabrication_ComposantB", "Chine_Fabrication_ComposantB") G.add_edge("Chine_Fabrication_ComposantB", "Chine_geographique") return G @pytest.fixture def complex_graph(): """ Crée un graphe plus complexe avec multiples chemins. Structure: ProduitX → ComposantY → MineraiZ1 → MineraiZ2 ProduitX → ComposantW → MineraiZ1 """ G = nx.DiGraph() # Produit final G.add_node("ProduitX", niveau=0, label="Produit X") # Composants G.add_node("ComposantY", niveau=1, label="Composant Y") G.add_node("ComposantW", niveau=1, label="Composant W") # Minerais G.add_node("MineraiZ1", niveau=2, label="Minerai Z1", ivc=60) G.add_node("MineraiZ2", niveau=2, label="Minerai Z2", ivc=15) # Opérations G.add_node("Extraction_MineraiZ1", niveau=10, ihh_pays=70) G.add_node("Reserves_MineraiZ1", niveau=10, ihh_pays=80) # Arêtes G.add_edge("ProduitX", "ComposantY") G.add_edge("ProduitX", "ComposantW") G.add_edge("ComposantY", "MineraiZ1", ics=0.8) G.add_edge("ComposantY", "MineraiZ2", ics=0.3) G.add_edge("ComposantW", "MineraiZ1", ics=0.6) return G @pytest.fixture def sample_config_yaml(tmp_path): """Crée un fichier config.yaml temporaire pour les tests.""" config_content = """ seuils: ISG: vert: max: 40 orange: min: 40 max: 70 rouge: min: 70 IHH: vert: max: 15 orange: min: 15 max: 25 rouge: min: 25 IVC: vert: max: 15 orange: min: 15 max: 60 rouge: min: 60 """ config_file = tmp_path / "config.yaml" config_file.write_text(config_content) return config_file