""" Test main mesh processing workflow """ import pytest import os import time from backend.utils.mesh_processor import process_blade_mesh, process_blade_mesh_with_state_updates, ProcessingStep, MeshProcessingResult def test_mesh_processing_simulation(): """Test complete mesh processing workflow in simulation mode""" # Use the real test file from resource directory test_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resource", "blade.step") # Verify test file exists assert os.path.exists(test_file), f"Test file not found: {test_file}" # Track progress updates progress_updates = [] def progress_callback(percentage, message, step): progress_updates.append({ 'percentage': percentage, 'message': message, 'step': step.value }) print(f"Progress: {percentage:.1f}% - {message} ({step.value})") # Process mesh in simulation mode result = process_blade_mesh( file_path=test_file, progress_callback=progress_callback, simulation_mode=True ) # Verify result structure assert isinstance(result, MeshProcessingResult) assert result.started_at is not None assert result.completed_at is not None assert result.total_time > 0 # Verify successful processing assert result.success is True assert result.current_step == ProcessingStep.COMPLETED assert result.progress_percentage == 100.0 assert result.error_message is None # Verify mesh data assert result.element_count > 0 assert result.node_count > 0 assert result.quality_score >= 0.0 assert result.quality_status in ["PASSED", "FAILED"] # Verify step results exist assert result.geometry_result is not None assert result.named_selections_result is not None assert result.mesh_controls_result is not None assert result.mesh_generation_result is not None assert result.quality_check_result is not None # Verify progress tracking assert len(progress_updates) >= 8 # Should have multiple progress updates assert progress_updates[0]['percentage'] <= progress_updates[-1]['percentage'] # Progress should increase assert progress_updates[-1]['percentage'] == 100.0 # Should end at 100% # Verify all major steps were covered steps_covered = [update['step'] for update in progress_updates] expected_steps = [ 'starting_session', 'importing_geometry', 'validating_geometry', 'creating_named_selections', 'applying_mesh_controls', 'generating_mesh', 'checking_quality', 'completed' ] for expected_step in expected_steps: assert expected_step in steps_covered print(f"✓ Mesh processing completed successfully:") print(f" - Total time: {result.total_time:.1f} seconds") print(f" - Elements: {result.element_count}") print(f" - Nodes: {result.node_count}") print(f" - Quality score: {result.quality_score:.1f}") print(f" - Quality status: {result.quality_status}") print(f" - Progress updates: {len(progress_updates)}") print(f" - Warnings: {len(result.warnings)}") def test_mesh_processing_with_state_updates(): """Test mesh processing with state manager integration""" from backend.utils.state_manager import state_manager # Clear any existing state state_manager.clear_session_data() # Use the real test file from resource directory test_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resource", "blade.step") # Verify test file exists assert os.path.exists(test_file), f"Test file not found: {test_file}" # Process mesh with state updates result = process_blade_mesh_with_state_updates( file_path=test_file, simulation_mode=True ) # Verify processing result assert result.success is True assert result.element_count > 0 assert result.node_count > 0 # Verify state manager was updated processing_status = state_manager.get_processing_status() assert processing_status.status == "completed" assert processing_status.progress_percentage == 100.0 assert processing_status.completed_at is not None # Verify mesh result was stored mesh_result = state_manager.get_mesh_result() assert mesh_result is not None assert mesh_result.element_count == result.element_count assert mesh_result.node_count == result.node_count assert mesh_result.quality_score == result.quality_score assert mesh_result.quality_status == result.quality_status print(f"✓ State manager integration test passed:") print(f" - Processing status: {processing_status.status}") print(f" - Mesh elements: {mesh_result.element_count}") print(f" - Mesh nodes: {mesh_result.node_count}") print(f" - Quality score: {mesh_result.quality_score:.1f}") def test_mesh_processing_error_handling(): """Test error handling in mesh processing""" # Test with invalid file path to trigger error invalid_file = "nonexistent_file.step" # Process mesh (should fail gracefully) result = process_blade_mesh( file_path=invalid_file, simulation_mode=True # Still use simulation mode ) # Verify failure handling assert result.success is False assert result.current_step == ProcessingStep.FAILED assert result.error_message is not None assert result.completed_at is not None assert result.total_time >= 0 print(f"✓ Error handling test passed:") print(f" - Failed as expected: {result.error_message}") print(f" - Processing time: {result.total_time:.1f} seconds") def test_processing_steps_enum(): """Test processing steps enumeration""" # Verify all expected steps exist expected_steps = [ 'INITIALIZING', 'STARTING_SESSION', 'IMPORTING_GEOMETRY', 'VALIDATING_GEOMETRY', 'CREATING_NAMED_SELECTIONS', 'APPLYING_MESH_CONTROLS', 'GENERATING_MESH', 'CHECKING_QUALITY', 'FINALIZING', 'COMPLETED', 'FAILED' ] for step_name in expected_steps: assert hasattr(ProcessingStep, step_name) step = getattr(ProcessingStep, step_name) assert isinstance(step.value, str) print(f"✓ Processing steps enum test passed: {len(expected_steps)} steps defined") def test_mesh_processing_result_structure(): """Test MeshProcessingResult data structure""" result = MeshProcessingResult() # Verify initial state assert result.success is False assert result.current_step == ProcessingStep.INITIALIZING assert result.progress_percentage == 0.0 assert result.element_count == 0 assert result.node_count == 0 assert result.quality_score == 0.0 assert result.quality_status == "UNKNOWN" assert isinstance(result.warnings, list) # Verify all result containers exist assert result.geometry_result is None assert result.named_selections_result is None assert result.mesh_controls_result is None assert result.mesh_generation_result is None assert result.quality_check_result is None print("✓ MeshProcessingResult structure test passed") if __name__ == "__main__": print("Testing Main Mesh Processing Workflow...") test_processing_steps_enum() print("✓ Processing steps enum test passed") test_mesh_processing_result_structure() print("✓ Result structure test passed") test_mesh_processing_simulation() print("✓ Simulation processing test passed") test_mesh_processing_with_state_updates() print("✓ State updates test passed") test_mesh_processing_error_handling() print("✓ Error handling test passed") print("\n🎉 All mesh processing workflow tests passed!")