"""Unit tests for common module for streams totals lambda functions.""" import mock import pytest import consts # noqa import streams_placements _vendor_csv_reader = [ ['S:10245:1:Spotify:W', '1', '1569', '286', '', 'spotify', 'link1', 'title1', '23523523', 'USJE61010422', 'artist1', '', '2017-03-14', '2017-03-20'], ['S:10246:1:Spotify:W', '1', '1569', '286', '', 'spotify', 'link1', 'title2', '23523523', 'USJE61010422', 'artist2', '', '2017-03-14', '2017-03-20'], ] _vendor_columns = [ 'vendor_placement_key', 'order_number', 'streams', 'storeid', 'playlist_title', 'playlist_author', 'playlist_link', 'track_title', 'upc', 'isrc', 'artist', 'date_added', 'start_date', 'end_date'] _track_csv_reader = [ ['L:10058:1:Spotify:W:QMDA71398451', '1', '1129', '286', '', 'spotify', 'test_link1', '', '2017-03-14', '2017-03-20'], ['L:10059:1:Spotify:W:QMDA71398452', '1', '1129', '286', '', 'spotify', 'test_link2', '', '2017-03-14', '2017-03-20'] ] _track_columns = columns = [ 'track_placement_key', 'order_number', 'streams', 'storeid', 'playlist_title', 'playlist_author', 'playlist_link', 'date_added', 'start_date', 'end_date'] @pytest.mark.parametrize( ['placements_type', 'processing_data', 'csv_reader_data', 'columns'], [(consts.VENDOR, ['row1', 'row2'], _vendor_csv_reader, _vendor_columns), (consts.TRACK, ['row1', 'row2'], _track_csv_reader, _track_columns)] ) @mock.patch('csv.reader') @mock.patch('smart_open.smart_open') @mock.patch( 'sosmodels.streams_track_placements.StreamsTrackPlacementsSpotify') @mock.patch( 'sosmodels.streams_vendor_placements.StreamsVendorPlacementsSpotify') def test_load( StreamsVendorPlacements_mock, StreamsTrackPlacements_mock, smart_open_mock, csv_reader_mock, placements_type, processing_data, csv_reader_data, columns): """Test load function.""" # mocking rows_amount = len(processing_data) if placements_type == consts.VENDOR: placements_model_mock = StreamsVendorPlacements_mock else: placements_model_mock = StreamsTrackPlacements_mock batch_write_mock = mock.Mock() batch_write_context_manager_mock = mock.Mock() placements_model_mock.batch_write.return_value = ( batch_write_context_manager_mock) batch_write_enter_mock = mock.Mock() batch_write_enter_mock.return_value = batch_write_mock batch_write_exit_mock = mock.Mock() batch_write_context_manager_mock.__enter__ = batch_write_enter_mock batch_write_context_manager_mock.__exit__ = batch_write_exit_mock context_manager_mock = mock.Mock() smart_open_mock.return_value = context_manager_mock enter_mock = mock.Mock() enter_mock.return_value = processing_data batch_write_exit_mock = mock.Mock() context_manager_mock.__enter__ = enter_mock context_manager_mock.__exit__ = batch_write_exit_mock csv_reader_mock.side_effect = [csv_reader_data] item_mock = mock.Mock() placements_model_mock.side_effect = ( [item_mock] * len(processing_data)) filename_mock = 'somedir/spotify/somename' # test function mock.call streams_placements.load(filename_mock, placements_type) # checking for row in csv_reader_data: row = dict(zip(columns, row)) item_data = { 'order_number': int(row['order_number']), 'streams': int(row['streams']), 'storeid': int(row['storeid']), 'playlist_title': row['playlist_title'].decode('utf8'), 'playlist_author': row['playlist_author'].decode('utf8'), 'playlist_link': row['playlist_link'].decode('utf8'), 'date_added': row['date_added'].decode('utf8'), 'start_date': row['start_date'].decode('utf8'), 'end_date': row['end_date'].decode('utf8') } if placements_type == consts.VENDOR: item_data['vendor_placement_key'] = row[ 'vendor_placement_key'] item_data['upc'] = row['upc'].decode('utf8') item_data['track_title'] = row[ 'track_title'].decode('utf8') item_data['isrc'] = row['isrc'].decode('utf8') item_data['artist'] = row['artist'].decode('utf8') else: item_data['track_placement_key'] = row[ 'track_placement_key'] placements_model_mock.assert_any_call(**item_data) batch_write_mock.save.assert_has_calls( [mock.call(item_mock)] * rows_amount) def test_load_fail(): """Test load function fail.""" filename_mock = mock.Mock() with pytest.raises(TypeError): streams_placements.load(filename_mock, 'incorrect type')