code: def test_permitted_range_not_having_train_features(self):
      (
          X_train,
          y_train,
          X_test,
          y_test,
          _,
      ) = create_binary_classification_dataset()
  
      model = create_lightgbm_classifier(X_train, y_train)
      X_train[TARGET] = y_train
      X_test[TARGET] = y_test
  
      rai_insights = RAIInsights(
          model=model,
          train=X_train,
          test=X_test,
          target_column=TARGET,
          task_type="classification",
      )
  
      message = (
          "Feature names in permitted_range do "
          "not exist in train data: \\['not_a_feature'\\]"
      )
      with pytest.raises(UserConfigValidationException, match=message):
          rai_insights.counterfactual.add(
              total_CFs=10, permitted_range={"not_a_feature": [20, 40]}
          )
  
imports: import logging
  import random
  from unittest.mock import MagicMock
  import numpy
  import pandas
  import pytest
  from lightgbm import LGBMClassifier
  from tests.common_utils import RandomForecastingModel, RandomForecastingModelWithQuantiles, create_iris_data, create_tiny_forecasting_dataset
  from rai_test_utils.datasets.tabular import create_binary_classification_dataset, create_cancer_data, create_housing_data
  from rai_test_utils.models.lightgbm import create_lightgbm_classifier
  from rai_test_utils.models.sklearn import create_sklearn_random_forest_regressor
  from raiutils.exceptions import UserConfigValidationException
  from responsibleai import RAIInsights
  from responsibleai.feature_metadata import FeatureMetadata
  from responsibleai.rai_insights.rai_insights import _MODEL_METHOD_EXCEPTION_MESSAGE
label_desc: Use image node_id 2 for calling the TestCounterfactualUserConfigValidations obj's underlying member method code with example usage: obj.test_permitted_range_not_having_train_features() without return types