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)!")
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)}")
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']}'!")
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']}!")
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)
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!'
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)
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!')
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)