Skip to content

test_rule_based_model

Tests for RuleBasedModel class

test_create_rule_based_model_with_defaults()

Test that the default properties of a rule-based model are set when creating the model using the default constructor.

Source code in tests/business/entities/test_rule_based_model.py
def test_create_rule_based_model_with_defaults():
    """Test that the default properties of a rule-based model
    are set when creating the model using the default constructor."""

    # Arrange
    rule = Mock(IRule)
    dataset = Mock(IDatasetData)

    # Act
    model = RuleBasedModel([dataset], [rule])

    # Assert

    assert isinstance(model, RuleBasedModel)
    assert model.name == "Rule-Based model"
    assert rule in model.rules
    assert dataset in model.input_datasets
    assert model.status == ModelStatus.CREATED

test_error_executing_model_with_processor_none()

Tests the error thrown when the processor of a rule based model is None.

Source code in tests/business/entities/test_rule_based_model.py
def test_error_executing_model_with_processor_none():
    """
    Tests the error thrown when the processor of a rule based model is None.
    """
    # Arrange
    dataset = _xr.Dataset()
    dataset["test"] = _xr.DataArray([32, 94, 9])
    rule: IRule = Mock(IRule)
    logger = Mock(ILogger)
    model = RuleBasedModel([dataset], [rule])
    model._rule_processor = None

    # Act
    with pytest.raises(RuntimeError) as exc_info:
        model.execute(logger)
    exception_raised = exc_info.value

    # Assert
    expected_message = "Processor is not set, please initialize model."
    assert exception_raised.args[0] == expected_message

test_error_initializing_rule_based_model()

Tests if the error message sent when initializing a rule based model fails.

Source code in tests/business/entities/test_rule_based_model.py
def test_error_initializing_rule_based_model():
    """Tests if the error message sent when initializing a rule based model fails."""
    # Arrange
    dataset = _xr.Dataset()
    dataset["test"] = _xr.DataArray([32, 94, 9])
    dataset["test"].attrs = {"cf_role": "mesh_topology"}
    rule: IRule = Mock(IRule)
    rule.input_variable_names = ["unknown_var"]  # ["unknown_var"]
    rule.name = "rule with unknown var"
    model = RuleBasedModel([dataset], [rule])
    logger = Mock(ILogger)

    # Act
    model.initialize(logger)

    # Assert
    logger.log_error.assert_called_with("Initialization failed.")

test_run_rule_based_model()

Test if the model can correctly run the given rules and adds the calculated results"

   +------+

test --| R1 |-- out1 --+ +------+ | +-----+ +--| | | R3 |-- out3 +--| | +------+ | +-----+ test --| R2 |-- out2 --+ +------+

Source code in tests/business/entities/test_rule_based_model.py
def test_run_rule_based_model():
    """Test if the model can correctly run the given
    rules and adds the calculated results"

           +------+
    test --|  R1  |-- out1 --+
           +------+          |  +-----+
                             +--|     |
                                |  R3 |-- out3
                             +--|     |
           +------+          |  +-----+
    test --|  R2  |-- out2 --+
           +------+
    """
    # Arrange
    dataset = _xr.Dataset()
    dataset["test"] = _xr.DataArray([32, 94, 9])
    dataset["test"].attrs = {"cf_role": "mesh_topology"}

    logger = Mock(ILogger)
    rule1 = Mock(IArrayBasedRule, id="rule1")
    rule2 = Mock(IArrayBasedRule, id="rule2")
    rule3 = Mock(IMultiArrayBasedRule, id="rule3")

    rule1.input_variable_names = ["test"]
    rule2.input_variable_names = ["test"]
    rule3.input_variable_names = ["out1", "out2"]

    rule1.output_variable_name = "out1"
    rule2.output_variable_name = "out2"
    rule3.output_variable_name = "out3"

    rule1.execute.return_value = _xr.DataArray([32, 94, 9])
    rule2.execute.return_value = _xr.DataArray([32, 94, 9])
    rule3.execute.return_value = _xr.DataArray([32, 94, 9])

    model = RuleBasedModel([dataset], [rule1, rule2, rule3])

    # Act
    assert model.validate(logger)
    model.initialize(logger)
    model.execute(logger)
    model.finalize(logger)

    # Assert
    assert "out1" in model.output_dataset.keys()
    assert "out2" in model.output_dataset.keys()
    assert "out3" in model.output_dataset.keys()

test_status_setter()

Test if status is correctly set for a model

Source code in tests/business/entities/test_rule_based_model.py
def test_status_setter():
    """Test if status is correctly set for a model"""

    # Arrange
    rule = Mock(IRule)
    dataset = Mock(IDatasetData)
    logger = Mock(ILogger)

    # Act
    model = RuleBasedModel([dataset], [rule], logger)

    assert model.status == ModelStatus.CREATED
    model.status = ModelStatus.EXECUTED
    assert model.status == ModelStatus.EXECUTED

test_validation_of_rule_based_model()

Test if the model correctly validates for required parameters (datasets, rules)

Source code in tests/business/entities/test_rule_based_model.py
def test_validation_of_rule_based_model():
    """Test if the model correctly validates for required
    parameters (datasets, rules)
    """

    # Arrange
    rule = Mock(IRule)
    dataset = _xr.Dataset()
    logger = Mock(ILogger)

    dataset["test"] = _xr.DataArray([32, 94, 9])
    dataset["test"].attrs = {"cf_role": "mesh_topology"}

    rule.input_variable_names = ["input"]
    rule.output_variable_name = "output"

    mapping_usual = {"test": "input"}
    model_usual = RuleBasedModel([dataset], [rule], mapping_usual)

    map_to_itself = {"test": "test"}
    model_map_to_itself = RuleBasedModel([dataset], [rule], map_to_itself)

    map_non_existing_var = {"non_existing_var": "input"}
    model_map_non_existing_var = RuleBasedModel([dataset], [rule], map_non_existing_var)

    map_to_wrong_var = {"test": "incorrect_var"}
    model_map_to_wrong_var = RuleBasedModel([dataset], [rule], map_to_wrong_var)

    map_from_non_existing_var_to_wrong_var = {"non_existing_var": "incorrect_var"}
    model_map_from_non_existing_var_to_wrong_var = RuleBasedModel(
        [dataset], [rule], map_from_non_existing_var_to_wrong_var
    )

    model_no_rules_and_datasets = RuleBasedModel([], [])
    model_no_rules = RuleBasedModel([dataset], [])
    model_no_datasets_model = RuleBasedModel([], [rule])

    # Act & Assert
    assert model_usual.validate(logger)
    assert not model_map_to_itself.validate(logger)
    assert not model_map_non_existing_var.validate(logger)
    assert not model_map_to_wrong_var.validate(logger)
    assert not model_map_from_non_existing_var_to_wrong_var.validate(logger)
    assert not model_no_rules_and_datasets.validate(logger)
    assert not model_no_rules.validate(logger)
    assert not model_no_datasets_model.validate(logger)

test_validation_of_rule_based_model_rule_dependencies()

Test if the model correctly validates the given rules for dependencies"

Source code in tests/business/entities/test_rule_based_model.py
def test_validation_of_rule_based_model_rule_dependencies():
    """Test if the model correctly validates the given
    rules for dependencies"
    """
    # Arrange
    dataset = _xr.Dataset()
    dataset["test"] = _xr.DataArray([32, 94, 9])
    rule: IRule = Mock(IRule)
    logger = Mock(ILogger)

    rule.validate.return_value = True

    model = RuleBasedModel([dataset], [rule])

    # Act & Assert
    assert model.validate(logger)
    rule.validate.assert_called_once_with(logger)