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: Added more unit test for some CLI options and some database connections #1421

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 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
99 changes: 99 additions & 0 deletions tests/unit/test__main.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,3 +558,102 @@ def test_successful_generate_partitions_with_mocked_partition_builder(
)
def test_successful_query_with_mocked_get_data_client(mock_args, mock_run):
main.main()

@mock.patch("data_validation.__main__.run_validation")
@mock.patch(
"data_validation.__main__.build_config_managers_from_args",
return_value=[
config_manager.ConfigManager(
VALIDATE_SCHEMA_CONFIG,
MockIbisClient(),
MockIbisClient(),
verbose=False,
)
],
)
@mock.patch(
"argparse.ArgumentParser.parse_args",
return_value=argparse.Namespace(**VALIDATE_SCHEMA_CONFIG),
)
def test_successful_schema_validation_with_mocked_run_validation(
mock_args, mock_build, mock_run
):
main.main()

@mock.patch("data_validation.clients.get_data_client")
@mock.patch(
"argparse.ArgumentParser.parse_args",
return_value=argparse.Namespace(**CONNECTION_DESCRIBE_ARGS),
)
def test_successful_connection_describe_with_mocked_get_data_client(
mock_args, mock_get_data_client
):
main.main()

@mock.patch("data_validation.__main__.run_validations")
@mock.patch(
"data_validation.__main__.build_config_managers_from_yaml",
return_value=["config dict from one file"],
)
@mock.patch(
"argparse.ArgumentParser.parse_args",
return_value=argparse.Namespace(**CONFIG_RUNNER_ARGS_1),
)
def test_config_runner_with_kube_completions(mock_args, mock_build, mock_run, caplog):
caplog.set_level(logging.WARNING)
args = cli_tools.get_parsed_args()
caplog.clear()
main.config_runner(args)
assert caplog.messages == [
"--kube-completions or -kc specified, which requires a config directory, however a specific config file is provided."
]
assert len(mock_run.call_args.args[1]) == 1


@mock.patch("data_validation.__main__.find_tables_using_string_matching")
@mock.patch(
"argparse.ArgumentParser.parse_args",
return_value=argparse.Namespace(**FIND_TABLES_ARGS),
)
def test_successful_find_tables_with_mocked_find_tables_using_string_matching(
mock_args, mock_find_tables
):
main.main()


@mock.patch("data_validation.clients.get_data_client")
@mock.patch(
"argparse.ArgumentParser.parse_args",
return_value=argparse.Namespace(**QUERY_CONFIG),
)
def test_successful_query_with_mocked_get_data_client(mock_args, mock_get_data_client):
main.main()

@mock.patch("data_validation.__main__.PartitionBuilder")
@mock.patch(
"data_validation.__main__.build_config_managers_from_args",
return_value=[
config_manager.ConfigManager(
GENERATE_PARTITIONS_CONFIG,
MockIbisClient(),
MockIbisClient(),
verbose=False,
)
],
)
@mock.patch(
"argparse.ArgumentParser.parse_args",
return_value=argparse.Namespace(**GENERATE_PARTITIONS_CONFIG),
)
def test_successful_generate_partitions_with_mocked_partition_builder(
mock_args, mock_build, mock_run
):
main.main()

@mock.patch("data_validation.app.app.run")
@mock.patch(
"argparse.ArgumentParser.parse_args",
return_value=argparse.Namespace(**DEPLOY_ARGS),
)
def test_successful_deploy_with_mocked_app_run(mock_args, mock_run):
main.main()
194 changes: 194 additions & 0 deletions tests/unit/test_cli_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@
from unittest import mock

import pytest
from pyfakefs.fake_filesystem_unittest import Patcher

from data_validation import cli_tools, consts, gcs_helper
from data_validation.cli_tools import get_parsed_args

TEST_CONN = '{"source_type":"Example"}'
CLI_ARGS = {
Expand Down Expand Up @@ -833,3 +835,195 @@ def test_arg_parser_generate_table_partitions_help(capsys):
_ = parser.parse_args(["generate-table-partitions", "--help"])
captured = capsys.readouterr()
assert "--partition-num" in captured.out


@pytest.fixture
def mock_args():
with mock.patch('argparse.ArgumentParser.parse_args') as mock_parse_args:
yield mock_parse_args

@pytest.fixture
def mocked_connection_file(fs):
expanded_path = os.path.expanduser(CLI_EXPECTED_CONNECTION_FILE_PATH)
fs.makedirs(os.path.dirname(expanded_path), exist_ok=True)
fs.create_file(expanded_path, contents=json.dumps(CLI_EXPECTED_CONNECTION))
return fs

def test_get_parsed_args_source_conn(mock_args):
"""Test arg parser values with validate command and source_conn option."""
mock_args.return_value = argparse.Namespace(source_conn='{"source_type":"NewSource"}')
args = get_parsed_args()
assert args.source_conn == '{"source_type":"NewSource"}'

def test_get_parsed_args_target_conn(mock_args):
"""Test arg parser values with validate command and target_conn option."""
mock_args.return_value = argparse.Namespace(target_conn='{"source_type":"NewTarget"}')
args = get_parsed_args()
assert args.target_conn == '{"source_type":"NewTarget"}'

def test_get_parsed_args_tables_list(mock_args):
"""Test arg parser values with validate command and tables_list option."""
mock_args.return_value = argparse.Namespace(tables_list="new_schema.new_table")
args = get_parsed_args()
assert args.tables_list == "new_schema.new_table"

def test_get_parsed_args_sum(mock_args):
"""Test arg parser values with validate command and sum option."""
mock_args.return_value = argparse.Namespace(sum="new_col_a,new_col_b")
args = get_parsed_args()
assert args.sum == "new_col_a,new_col_b"

def test_get_parsed_args_count(mock_args):
"""Test arg parser values with validate command and count option."""
mock_args.return_value = argparse.Namespace(count="new_col_a,new_col_b")
args = get_parsed_args()
assert args.count == "new_col_a,new_col_b"

def test_get_parsed_args_config_file(mock_args):
"""Test arg parser values with validate command and config_file option."""
mock_args.return_value = argparse.Namespace(config_file="new_config.yaml")
args = get_parsed_args()
assert args.config_file == "new_config.yaml"

def test_get_parsed_args_validate_row_hash(mock_args):
"""Test arg parser values with validate row command and hash option."""
mock_args.return_value = argparse.Namespace(hash="col_a,col_b")
args = get_parsed_args()
assert args.hash == "col_a,col_b"

def test_get_parsed_args_validate_schema(mock_args):
"""Test arg parser values with validate schema command and schema option."""
mock_args.return_value = argparse.Namespace(schema="my_schema")
args = get_parsed_args()
assert args.schema == "my_schema"

def test_get_parsed_args_beta_new_feature(mock_args):
"""Test arg parser values with beta command and new-feature subcommand."""
mock_args.return_value = argparse.Namespace(beta_cmd="new-feature", new_option="value")
args = get_parsed_args()
assert args.beta_cmd == "new-feature"
assert args.new_option == "value"

def test_get_parsed_args_generate_table_partitions(mock_args):
"""Test arg parser values with generate-table-partitions command."""
mock_args.return_value = argparse.Namespace(partition_num=10)
args = get_parsed_args()
assert args.partition_num == 10

def test_get_parsed_args_query(mock_args):
"""Test arg parser values with query command."""
mock_args.return_value = argparse.Namespace(query="SELECT * FROM my_table")
args = get_parsed_args()
assert args.query == "SELECT * FROM my_table"

def test_get_parsed_args_add_oracle_connection(mock_args):
"""Test arg parser values with connections add command for Oracle."""
mock_args.return_value = argparse.Namespace(
user="my_user",
password="my_password",
host="my_host",
port="1521",
database="my_database"
)
args = get_parsed_args()
assert args.user == "my_user"
assert args.password == "my_password"
assert args.host == "my_host"
assert args.port == "1521"
assert args.database == "my_database"

def test_get_parsed_args_add_postgresql_connection(mock_args):
"""Test arg parser values with connections add command for PostgreSQL."""
mock_args.return_value = argparse.Namespace(
host="localhost",
port="5432",
user="postgres",
password="password"
)
args = get_parsed_args()
assert args.host == "localhost"
assert args.port == "5432"
assert args.user == "postgres"
assert args.password == "password"

def test_get_parsed_args_add_sqlserver_connection(mock_args):
"""Test arg parser values with connections add command for SQL Server."""
mock_args.return_value = argparse.Namespace(
host="localhost",
port="1433",
user="sa",
password="password"
)
args = get_parsed_args()
assert args.host == "localhost"
assert args.port == "1433"
assert args.user == "sa"
assert args.password == "password"

def test_get_parsed_args_add_sqlite_connection(mock_args):
"""Test arg parser values with connections add command for SQLite."""
mock_args.return_value = argparse.Namespace(database="my_database.db")
args = get_parsed_args()
assert args.database == "my_database.db"

def test_get_parsed_args_add_mariadb_connection(mock_args):
"""Test arg parser values with connections add command for MariaDB."""
mock_args.return_value = argparse.Namespace(
host="localhost",
port="3306",
user="root",
password="password"
)
args = get_parsed_args()
assert args.host == "localhost"
assert args.port == "3306"
assert args.user == "root"
assert args.password == "password"
helensilva14 marked this conversation as resolved.
Show resolved Hide resolved

def test_get_parsed_args_add_db2_connection(mock_args):
"""Test arg parser values with connections add command for DB2."""
mock_args.return_value = argparse.Namespace(
host="localhost",
port="50000",
user="db2inst1",
password="password",
database="sample"
)
args = get_parsed_args()
assert args.host == "localhost"
assert args.port == "50000"
assert args.user == "db2inst1"
assert args.password == "password"
assert args.database == "sample"

def test_get_parsed_args_add_mongodb_connection(mock_args):
"""Test arg parser values with connections add command for MongoDB."""
mock_args.return_value = argparse.Namespace(
host="localhost",
port="27017",
user="admin",
password="password",
database="testdb"
)
args = get_parsed_args()
assert args.host == "localhost"
assert args.port == "27017"
assert args.user == "admin"
assert args.password == "password"
assert args.database == "testdb"

def test_get_parsed_args_add_cassandra_connection(mock_args):
"""Test arg parser values with connections add command for Cassandra."""
mock_args.return_value = argparse.Namespace(
host="localhost",
port="9042",
user="cassandra",
password="password",
keyspace="testkeyspace"
)
args = get_parsed_args()
assert args.host == "localhost"
assert args.port == "9042"
assert args.user == "cassandra"
assert args.password == "password"
assert args.keyspace == "testkeyspace"
safe049 marked this conversation as resolved.
Show resolved Hide resolved