"""Tests for app module with a top-level script environment.""" from flexmock import flexmock import pytest import raven import app from availability_etl import config from availability_etl import extract from availability_etl import load from availability_etl import transform from availability_etl import utils @pytest.mark.parametrize('raises_exception', (True, False)) def test_main_script_function(raises_exception): """Test main captures and raises any exception.""" data = [] exc_cls = ValueError sentry_client = flexmock() (flexmock(raven) .should_receive('Client') .with_args(config.SENTRY) .and_return(sentry_client) .once() .ordered()) # Mock transformation and extraction steps. (flexmock(extract) .should_receive('extracted') .and_return(data) .once() .ordered()) (flexmock(transform) .should_receive('transformed') .with_args(data) .and_return(data) .once() .ordered()) # Mock loading step to raise or not depending on test case parameter. if raises_exception: (flexmock(load) .should_receive('load') .with_args(data) .and_raise(exc_cls) .once() .ordered()) (flexmock(sentry_client) .should_receive('captureException') .once() .ordered()) else: (flexmock(load) .should_receive('load') .with_args(data) .once() .ordered()) (flexmock(utils) .should_receive('cleanup') .once() .ordered()) if raises_exception: with pytest.raises(exc_cls): app.main() else: app.main()