"""Tests for general SQL utility functions.""" from argparse import ArgumentTypeError import re from unittest.mock import ANY from unittest.mock import patch import pytest import flows.queries @pytest.fixture(params=[ ['123456789012', '123456789013'], [], ['01234565'] # leading zero is valid for upc ]) def upcs(request): """Set upcs fixture.""" return request.param def test_sql_upcs_condition_in(upcs): """Test sql_upcs_condition_in function.""" upc_condition = flows.queries.sql_upcs_condition_in(upcs) if upcs: expected_upc_condition = 'upc IN ({}) AND '.format( ', '.join("'%s'" % upc for upc in upcs)) else: expected_upc_condition = '' assert upc_condition == expected_upc_condition def test_sql_upcs_condition_in_non_default_column(upcs): """Test _upcs_condition function.""" column_name = 'sub.display_upc' upc_condition = flows.queries.sql_upcs_condition_in( upcs, column_name=column_name) if upcs: expected_upc_condition = '{} IN ({}) AND '.format( column_name, ', '.join("'%s'" % upc for upc in upcs)) else: expected_upc_condition = '' assert upc_condition == expected_upc_condition def test_sq_upcs_condition_in_failure(): """Test _upcs_condition function failure.""" incorrect_upcs = ['123456789012', 'abc456789012'] with pytest.raises(ArgumentTypeError): flows.queries.sql_upcs_condition_in(incorrect_upcs) @patch('flows.queries.sql_upcs_condition_in') def test_upc_vendor_id_lookup(sql_upcs_condition_in, upc_list): """Test upc_vendor_id_lookup sql query generation function.""" upc_condition = ' some upc where in condition ' len_condition = str(len(upc_list)) sql_upcs_condition_in.return_value = upc_condition limit_regex = re.compile( 'limit\s+{len}'.format(len=len_condition), re.IGNORECASE) result = flows.queries.upc_vendor_id_lookup(upc_list) assert upc_condition in result assert limit_regex.search(result) is not None sql_upcs_condition_in.assert_called_with(upc_list, column_name=ANY)