Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add unit tests for Ocient engine spec #6

Merged
merged 5 commits into from
Jan 25, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
233 changes: 233 additions & 0 deletions tests/unit_tests/db_engine_specs/test_ocient.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

# pylint: disable=import-outside-toplevel

from datetime import datetime

import pytest

from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
from typing import Dict, List, Tuple


@pytest.mark.parametrize(
"actual,expected",
[
("DATE", "TO_DATE('2019-01-02')"),
("DATETIME", "CAST('2019-01-02T03:04:05.678900' AS DATETIME)"),
("TIMESTAMP", "TO_TIMESTAMP('2019-01-02T03:04:05.678900')"),
],
)
def test_convert_dttm(actual: str, expected: str, dttm: datetime) -> None:
from superset.db_engine_specs.ocient import OcientEngineSpec

assert OcientEngineSpec.convert_dttm(actual, dttm) == expected

# (msg,expected)
MARSHALED_OCIENT_ERRORS: List[Tuple[str, Dict]] = [
(
'The referenced user does not exist (User \'mj\' not found)',
SupersetError(
message='The username "mj" does not exist.',
error_type=SupersetErrorType.CONNECTION_INVALID_USERNAME_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1012,
"message": "Issue 1012 - The username provided when connecting to a database is not valid.",
}
],
},
)
),
(
'The userid/password combination was not valid (Incorrect password for user)',
SupersetError(
message='The user/password combination is not valid (Incorrect password for user).',
error_type=SupersetErrorType.CONNECTION_INVALID_PASSWORD_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1013,
"message": "Issue 1013 - The password provided when connecting to a database is not valid.",
}
],
},
)
),
(
'No database named \'bulls\' exists',
SupersetError(
message='Could not connect to database: "bulls"',
error_type=SupersetErrorType.CONNECTION_UNKNOWN_DATABASE_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1015,
"message": "Issue 1015 - Either the database is spelled incorrectly or does not exist.",
}
],
},
)
),
(
'Unable to connect to unitedcenter.com:4050',
SupersetError(
message='Could not resolve hostname: "unitedcenter.com".',
error_type=SupersetErrorType.CONNECTION_INVALID_HOSTNAME_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1007,
"message": "Issue 1007 - The hostname provided can't be resolved.",
}
],
},
)
),
(
'Port out of range 0-65535',
SupersetError(
message='Port out of range 0-65535',
error_type=SupersetErrorType.CONNECTION_INVALID_PORT_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1034,
"message": "Issue 1034 - The port number is invalid.",
}
],
},
)
),
(
'An invalid connection string attribute was specified (failed to decrypt cipher text)',
SupersetError(
message='Invalid Connection String: Expecting String of the form \'ocient://user:pass@host:port/database\'.',
error_type=SupersetErrorType.GENERIC_DB_ENGINE_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1002,
"message": "Issue 1002 - The database returned an unexpected error.",
}
],
},
)
),
(
'There is a syntax error in your statement (extraneous input \'foo bar baz\' expecting ',
SupersetError(
message='Extraneous input: "foo bar baz".',
error_type=SupersetErrorType.SYNTAX_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1030,
"message": "Issue 1030 - The query has a syntax error.",
}
],
},
)
),
(
'There is a syntax error in your statement (mismatched input \'to\' expecting {<EOF>, \'trace\', \'using\'})',
SupersetError(
message='Extraneous input: "foo bar baz".',
error_type=SupersetErrorType.SYNTAX_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1030,
"message": "Issue 1030 - The query has a syntax error.",
}
],
},
)
),
(
'The referenced table or view \'goats\' does not exist',
SupersetError(
message='Table or View "goats" does not exist.',
error_type=SupersetErrorType.TABLE_DOES_NOT_EXIST_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1003,
"message": "Issue 1003 - There is a syntax error in the SQL query. Perhaps there was a misspelling or a typo.",
},
{
"code": 1005,
"message": "Issue 1005 - The table was deleted or renamed in the database.",
}
],
},
)
),
(
'The reference to column \'goats\' is not valid',
SupersetError(
message='Invalid reference to column: "goats"',
error_type=SupersetErrorType.COLUMN_DOES_NOT_EXIST_ERROR,
level=ErrorLevel.ERROR,
extra={
"engine_name": "Ocient",
"issue_codes": [
{
"code": 1003,
"message": "Issue 1003 - There is a syntax error in the SQL query. Perhaps there was a misspelling or a typo.",
},
{
"code": 1004,
"message": "Issue 1004 - The column was deleted or renamed in the database.",
}
],
},
)
),
]

@pytest.mark.parametrize(
"msg,expected",
MARSHALED_OCIENT_ERRORS
)
def test_connection_errors(msg: str, expected: SupersetError) -> None:
from superset.db_engine_specs.ocient import OcientEngineSpec

result = OcientEngineSpec.extract_errors(Exception(msg))
assert result == [
expected
]