From 573834fb9932f7db161a2f567055ebf51b490981 Mon Sep 17 00:00:00 2001 From: Bruno Domingues Date: Thu, 18 Dec 2025 18:46:01 -0300 Subject: [PATCH] SIENTIAPDE-1430: Add comprehensive tests for TrainModelParams.validate_business_rules to improve coverage. --- tests/utils/models/test_train_model_params.py | 187 ++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/tests/utils/models/test_train_model_params.py b/tests/utils/models/test_train_model_params.py index 9236fcc..3b65c60 100644 --- a/tests/utils/models/test_train_model_params.py +++ b/tests/utils/models/test_train_model_params.py @@ -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