Beispiel #1
0
def test_validate_label_accepts_valid_labels(label):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("label", label,
                                                    validation_rule)
    assert validation_result.is_valid is True
Beispiel #2
0
    def validate_request_keys(self, request_body):
        is_valid = True
        error_msg = "The following errors were found:\n"
        # Get keys required/supported
        required_keys = self._validation_ruleset.get_keys_of_required_inputs()
        if 'language' in request_body:
            language = request_body['language']
            rule = self._validation_ruleset.get_validation_rule_for_key('language')
            validation_result = validate('language', language, rule)
            if validation_result.is_valid:
                required_keys += self._validation_ruleset.get_keys_for_language(request_body['language'])
            else:
                is_valid = False
                error_msg += f'Unsupported language "{language}" provided\n'
        supported_keys = required_keys + self._validation_ruleset.get_keys_of_optional_inputs()

        # Find any discrepancies
        missing_keys = get_set_difference(required_keys, request_body)
        unsupported_keys = get_set_difference(request_body, supported_keys)

        # Group the results together
        for key in missing_keys:
            is_valid = False
            error_msg += f'Missing required input "{key}"\n'
        for key in unsupported_keys:
            is_valid = False
            error_msg += f'Unsupported input "{key}" provided\n'
        result = ValidationResult(
            is_valid,
            "All input keys provided are valid\n" if is_valid else error_msg,
            None
        )

        return result
Beispiel #3
0
def test_validate_main_class_rejects_empty_strings_and_non_strings(main_class):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("main_class", main_class,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
Beispiel #4
0
def test_validate_label_rejects_empty_strings_and_non_strings(label):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Optional'})
    # Act
    validation_result = argument_validator.validate("label", label,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
Beispiel #5
0
def test_validate_name_validates_well_formatted_strings(name):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("name", name,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is True
Beispiel #6
0
def test_validate_path_to_main_app_file_validates_non_empty_strings(path):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("path_to_main_app_file",
                                                    path, validation_rule)
    # Assert
    assert validation_result.is_valid is True
Beispiel #7
0
def test_validate_label_rejects_invalid_non_empty_labels(label):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("label", label,
                                                    validation_rule)
    assert validation_result.is_valid is False
    assert validation_result.message == '"label" input must obey naming convention: ' \
                                        'see https://github.com/ukaea/piezo/wiki/WebAppUserGuide#submit-a-job'
Beispiel #8
0
def test_validate_label_validates_label_with_63_characters():
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    label = "abcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklm"
    assert len(label) == 63
    # Act
    validation_result = argument_validator.validate("label", label,
                                                    validation_rule)
    assert validation_result.is_valid is True
Beispiel #9
0
def test_validate_label_rejects_empty_strings(label):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("label", label,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"label" input cannot be empty'
Beispiel #10
0
def test_validate_name_rejects_non_string_values(name):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("name", name,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"name" input must be a string'
Beispiel #11
0
def test_validate_name_allows_29_character_name():
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    name = 'abcdefghijklmnopqrstuvwxyzabc'
    assert len(name) == 29
    # Act
    validation_result = argument_validator.validate("name", name,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is True
Beispiel #12
0
def test_validate_name_rejects_poorly_formatted_strings(name):
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    # Act
    validation_result = argument_validator.validate("name", name,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"name" input must obey naming convention: '\
                                        'see https://github.com/ukaea/piezo/wiki/WebAppUserGuide#submit-a-job'
Beispiel #13
0
def test_validate_label_rejects_label_with_64_characters():
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    label = "abcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklm" + "n"
    assert len(label) == 64
    # Act
    validation_result = argument_validator.validate("label", label,
                                                    validation_rule)
    assert validation_result.is_valid is False
    assert validation_result.message == '"label" input has a maximum length of 63 characters'
Beispiel #14
0
def test_validate_language_rejects_non_valid_languages(language):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Required',
        'options': ['Python', 'Scala']
    })
    # Act
    validation_result = argument_validator.validate("language", language,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
Beispiel #15
0
def test_validate_name_rejects_30_character_name():
    # Arrange
    validation_rule = ValidationRule({'classification': 'Required'})
    name = 'abcdefghijklmnopqrstuvwxyzabc' + 'd'
    assert len(name) == 30
    # Act
    validation_result = argument_validator.validate("name", name,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"name" input must obey naming convention: ' \
                                        'see https://github.com/ukaea/piezo/wiki/WebAppUserGuide#submit-a-job'
Beispiel #16
0
def test_validate_python_version_validates_string_2_or_3(version):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Conditional',
        'options': ['2', '3'],
        'conditional_input_name': 'language',
        'conditional_input_value': 'Python'
    })
    # Act
    validation_result = argument_validator.validate("python_version", version,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is True
Beispiel #17
0
def test_validate_driver_memory_accepts_values_for_megabytes_as_string(memory):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': '512m',
        'minimum': 512,
        'maximum': 2048
    })
    # Act
    validation_result = argument_validator.validate("driver_memory", memory,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is True
Beispiel #18
0
def test_validate_driver_cores_accepts_values_within_valid_range(cores):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': 0.1,
        'minimum': 0.1,
        'maximum': 1
    })
    # Act
    validation_result = argument_validator.validate("driver_cores", cores,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is True
Beispiel #19
0
def test_validate_executor_memory_rejects_values_outside_valid_range(memory):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': '512m',
        'minimum': 512,
        'maximum': 4096
    })
    # Act
    validation_result = argument_validator.validate("executor_memory", memory,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"executor_memory" input must be in range [512m, 4096m]'
Beispiel #20
0
def test_validate_executors_rejects_badly_formatted_inputs(executors):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': 1,
        'minimum': 1,
        'maximum': 10
    })
    # Act
    validation_result = argument_validator.validate("executors", executors,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"executors" input must be an integer'
Beispiel #21
0
def test_validate_executors_accepts_numerical_values_within_valid_range(
        executors):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': 1,
        'minimum': 1,
        'maximum': 10
    })
    # Act
    validation_result = argument_validator.validate("executors", executors,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is True
Beispiel #22
0
def test_validate_driver_cores_rejects_values_not_a_multiple_of_a_tenth(cores):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': 0.1,
        'minimum': 0.1,
        'maximum': 1
    })
    # Act
    validation_result = argument_validator.validate("driver_cores", cores,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"driver_cores" input must be a multiple of 0.1'
Beispiel #23
0
def test_validate_executors_rejects_values_outside_valid_range(executors):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': 1,
        'minimum': 1,
        'maximum': 10
    })
    # Act
    validation_result = argument_validator.validate("executors", executors,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"executors" input must be in range [1, 10]'
Beispiel #24
0
def test_validate_driver_cores_rejects_values_outside_valid_range(cores):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': 0.1,
        'minimum': 0.1,
        'maximum': 1
    })
    # Act
    validation_result = argument_validator.validate("driver_cores", cores,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"driver_cores" input must be in range [0.1, 1]'
Beispiel #25
0
def test_validate_python_version_rejects_string_not_in_list(version):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Conditional',
        'options': ['2', '3'],
        'conditional_input_name': 'language',
        'conditional_input_value': 'Python'
    })
    # Act
    validation_result = argument_validator.validate("python_version", version,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"python_version" input must be one of: "2", "3"'
Beispiel #26
0
def test_validate_executor_cores_rejects_values_outside_valid_range_or_with_bad_format(
        executor_cores):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': 1,
        'minimum': 1,
        'maximum': 4
    })
    # Act
    validation_result = argument_validator.validate("executor_cores",
                                                    executor_cores,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
Beispiel #27
0
def test_validate_executor_memory_rejects_incorrectly_formatted_values(memory):
    # Arrange
    validation_rule = ValidationRule({
        'classification': 'Optional',
        'default': '512m',
        'minimum': 512,
        'maximum': 4096
    })
    # Act
    validation_result = argument_validator.validate("executor_memory", memory,
                                                    validation_rule)
    # Assert
    assert validation_result.is_valid is False
    assert validation_result.message == '"executor_memory" input must be a string integer value ending in "m" ' \
                                        '(e.g. "512m" for 512 megabytes)'
Beispiel #28
0
    def validate_request_values(self, request_body):
        validated_dict = {}
        error_msg = "The following errors were found:\n"
        is_valid = True

        for key, input_value in request_body.items():
            rule_for_key = self._validation_ruleset.get_validation_rule_for_key(key)
            validation_result = validate(key, input_value, rule_for_key)
            if validation_result.is_valid is True:
                validated_dict[key] = validation_result.validated_value
            else:
                error_msg += validation_result.message + '\n'
                is_valid = False

        result = ValidationResult(
            is_valid,
            "All inputs provided are valid\n" if is_valid else error_msg,
            validated_dict if is_valid else None
        )
        return result