def test_when_config_is_empty_json_then_schema_requires_monitors(
        config_json_schema):
    empty_config = read_json_from_file(EMPTY_JSON_CONFIG_FILE)
    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(empty_config, config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError,
        "'monitors' is a required property", [])
def test_when_config_contains_metric_with_no_name_then_schema_requires_metric_name(
        config_json_schema):
    no_metric_name_config = read_json_from_file(NO_METRIC_NAME_CONFIG_FILE)

    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(no_metric_name_config, config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError, "'name' is a required property",
        ['monitors', 0, 'metric'])
def test_when_config_contains_empty_monitor_then_schema_requires_monitor_name(
        config_json_schema):
    empty_monitor_config = read_json_from_file(EMPTY_MONITOR_CONFIG_FILE)

    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(empty_monitor_config, config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError, "'name' is a required property",
        ['monitors', 0])
def test_when_config_contains_wrong_monitor_type_then_schema_requires_object_monitor(
        config_json_schema):
    wrong_monitor_type_config = read_json_from_file(
        WRONG_MONITOR_TYPE_CONFIG_FILE)
    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(wrong_monitor_type_config,
                                    config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError, "'' is not of type 'object'",
        ['monitors', 0])
def test_when_config_monitors_is_not_array_then_schema_requires_array(
        config_json_schema):
    monitors_not_array_config = read_json_from_file(
        MONITORS_NOT_ARRAY_CONFIG_FILE)
    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(monitors_not_array_config,
                                    config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError, "is not of type 'array'",
        ['monitors'])
def test_when_config_contains_threshold_with_no_clear_points_then_schema_requires_clear_points(
        config_json_schema):
    no_threshold_clear_points_config = read_json_from_file(
        NO_THRESHOLD_CLEAR_POINTS_CONFIG_FILE)

    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(no_threshold_clear_points_config,
                                    config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError,
        "'clear_points' is a required property", ['monitors', 0, 'threshold'])
def test_when_config_contains_monitor_with_no_notifiers_then_schema_requires_monitor_notifiers(
        config_json_schema):
    no_monitor_notifiers_config = read_json_from_file(
        NO_MONITOR_NOTIFIERS_CONFIG_FILE)

    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(no_monitor_notifiers_config,
                                    config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError,
        "'notifiers' is a required property", ['monitors', 0])
def test_when_config_contains_monitor_with_no_interval_then_schema_requires_monitor_interval(
        config_json_schema):
    no_monitor_interval_config = read_json_from_file(
        NO_MONITOR_INTERVAL_CONFIG_FILE)

    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(no_monitor_interval_config,
                                    config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError,
        "'interval' is a required property", ['monitors', 0])
def test_when_config_contains_monitor_with_no_threshold_then_schema_requires_monitor_threshold(
        config_json_schema):
    no_monitor_threshold_config = read_json_from_file(
        NO_MONITOR_THRESHOLD_CONFIG_FILE)

    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate(no_monitor_threshold_config,
                                    config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError,
        "'threshold' is a required property", ['monitors', 0])
def test_when_schema_is_validated_schema_is_itself_valid(config_json_schema):
    exception_validator = RunnableExceptionValidator(
        lambda: jsonschema.validate('', config_json_schema))
    exception_validator.verify_json_schema_exception(
        jsonschema.exceptions.ValidationError, "'' is not of type 'object'",
        [])