from unittest.mock import Mock import pytest from labelaudit import config from labelaudit.logic import audit_persistence from labelaudit.logic import audit_prep_report from labelaudit.logic import report_generation from labelaudit.logic.result import Result from labelaudit.logic.stream_to_s3 import StreamToS3 fake_report = { 'auditStatus': 'in_progress', 'initiatedById': '888', 'reportLocation': 'some location', 'updatedTimestamp': '2015-06-09 14:30:36', 'vendorId': '5', 'youtubeAuditId': '3'} @pytest.fixture def turn_off_stream_to_s3(monkeypatch): class FakeClass(): def write_column_headers(fake): return True def write_batch_rows(fake, rows): return True def __exit__(): return None monkeypatch.setattr( StreamToS3, '__enter__', Mock(return_value=FakeClass())) monkeypatch.setattr(StreamToS3, '__exit__', Mock(return_value=None)) @pytest.fixture @pytest.mark.parametrize('turn_off_stream_to_s3', [('monkeypatch')], indirect=['turn_off_stream_to_s3']) def turn_off_all_resources(monkeypatch, turn_off_stream_to_s3, success_fetch_result): monkeypatch.setattr(config, 'NUM_RELEASES_WRITE_CSV', 8) monkeypatch.setattr( audit_prep_report, 'fetch', Mock(return_value=success_fetch_result)) monkeypatch.setattr( audit_persistence, 'update_report_status', Mock(return_value=Result(message='ok', status=200))) monkeypatch.setattr( report_generation, 'email_notification', Mock(return_value=None)) monkeypatch.setattr( audit_persistence, 'update', Mock(return_value=None)) @pytest.fixture def success_fetch_result(): fake_report_rows = { 'report_rows': [ {'oneA': 1, 'two': 2, 'three': 3}, {'oneB': 1, 'two': 2, 'three': 3}, {'oneC': 1, 'two': 2, 'three': 3}, {'oneD': 1, 'two': 2, 'three': 3}, {'oneE': 1, 'two': 2, 'three': 3}, {'oneF': 1, 'two': 2, 'three': 3}, {'oneG': 1, 'two': 2, 'three': 3}, {'oneH': 1, 'two': 2, 'three': 3}, {'oneI': 1, 'two': 2, 'three': 3}], 'total_records': 9} return Result(message=fake_report_rows, status=200) @pytest.fixture def error_fetch_result(): return Result(errors={'fault': 'foo'}, status=400) @pytest.mark.parametrize('turn_off_all_resources', [('monkeypatch')], indirect=['turn_off_all_resources']) def test_success_report_processing_calls_update_status(monkeypatch, turn_off_all_resources): res = report_generation.generate(fake_report) assert res is None assert audit_prep_report.fetch.called assert audit_persistence.update_report_status.called assert report_generation.email_notification.called @pytest.mark.parametrize('turn_off_all_resources', [('monkeypatch')], indirect=['turn_off_all_resources']) def test_success_report_calls_email_notification(monkeypatch, turn_off_all_resources): report_generation.generate(fake_report) assert report_generation.email_notification.called @pytest.mark.parametrize('turn_off_stream_to_s3', [('monkeypatch')], indirect=['turn_off_stream_to_s3']) def test_fail_to_get_report_data_raise_exception(monkeypatch, turn_off_stream_to_s3, error_fetch_result): monkeypatch.setattr(config, 'NUM_RELEASES_WRITE_CSV', 8) monkeypatch.setattr( audit_prep_report, 'fetch', Mock(return_value=error_fetch_result)) with pytest.raises(Exception): report_generation.generate(fake_report) def test_report_path_construction(monkeypatch): monkeypatch.setattr( audit_persistence, 'update', Mock(return_value=True)) fake_id = 3 report_generation.write_report_path( fake_id, 'bucket-name', 'folder/file.csv') audit_persistence.update.assert_called_with(fake_id, { 'reportLocation': 'bucket-name/folder/file.csv'})