def create_client_mock(cache=TEST_SPEC_ALL): """Create an APIClient mock from a cache of the API spec Parameters ---------- cache : str, optional Location of the API spec on the local filesystem Returns ------- mock.Mock A `Mock` object which looks like an APIClient and which will error if any method calls have non-existent / misspelled parameters """ # Create a client from the cache. We'll use this for auto-speccing. real_client = APIClient(local_api_spec=cache, api_key='none', resources='all') real_client._feature_flags = {'noflag': None} if hasattr(real_client, 'channels'): # Deleting "channels" causes the client to fall back on # regular polling for completion, which greatly eases testing. delattr(real_client, 'channels') # Prevent the client from trying to talk to the real API when autospeccing with mock.patch('requests.Session', mock.MagicMock): mock_client = mock.create_autospec(real_client, spec_set=True) return mock_client
def test_dataframe_to_civis(self, m_civis_file_to_table, m_file_to_civis, _m_get_api_spec): df = pd.DataFrame([[1, 2, 3], [2, 3, 4]]) m_file_to_civis.return_value = 42 mock_future = mock.create_autospec(civis.futures.CivisFuture, spec_set=True) m_civis_file_to_table.return_value = mock_future # use a mock to spy on the dataframe's to_csv method so we can # check on its calls without impeding its actual usage. with mock.patch.object(df, 'to_csv', wraps=df.to_csv) as m_to_csv: result = civis.io.dataframe_to_civis( df, 'redshift-general', 'scratch.api_client_test_fixture', existing_table_rows='truncate', client=self.mock_client) assert result == mock_future # ANY here represents the path to which the dataframe was written # Since it's a temporary directory we don't know/care exactly what # it is m_to_csv.assert_called_once_with(mock.ANY, encoding='utf-8', index=False) out_path = m_to_csv.call_args.args[0] m_file_to_civis.assert_called_once_with( mock.ANY, 'api_client_test_fixture', client=self.mock_client ) # Ensure that the file written to above is the same file as that # uploaded to Civis in this call assert m_file_to_civis.call_args.args[0] == out_path m_civis_file_to_table.assert_called_once_with( m_file_to_civis.return_value, 'redshift-general', 'scratch.api_client_test_fixture', client=self.mock_client, max_errors=None, existing_table_rows="truncate", diststyle=None, distkey=None, sortkey1=None, sortkey2=None, delimiter=',', primary_keys=None, last_modified_keys=None, escaped=False, execution='immediate', headers=True, credential_id=None, polling_interval=None, hidden=True)
def test_csv_to_civis(self, m_civis_file_to_table, m_file_to_civis, _m_get_api_spec): mock_file_id = 42 m_file_to_civis.return_value = mock_file_id mock_future = mock.create_autospec(civis.futures.CivisFuture, spec_set=True) m_civis_file_to_table.return_value = mock_future table = "scratch.api_client_test_fixture" database = 'redshift-general' fname = 'a/tempfile' with mock.patch.object(civis.io._tables, 'open', mock.mock_open(read_data='some,test,data'), create=True) as m_open: result = civis.io.csv_to_civis(fname, database, table, client=self.mock_client, existing_table_rows='truncate') m_file_to_civis.assert_called_once_with(m_open.return_value, 'tempfile', client=self.mock_client) assert result == mock_future m_civis_file_to_table.assert_called_once_with( mock_file_id, database, table, client=self.mock_client, max_errors=None, existing_table_rows='truncate', diststyle=None, distkey=None, sortkey1=None, sortkey2=None, delimiter=",", headers=None, primary_keys=None, last_modified_keys=None, escaped=False, execution='immediate', credential_id=None, polling_interval=None, hidden=True )