import os import pytest from garcon_contrib.mysql import garcon_mysql_utils # noqa @pytest.fixture def columns_names(): """Fixture returns list of columns names for test schema """ return ['column1', 'column2'] @pytest.fixture def table_name(): """Fixture returns name of the MySQL table """ return 'testtable' @pytest.fixture(params=[ ('fixtures/mysql_load_test_unix.csv', '\\n'), ('fixtures/mysql_load_test_windows.csv', '\\r\\n'), ('fixtures/mysql_load_test_old_mac.csv', '\\r'), ]) def csv_file(request): """ Fixture returns list of test file names with expected line terminators """ return request.param def test_create_sql_for_load_csv(columns_names): """Test generated MySQL LOAD command text """ file_to_load = '/test/path/file' replace = True table_name = 'test_table' fields_terminator = ',' line_terminator = '\\r\\n' ignore_lines = 1 column_names_arg = ', '.join(columns_names) replace_arg = 'REPLACE' if replace else '' sql_command = garcon_mysql_utils.create_sql_for_load_csv( file_to_load, replace, table_name, columns_names, fields_terminator=fields_terminator, line_terminator=line_terminator, ignore_lines=ignore_lines) sql = ( "LOAD DATA LOCAL INFILE '{file_name}' {replace_param} " 'INTO TABLE {table_name} ' "FIELDS TERMINATED BY '{fields_terminator}' " "LINES TERMINATED BY '{line_terminator}' " 'IGNORE {ignore_lines} LINES ({column_names})'. format( file_name=file_to_load, replace_param=replace_arg, table_name=table_name, fields_terminator=fields_terminator, line_terminator=line_terminator, ignore_lines=ignore_lines, column_names=column_names_arg)) assert sql_command == sql def test_create_sql_for_load_data_terminated(csv_file): """Test TERMINATED BY param in generated MySQL LOAD command text """ file_name, terminated_by = csv_file rel_path = os.path.realpath(__file__) csv_file_path = '{}/{}'.format(os.path.dirname(rel_path), file_name) assert terminated_by == garcon_mysql_utils._get_line_terminator( csv_file_path) def test_create_sql_for_insert_or_replace_from_csv(table_name, columns_names): sql = garcon_mysql_utils.create_sql_for_insert_or_replace_from_csv( table_name, columns_names) assert sql == ( 'INSERT INTO testtable (column1, column2) ' 'VALUES (%s,%s) AS NEW ON DUPLICATE ' 'KEY UPDATE column1=NEW.column1, column2=NEW.column2')