def test_validate_partial_invalid_hostname(is_hostname_valid, app_context): """ Test parameter validation when only some parameters are present. """ is_hostname_valid.return_value = False payload = { "engine": "postgresql", "parameters": { "host": "localhost", "port": None, "username": "", "password": "", "database": "", "query": {}, }, } command = ValidateDatabaseParametersCommand(None, payload) with pytest.raises(SupersetErrorsException) as excinfo: command.run() assert excinfo.value.errors == [ SupersetError( message= "One or more parameters are missing: database, port, username", error_type=SupersetErrorType.CONNECTION_MISSING_PARAMETERS_ERROR, level=ErrorLevel.WARNING, extra={ "missing": ["database", "port", "username"], "issue_codes": [{ "code": 1018, "message": "Issue 1018 - One or more parameters needed to configure a database are missing.", }], }, ), SupersetError( message="The hostname provided can't be resolved.", error_type=SupersetErrorType.CONNECTION_INVALID_HOSTNAME_ERROR, level=ErrorLevel.ERROR, extra={ "invalid": ["host"], "issue_codes": [{ "code": 1007, "message": "Issue 1007 - The hostname provided can't be resolved.", }], }, ), ]
def validate_parameters( # pylint: disable=too-many-return-statements self, ) -> FlaskResponse: """validates database connection parameters --- post: description: >- Validates parameters used to connect to a database requestBody: description: DB-specific parameters required: true content: application/json: schema: $ref: "#/components/schemas/DatabaseValidateParametersSchema" responses: 200: description: Database Test Connection content: application/json: schema: type: object properties: message: type: string 400: $ref: '#/components/responses/400' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' """ if not request.is_json: raise InvalidPayloadFormatError("Request is not JSON") try: payload = DatabaseValidateParametersSchema().load(request.json) except ValidationError as error: errors = [ SupersetError( message="\n".join(messages), error_type=SupersetErrorType.INVALID_PAYLOAD_SCHEMA_ERROR, level=ErrorLevel.ERROR, extra={"invalid": [attribute]}, ) for attribute, messages in error.messages.items() ] raise InvalidParametersError(errors) command = ValidateDatabaseParametersCommand(g.user, payload) command.run() return self.response(200, message="OK")
def validate_parameters( # pylint: disable=too-many-return-statements self, ) -> FlaskResponse: """validates database connection parameters --- post: description: >- Validates parameters used to connect to a database requestBody: description: DB-specific parameters required: true content: application/json: schema: $ref: "#/components/schemas/DatabaseValidateParametersSchema" responses: 200: description: Database Test Connection content: application/json: schema: type: object properties: message: type: string 400: $ref: '#/components/responses/400' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' """ if not request.is_json: raise InvalidPayloadFormatError("Request is not JSON") try: payload = DatabaseValidateParametersSchema().load(request.json) except ValidationError as error: raise InvalidPayloadSchemaError(error) command = ValidateDatabaseParametersCommand(g.user, payload) command.run() return self.response(200, message="OK")
def test_validate(DatabaseDAO, is_port_open, is_hostname_valid, app_context): """ Test parameter validation. """ is_hostname_valid.return_value = True is_port_open.return_value = True payload = { "engine": "postgresql", "parameters": { "host": "localhost", "port": 5432, "username": "******", "password": "******", "database": "test", "query": {}, }, } command = ValidateDatabaseParametersCommand(None, payload) command.run()
def test_validate_partial(is_port_open, is_hostname_valid, app_context): """ Test parameter validation when only some parameters are present. """ is_hostname_valid.return_value = True is_port_open.return_value = True payload = { "engine": "postgresql", "parameters": { "host": "localhost", "port": 5432, "username": "", "password": "******", "database": "test", "query": {}, }, } command = ValidateDatabaseParametersCommand(None, payload) with pytest.raises(SupersetErrorsException) as excinfo: command.run() assert excinfo.value.errors == [ SupersetError( message="One or more parameters are missing: username", error_type=SupersetErrorType.CONNECTION_MISSING_PARAMETERS_ERROR, level=ErrorLevel.WARNING, extra={ "missing": ["username"], "issue_codes": [{ "code": 1018, "message": "Issue 1018 - One or more parameters needed to configure a database are missing.", }], }, ) ]