Skip to content

test_formula_rule

Tests for RuleBase class

test_create_formula_rule_should_set_defaults()

Test creating a RuleBase with defaults

Source code in tests/business/entities/rules/test_formula_rule.py
def test_create_formula_rule_should_set_defaults():
    """Test creating a RuleBase with defaults"""

    # Arrange & Act
    rule = FormulaRule("test", ["foo", "bar"], "foo + bar")
    rule.output_variable_name = "outputname"

    # Assert
    assert rule.name == "test"
    assert rule.description == ""
    assert rule.input_variable_names == ["foo", "bar"]
    assert rule.output_variable_name == "outputname"
    assert rule.formula == "foo + bar"
    assert isinstance(rule, FormulaRule)

test_execute_adding_value_arrays()

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
def test_execute_adding_value_arrays():
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["foo", "bar"], "foo + bar")
    values = {"foo": 1.0, "bar": 4.0}

    # Act
    result_value = rule.execute(values, logger)

    # Assert
    assert math.isclose(result_value, 5.0, abs_tol=1e-9)

test_execute_comparing_value_arrays(input_value1, input_value2, expected_output_value)

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
@pytest.mark.parametrize(
    "input_value1, input_value2, expected_output_value",
    [(0.5, 10, 0.0), (11, 1.5, 1.0)],
)
def test_execute_comparing_value_arrays(
    input_value1: float, input_value2: float, expected_output_value: float
):
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["foo", "bar"], "foo > bar")
    values = {
        "foo": input_value1,
        "bar": input_value2,
    }

    # Act
    result_value = rule.execute(values, logger)

    # Assert
    assert result_value == expected_output_value

test_execute_math_value_arrays()

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
def test_execute_math_value_arrays():
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["val1"], "val1 * math.isqrt(9)")
    values = {"val1": 2.0}

    # Act
    result_value = rule.execute(values, logger)

    # Assert
    assert math.isclose(result_value, 6.0, abs_tol=1e-9)

test_execute_multiplying_value_arrays()

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
def test_execute_multiplying_value_arrays():
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["foo", "bar"], "foo * bar")
    values = {
        "foo": 2.0,
        "bar": 3.0,
    }

    # Act
    result_value = rule.execute(values, logger)

    # Assert
    assert math.isclose(result_value, 6.0, abs_tol=1e-9)

test_execute_numpy_value_arrays()

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
def test_execute_numpy_value_arrays():
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["val1"], "val1 * numpy.size(numpy.array([1, 3]))")
    values = {"val1": 1.0}

    # Act
    result_value = rule.execute(values, logger)

    # Assert
    assert math.isclose(result_value, 2.0, abs_tol=1e-9)

test_execute_unwanted_python_code()

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
def test_execute_unwanted_python_code():
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["foo", "bar"], "print('hoi')")
    values = {
        "foo": 2.0,
        "bar": 3.0,
    }

    # Act
    with pytest.raises(NameError) as exc_info:
        rule.execute(values, logger)

    exception_raised = exc_info.value

    # Assert
    expected_message = "name '_print_' is not defined"
    assert exception_raised.args[0] == expected_message

test_formula_has_incorrect_variable_names()

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
def test_formula_has_incorrect_variable_names():
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["foo", "bar"], "foo + bas")
    values = {
        "foo": 2.0,
        "bar": 3.0,
    }

    # Act
    with pytest.raises(NameError) as exc_info:
        rule.execute(values, logger)

    exception_raised = exc_info.value

    # Assert
    expected_message = "name 'bas' is not defined"
    assert exception_raised.args[0] == expected_message

test_validate_of_invalid_python_code(formula, expected_output_value)

Test formula on value_arrays of a RuleBase

Source code in tests/business/entities/rules/test_formula_rule.py
@pytest.mark.parametrize(
    "formula, expected_output_value",
    [("print('hoi')", False), ("foo + bar", True), ("output=foo + bar", True)],
)
def test_validate_of_invalid_python_code(formula: str, expected_output_value: bool):
    """Test formula on value_arrays of a RuleBase"""

    # Arrange
    logger = Mock(ILogger)
    rule = FormulaRule("test", ["foo", "bar"], formula)
    rule.output_variable_name = "outputname"

    # Act
    result = rule.validate(logger)

    # Assert
    assert result == expected_output_value