SIENTIAPDE-1430: Add comprehensive tests for TrainModelParams.validate_business_rules to improve coverage.
This commit is contained in:
@@ -377,3 +377,190 @@ def test_validate_business_rules_empty_limits(valid_train_params_dict):
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
params.validate_business_rules() # Should not raise
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# Additional tests for 100% coverage
|
||||
# ============================================================================
|
||||
|
||||
|
||||
def test_validate_business_rules_degree_less_than_1(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error when degree < 1."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['degree'] = 0
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='degree must be at least 1, got 0'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_invalid_nan_treatment(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error for invalid nan_treatment."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['nan_treatment'] = 'invalid_treatment'
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='nan_treatment must be one of'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_invalid_scaler_name(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error for invalid scaler_name."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['scaler_name'] = 'Invalid Scaler'
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='scaler_name must be one of'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_invalid_model_name(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error for invalid model_name."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['model_name'] = 'Invalid Model'
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='model_name must be one of'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_polynomial_regression_degree_less_than_2(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error for Polynomial Regression with degree < 2."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['model_name'] = 'Polynomial Regression'
|
||||
valid_train_params_dict['degree'] = 1
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='degree must be at least 2 for Polynomial Regression'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_polynomial_regression_without_scaler(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error for Polynomial Regression without scaler."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['model_name'] = 'Polynomial Regression'
|
||||
valid_train_params_dict['degree'] = 2
|
||||
valid_train_params_dict['scaler_name'] = 'None'
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='scaler_name must be set'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_linear_regression_degree_not_1(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error for Linear Regression with degree != 1."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['model_name'] = 'Linear Regression'
|
||||
valid_train_params_dict['degree'] = 2
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='degree must be 1 for Linear Regression, got 2'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_removed_intervals_not_list(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error when removed_intervals item is not list."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['removed_intervals'] = ['not_a_list']
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='removed_intervals\\[0\\] must be a list or tuple'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_removed_intervals_too_short(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error when removed_intervals item has < 2 elements."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['removed_intervals'] = [['only_one_element']]
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='removed_intervals\\[0\\] must have at least 2 elements'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_start_date_wrong_type(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error when start_date is not a string."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
# Create params normally first, then modify start_date to bypass from_dict validation
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
params.start_date = 12345 # type: ignore
|
||||
|
||||
with pytest.raises(TypeError, match='start_date must be a string, got int'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_end_date_wrong_type(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error when end_date is not a string."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
# Create params normally first, then modify end_date to bypass from_dict validation
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
params.end_date = 12345 # type: ignore
|
||||
|
||||
with pytest.raises(TypeError, match='end_date must be a string, got int'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_empty_target_variable(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error when target_variable is empty."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['target_variable'] = ''
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='target_variable cannot be empty or whitespace'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_whitespace_target_variable(valid_train_params_dict):
|
||||
"""Test validate_business_rules raises error when target_variable is whitespace."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['target_variable'] = ' '
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
with pytest.raises(ValueError, match='target_variable cannot be empty or whitespace'):
|
||||
params.validate_business_rules()
|
||||
|
||||
|
||||
def test_validate_business_rules_valid_removed_intervals(valid_train_params_dict):
|
||||
"""Test validate_business_rules accepts valid removed_intervals."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['removed_intervals'] = [['2023-01-01', '2023-01-02']]
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
params.validate_business_rules() # Should not raise
|
||||
|
||||
|
||||
def test_validate_business_rules_valid_start_and_end_date(valid_train_params_dict):
|
||||
"""Test validate_business_rules accepts valid start_date and end_date."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['start_date'] = '2023-01-01'
|
||||
valid_train_params_dict['end_date'] = '2023-12-31'
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
params.validate_business_rules() # Should not raise
|
||||
|
||||
|
||||
def test_validate_business_rules_polynomial_regression_valid(valid_train_params_dict):
|
||||
"""Test validate_business_rules accepts valid Polynomial Regression config."""
|
||||
from model_manager.utils.models.train_model_params import TrainModelParams
|
||||
|
||||
valid_train_params_dict['model_name'] = 'Polynomial Regression'
|
||||
valid_train_params_dict['degree'] = 2
|
||||
valid_train_params_dict['scaler_name'] = 'Standard Scaler'
|
||||
params = TrainModelParams.from_dict(valid_train_params_dict)
|
||||
|
||||
params.validate_business_rules() # Should not raise
|
||||
|
||||
Reference in New Issue
Block a user