def test_plugin_bad_config_file(plugin_config_file): with pytest.raises(exceptions.UserError) as err_info: validator = PluginValidator(plugin_config_file, const.PLUGIN_CONFIG_SCHEMA) validator.validate_plugin_config() message = err_info.value.message assert message == ("Unable to read plugin config file '{}'" "\nError code: 2. Error message: No such file or" " directory".format(plugin_config_file))
def test_direct_plugin(fake_direct_plugin_config): with pytest.raises(exceptions.UserError) as err_info: validator = PluginValidator(fake_direct_plugin_config, util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR, True) validator.validate() message = err_info.value.message assert validator.result.warnings.items() > 0 assert 'Named argument mismatch in method' in message assert 'Number of arguments do not match' in message assert 'Implementation missing for required method' in message
def test_staged_plugin(mock_file_util, fake_staged_plugin_config): src_dir = os.path.dirname(fake_staged_plugin_config) mock_file_util.return_value = os.path.join(src_dir, 'src/') with pytest.raises(exceptions.UserError) as err_info: validator = PluginValidator(fake_staged_plugin_config, util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR, True) validator.validate() message = err_info.value.message assert validator.result.warnings.items() > 0 assert 'Named argument mismatch in method' in message assert 'Number of arguments do not match' in message assert 'Implementation missing for required method' in message
def get_plugin_manifest(plugin_config_file, plugin_config_content, stop_build, skip_id_validation=False): """ Validates the given plugin config content using a pre-defined schema. Plugin config file name is used to get the absolute path of plugin source directory. Returns a manifest which indicates method implemented in the plugin module. """ validation_mode = (ValidationMode.ERROR if stop_build else ValidationMode.WARNING) src_dir = file_util.get_src_dir_path(plugin_config_file, plugin_config_content['srcDir']) entry_point_module, entry_point_object = PluginValidator.split_entry_point( plugin_config_content['entryPoint']) plugin_type = plugin_config_content['pluginType'] importer = PluginImporter(src_dir, entry_point_module, entry_point_object, plugin_type, True) with validate_error_handler(plugin_config_file, validation_mode): importer.validate_plugin_module() return importer.result
def test_plugin_missing_field(plugin_config_file, plugin_config_content): with pytest.raises(exceptions.SchemaValidationError) as err_info: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, const.PLUGIN_CONFIG_SCHEMA) validator.validate_plugin_config() message = err_info.value.message assert "'srcDir' is a required property" in message
def test_plugin_id(plugin_config_file, plugin_config_content, expected): try: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, const.PLUGIN_CONFIG_SCHEMA) validator.validate_plugin_config() except exceptions.SchemaValidationError as err_info: message = err_info.message assert expected in message
def validate_plugin_config_file(plugin_config, stop_build): """ Reads a plugin config file and validates the contents using a pre-defined schema. If stop_build is True, will report exception back, otherwise warnings. Returns: On successful validation, returns content of the plugin config. """ validation_mode = (ValidationMode.ERROR if stop_build else ValidationMode.WARNING) validator = PluginValidator(plugin_config, const.PLUGIN_CONFIG_SCHEMA) with validate_error_handler(plugin_config, validation_mode): validator.validate_plugin_config() return validator.result
def test_multiple_validation_errors(plugin_config_file, plugin_config_content): with pytest.raises(exceptions.SchemaValidationError) as err_info: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, const.PLUGIN_CONFIG_SCHEMA) validator.validate_plugin_config() message = err_info.value.message assert "'srcDir' is a required property" in message assert "'xxx' is not one of ['UNIX', 'WINDOWS']" in message
def read_and_validate_plugin_config_file(plugin_config, stop_build, run_all_validations, skip_id_validation=False): """ Reads a plugin config file and validates the contents using a pre-defined schema. If stop_build is True, will report exception back, otherwise warnings. Returns: On successful validation, returns content of the plugin config. """ validation_mode = ValidationMode.ERROR if stop_build else ValidationMode.WARNING plugin_config_schema_file = ( util_classes.PLUGIN_CONFIG_SCHEMA_NO_ID_VALIDATION if skip_id_validation else util_classes.PLUGIN_CONFIG_SCHEMA) validator = PluginValidator(plugin_config, plugin_config_schema_file, validation_mode, run_all_validations) validator.validate() return validator.result
def test_plugin_minimum_lua_version_without_lua_name( plugin_config_file, plugin_config_content): try: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, const.PLUGIN_CONFIG_SCHEMA) validator.validate_plugin_config() except exceptions.ValidationFailedError as err_info: message = err_info.message assert ('Failed to process property "minimumLuaVersion" without ' '"luaName" set in the plugin config.' in message)
def test_plugin_bad_schema(plugin_config_file, plugin_config_content, schema_file): with pytest.raises(exceptions.UserError) as err_info: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, schema_file) validator.validate_plugin_config() message = err_info.value.message assert ('Failed to load schemas because {} is not a valid json file.' ' Error: Extra data: line 2 column 1 - line 2 column 9' ' (char 19 - 27)'.format(schema_file)) in message
def test_plugin_additional_properties(src_dir, plugin_config_file, plugin_config_content): # Adding an unknown key plugin_config_content['unknown_key'] = 'unknown_value' try: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, const.PLUGIN_CONFIG_SCHEMA) validator.validate_plugin_config() except exceptions.SchemaValidationError as err_info: message = err_info.message assert ("Additional properties are not allowed" " ('unknown_key' was unexpected)" in message)
def test_plugin_missing_field(plugin_config_file): plugin_config_content = OrderedDict([ ('name', 'staged'.encode('utf-8')), ('version', '0.1.0'), ('language', 'PYTHON27'), ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')), ('manualDiscovery', True), ('entryPoint', 'staged_plugin:staged'.encode('utf-8')), ('schemaFile', 'schema.json'.encode('utf-8')) ]) with pytest.raises(exceptions.SchemaValidationError) as err_info: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR) validator.validate() message = err_info.value.message assert "'srcDir' is a required property" in message
def test_plugin_valid_content(mock_import_plugin, mock_relative_path, src_dir, plugin_config_file): plugin_config_content = OrderedDict([ ('id', str(uuid.uuid4())), ('name', 'staged'.encode('utf-8')), ('version', '0.1.0'), ('language', 'PYTHON27'), ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')), ('manualDiscovery', True), ('entryPoint', 'staged_plugin:staged'.encode('utf-8')), ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8')) ]) validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR) validator.validate() mock_import_plugin.assert_called()
def test_plugin_info_warn_mode(plugin_config_file, validation_mode): plugin_config_content = OrderedDict([ ('id', str(uuid.uuid4())), ('name', 'staged'.encode('utf-8')), ('version', '0.1.0'), ('language', 'PYTHON27'), ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')), ('manualDiscovery', True), ('entryPoint', 'staged_plugin:staged'.encode('utf-8')), ('schemaFile', 'schema.json'.encode('utf-8')) ]) err_info = None try: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, util_classes.PLUGIN_CONFIG_SCHEMA, validation_mode) validator.validate() except Exception as e: err_info = e assert err_info is None
def test_plugin_bad_schema(plugin_config_file, schema_file): plugin_config_content = OrderedDict([ ('name', 'staged'.encode('utf-8')), ('prettyName', 'StagedPlugin'.encode('utf-8')), ('version', '0.1.0'), ('language', 'PYTHON27'), ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')), ('manualDiscovery', True), ('entryPoint', 'staged_plugin:staged'.encode('utf-8')), ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8')) ]) with pytest.raises(exceptions.UserError) as err_info: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, schema_file, ValidationMode.ERROR) validator.validate() message = err_info.value.message assert ('Failed to load schemas because {} is not a valid json file.' ' Error: Extra data: line 2 column 1 - line 2 column 9' ' (char 19 - 27)'.format(schema_file)) in message
def test_plugin_id(mock_import_plugin, mock_relative_path, src_dir, plugin_config_file, plugin_id, expected): plugin_config_content = OrderedDict([ ('id', plugin_id.encode('utf-8')), ('name', 'python_vfiles'), ('version', '1.0.0'), ('language', 'PYTHON27'), ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')), ('manualDiscovery', True), ('entryPoint', 'staged_plugin:staged'.encode('utf-8')), ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8')) ]) try: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR) validator.validate() mock_import_plugin.assert_called() except exceptions.SchemaValidationError as err_info: message = err_info.message assert expected in message
def test_plugin_additional_properties(src_dir, plugin_config_file): plugin_config_content = OrderedDict([ ('id', str(uuid.uuid4())), ('name', 'staged'.encode('utf-8')), ('version', '1.0.0'), ('language', 'PYTHON27'), ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')), ('manualDiscovery', True), ('entryPoint', 'staged_plugin:staged'.encode('utf-8')), ('unknown_key', 'unknown_value'.encode('utf-8')), ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8')) ]) try: validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR) validator.validate() except exceptions.SchemaValidationError as err_info: message = err_info.message assert "Additional properties are not allowed " \ "('unknown_key' was unexpected)" in message
def get_plugin_manifest(plugin_config_file, plugin_config_content, stop_build, skip_id_validation=False): """ Validates the given plugin config content using a pre-defined schema. Plugin config file name is used to get the absolute path of plugin source directory. Returns a manifest which indicates method implemented in the plugin module. """ validation_mode = (ValidationMode.ERROR if stop_build else ValidationMode.WARNING) plugin_config_schema_file = ( util_classes.PLUGIN_CONFIG_SCHEMA_NO_ID_VALIDATION if skip_id_validation else util_classes.PLUGIN_CONFIG_SCHEMA) validator = PluginValidator.from_config_content(plugin_config_file, plugin_config_content, plugin_config_schema_file, validation_mode) validator.validate() return validator.result
def test_plugin_valid_content(src_dir, plugin_config_file, plugin_config_content): validator = PluginValidator.from_config_content( plugin_config_file, plugin_config_content, const.PLUGIN_CONFIG_SCHEMA) validator.validate_plugin_config()