"""BaseFlow tests.""" from unittest.mock import call, MagicMock, patch import boto3 from garcon import activity import pytest from dim_refresh_etl.flows import base from dim_refresh_etl.util import environment @patch('garcon.activity.create') def test_init(mock_activity): """Test BaseFlow initialisation.""" flow = base.BaseFlow('name', '1.0') assert flow.name == 'name' assert flow.version == '1.0' assert mock_activity.called @pytest.mark.parametrize( 'env, expected_domain', [ (environment.DEV, 'dev'), (environment.TEST, 'dev'), (environment.SHADOW, 'dev'), (environment.PROD, 'prod_dim_refresh'), (environment.QA, 'qa_dim_refresh') ] ) def test_domain(monkeypatch, env, expected_domain): """Test domain is set by Flow appropriately.""" # if environment dev, domain is dev monkeypatch.setattr(base.environment, 'name', env) flow = base.BaseFlow('name', '1.0') assert flow.domain == expected_domain @patch('dim_refresh_etl.util.sentry_utils.sentry_sdk') @patch('garcon.activity.create') @patch('dim_refresh_etl.flows.base.logger') def test_flow_base_exception( mock_logging, mock_create, mock_sentry): """Test FlowBase default on_exception logs to actor.logger.""" flow = base.BaseFlow('name', 'version') # Non Activity calls FlowBase logger actor_mock = MagicMock() flow.on_exception(actor_mock, 'exception') mock_logging.error.assert_called_with('exception', exc_info=True) # Assert Activity error calls activity's own logger client = boto3.client('swf', 'us-east-1') activity_obj = activity.Activity(client) on_exception_mock = MagicMock() activity_obj.logger.error = on_exception_mock flow.on_exception(activity_obj, 'exception') on_exception_mock.assert_called_with('exception', exc_info=True) # Sentry called if DSN is an os var with patch.dict('os.environ', {'SENTRY_DSN': 'https://sentryblah.com'}): flow.on_exception(MagicMock(), 'exception') mock_sentry.assert_has_calls([call.capture_exception]) def test_decider(): """Test decider raises NotImplementedError.""" flow = base.BaseFlow('name', 'version') with pytest.raises(NotImplementedError): flow.decider('schedule', {}) def test_workflow_id(): """Test workflow_id raises NotImplementedError.""" flow = base.BaseFlow('name', 'version') with pytest.raises(NotImplementedError): flow.workflow_id({})