Ejemplo n.º 1
0
def test_when_metric_class_constructor_missing_configuration_parameter_then_exception(metric_config):
    metric_config['name'] = 'metric_class_constructor_missing_configuration.py'
    exception_validator = RunnableExceptionValidator(
        lambda: Metric(
            config=metric_config,
            metric_directory=METRIC_TEST_INSTANCES_DIRECTORY,
            metric_parent_module=METRIC_TEST_INSTANCES_MODULE))
    exception_validator.verify_exception(
        AssertionError,
        f"Metric() takes no arguments. Please make sure that the metric class constructor takes a single argument "
        f"representing the metric configuration (which might be empty/undefined)!")
Ejemplo n.º 2
0
def test_when_metric_class_is_not_subclass_of_abstract_metric_class_then_exception(metric_config):
    metric_config['name'] = 'metric_class_not_subclass_of_abstract_metric_class.py'
    exception_validator = RunnableExceptionValidator(
        lambda: Metric(
            config=metric_config,
            metric_directory=METRIC_TEST_INSTANCES_DIRECTORY,
            metric_parent_module=METRIC_TEST_INSTANCES_MODULE))
    exception_validator.verify_exception(
        AssertionError,
        f"The metric class defined in '{metric_config['name']}' must be a subclass of the abstract Metric class "
        f"defined in {os.path.join(Metric.METRIC_ABSTRACT_CLASS_MODULE, Metric.METRIC_ABSTRACT_CLASS_NAME)}")
Ejemplo n.º 3
0
def test_when_metric_file_not_in_directory_then_exception(metric_config):
    metric_config['name'] = 'non_existent_metric.py'
    exception_validator = RunnableExceptionValidator(
        lambda: Metric(
            config=metric_config,
            metric_directory=METRIC_TEST_INSTANCES_DIRECTORY,
            metric_parent_module=METRIC_TEST_INSTANCES_MODULE))
    exception_validator.verify_exception(
        AssertionError,
        f"The metric name must be the Python file name placed in the path '{METRIC_TEST_INSTANCES_DIRECTORY}', "
        f"but got '{metric_config['name']}'!")
Ejemplo n.º 4
0
def test_when_metric_file_contains_multiple_python_classes_then_exception(metric_config):
    metric_config['name'] = 'multiple_classes_in_file.py'
    exception_validator = RunnableExceptionValidator(
        lambda: Metric(
            config=metric_config,
            metric_directory=METRIC_TEST_INSTANCES_DIRECTORY,
            metric_parent_module=METRIC_TEST_INSTANCES_MODULE))
    exception_validator.verify_exception(
        AssertionError,
        f"The metric defined in '{metric_config['name']}' must have a single class defined in its file, "
        f"but got 2 classes: "
        f"{['Metric', 'AnotherMetric']}!")
Ejemplo n.º 5
0
def test_when_monitor_well_formed_then_no_exception(monitor):
    monitor_instance = Monitor(monitor)
    assert monitor_instance.name == monitor['name']
    assert monitor_instance.description == monitor['description']
    assert monitor_instance.interval == Interval(monitor['interval'])
    assert monitor_instance.metric == Metric(
        config=monitor['metric'],
        metric_directory=Monitor.METRICS_DIRECTORY,
        metric_parent_module=Monitor.METRIC_INSTANCES_PARENT_MODULE)
    assert monitor_instance.threshold == Threshold(
        config=monitor['threshold'],
        comparator_directory=Monitor.COMPARATORS_DIRECTORY,
        comparator_parent_module=Monitor.COMPARATOR_INSTANCES_PARENT_MODULE)
    assert monitor_instance.notifiers == Monitor.Notifiers(
        notifiers_config_dict=monitor['notifiers'],
        notifier_directory=Monitor.NOTIFIERS_DIRECTORY,
        notifier_parent_module=Monitor.NOTIFIER_INSTANCES_PARENT_MODULE)
Ejemplo n.º 6
0
    def __init__(self, monitor_config_dict):
        self.name = monitor_config_dict['name']
        self.description = monitor_config_dict.get(
            'description')  # Description is optional, thus we use 'get'
        self.interval = Interval(monitor_config_dict['interval'])
        self.metric = Metric(
            config=monitor_config_dict['metric'],
            metric_directory=Monitor.METRICS_DIRECTORY,
            metric_parent_module=Monitor.METRIC_INSTANCES_PARENT_MODULE)
        self.threshold = Threshold(
            config=monitor_config_dict['threshold'],
            comparator_directory=Monitor.COMPARATORS_DIRECTORY,
            comparator_parent_module=Monitor.COMPARATOR_INSTANCES_PARENT_MODULE
        )
        self.notifiers = Monitor.Notifiers(
            notifiers_config_dict=monitor_config_dict['notifiers'],
            notifier_directory=Monitor.NOTIFIERS_DIRECTORY,
            notifier_parent_module=Monitor.NOTIFIER_INSTANCES_PARENT_MODULE)

        assert len(
            self.name
        ) != 0, 'The name of the monitor must contain at least one character!'
Ejemplo n.º 7
0
def test_when_metric_configuration_missing_then_no_exception(metric_config):
    metric_config.pop('configuration')
    Metric(metric_config, Monitor.METRICS_DIRECTORY, Monitor.METRIC_INSTANCES_PARENT_MODULE)
Ejemplo n.º 8
0
def test_when_metric_name_empty_then_exception(metric_config):
    metric_config['name'] = ''
    exception_validator = RunnableExceptionValidator(
        lambda: Metric(metric_config, Monitor.METRICS_DIRECTORY, Monitor.METRIC_INSTANCES_PARENT_MODULE))
    exception_validator.verify_exception(AssertionError, 'The name of the metric must contain at least one character!')
Ejemplo n.º 9
0
def test_when_metric_class_meets_all_contract_requirements_then_no_exception(metric_config):
    metric_config['name'] = 'well_defined_metric.py'
    Metric(
        config=metric_config,
        metric_directory=METRIC_TEST_INSTANCES_DIRECTORY,
        metric_parent_module=METRIC_TEST_INSTANCES_MODULE)