from typing import TYPE_CHECKING, Any, Dict if TYPE_CHECKING: from models.affected_element import AffectedElement from models.category import Category from models.enhanced_operation import EnhancedOperation from models.generation_strategy import StrategyInfo class ResponsePredictor: @staticmethod def predict( category: "Category", element: "AffectedElement", strategy: "StrategyInfo", operation: "EnhancedOperation", ) -> int: # based on category >> element >> strategy if category.name == "AUTH": return 401 if category.name == "INVALID_PATH_PARAMETERS": return 404 if category.name == "INVALID_QUERY_PARAMETERS": if strategy.name == "INVALID_KEY": if operation.is_element_required(element): return 400 else: return 200 elif strategy.name == "INVALID_TYPE": return 400 elif strategy.name == "FORBIDDEN_403": return 403 if category.name == "INVALID_BODY_PARAMETERS_VALUE": if element.key == "body": return 400 else: if not operation.is_element_required(element) and ( strategy.name == "NULL_VALUE" or ( strategy.name == "BELOW_MIN" and (strategy.value == "" or strategy.value == []) ) ): return 200 else: return 400 if category.name == "INVALID_BODY_PARAMETERS_KEY": if strategy.name == "EXTRA_KEY": return 200 if strategy.name == "MISSING_KEY" or strategy.name == "INVALID_KEY": # element.key != "body" if operation.is_element_required(element): return 400 else: return 200 if category.name == "INVALID_METHOD": if strategy.name == "RANDOM_VALUE": return 405 if strategy.name == "BUSINESS_ENUM": if strategy.value not in operation.available_methods: return 405 else: if ( operation.method.lower() == "get" or operation.method.lower() == "delete" ): return 400 elif ( operation.method.lower() == "post" or operation.method.lower() == "patch" ): return 200 if category.name == "NON_EXISTENT_PATH": return 404 if category.name == "POSITIVE": return 200 # default return 400