diff options
author | Christopher Allan Webber <cwebber@dustycloud.org> | 2013-04-04 19:23:04 -0500 |
---|---|---|
committer | Christopher Allan Webber <cwebber@dustycloud.org> | 2013-04-04 19:23:04 -0500 |
commit | 5c2ece7401723486d76ea0fcd2f99ba4d1002504 (patch) | |
tree | a71a2bf9b15bd2805e344362e0bd265d7a124910 /mediagoblin/tests/tools.py | |
parent | e11c62a0efeb053f71f8ab0793c7399ce8b0758d (diff) | |
download | mediagoblin-5c2ece7401723486d76ea0fcd2f99ba4d1002504.tar.lz mediagoblin-5c2ece7401723486d76ea0fcd2f99ba4d1002504.tar.xz mediagoblin-5c2ece7401723486d76ea0fcd2f99ba4d1002504.zip |
Switch test_app generation over to use py.test fixtures.
By doing this, we can take advantage of py.test's ability to create
temporary directories that are then cleaned up later during testing.
This helps for sandboxing things.
This also involves a ton of changes:
- Changing the get_app stuff appropriately, getting rid of the
setup_fresh_app decorator
- Making said fixture
- Switching over a billion tests to use it
Diffstat (limited to 'mediagoblin/tests/tools.py')
-rw-r--r-- | mediagoblin/tests/tools.py | 79 |
1 files changed, 25 insertions, 54 deletions
diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py index efe562c7..2e47cb5c 100644 --- a/mediagoblin/tests/tools.py +++ b/mediagoblin/tests/tools.py @@ -43,8 +43,6 @@ TEST_APP_CONFIG = pkg_resources.resource_filename( 'mediagoblin.tests', 'test_mgoblin_app.ini') TEST_USER_DEV = pkg_resources.resource_filename( 'mediagoblin.tests', 'test_user_dev') -MGOBLIN_APP = None -OLD_MGOBLIN_APP_CONFIGS = (None, None) USER_DEV_DIRECTORIES_TO_SETUP = [ @@ -105,10 +103,30 @@ def suicide_if_bad_celery_environ(): raise BadCeleryEnviron(BAD_CELERY_MESSAGE) -def get_app(paste_config=None, mgoblin_config=None, dump_old_app=True): +def get_app(request, paste_config=None, mgoblin_config=None): + """Create a MediaGoblin app for testing. + + Args: + - request: Not an http request, but a pytest fixture request. We + use this to make temporary directories that pytest + automatically cleans up as needed. + - paste_config: particular paste config used by this application. + - mgoblin_config: particular mediagoblin config used by this + application. + """ paste_config = paste_config or TEST_SERVER_CONFIG mgoblin_config = mgoblin_config or TEST_APP_CONFIG + # This is the directory we're copying the paste/mgoblin config stuff into + run_dir = request.config._tmpdirhandler.mktemp( + 'mgoblin_app', numbered=True) + user_dev_dir = run_dir.mkdir('test_user_dev').strpath + + new_paste_config = run_dir.join('paste.ini').strpath + new_mgoblin_config = run_dir.join('mediagoblin.ini').strpath + shutil.copyfile(paste_config, new_paste_config) + shutil.copyfile(mgoblin_config, new_mgoblin_config) + suicide_if_bad_celery_environ() # Make sure we've turned on testing @@ -117,32 +135,16 @@ def get_app(paste_config=None, mgoblin_config=None, dump_old_app=True): # Leave this imported as it sets up celery. from mediagoblin.init.celery import from_tests - global MGOBLIN_APP - - # Just return the old app if that exists and it's okay to set up - # and return - # - # ...Man I can't wait till we get rid of paste configs in tests. - global OLD_MGOBLIN_APP_CONFIGS - old_paste, old_mgoblin = OLD_MGOBLIN_APP_CONFIGS - - if MGOBLIN_APP and not dump_old_app \ - and old_paste == paste_config and old_mgoblin == mgoblin_config: - return MGOBLIN_APP - Session.rollback() Session.remove() - # Remove and reinstall user_dev directories - if os.path.exists(TEST_USER_DEV): - shutil.rmtree(TEST_USER_DEV) - + # install user_dev directories for directory in USER_DEV_DIRECTORIES_TO_SETUP: - full_dir = os.path.join(TEST_USER_DEV, directory) + full_dir = os.path.join(user_dev_dir, directory) os.makedirs(full_dir) # Get app config - global_config, validation_result = read_mediagoblin_config(TEST_APP_CONFIG) + global_config, validation_result = read_mediagoblin_config(new_mgoblin_config) app_config = global_config['mediagoblin'] # Run database setup/migrations @@ -150,7 +152,7 @@ def get_app(paste_config=None, mgoblin_config=None, dump_old_app=True): # setup app and return test_app = loadapp( - 'config:' + TEST_SERVER_CONFIG) + 'config:' + new_paste_config) # Re-setup celery setup_celery_app(app_config, global_config) @@ -162,41 +164,10 @@ def get_app(paste_config=None, mgoblin_config=None, dump_old_app=True): mg_globals.app.meddleware.insert(0, TestingMeddleware(mg_globals.app)) app = TestApp(test_app) - MGOBLIN_APP = app - - # Make sure we can see if this app matches the next app if not - # re-setting-up - OLD_MGOBLIN_APP_CONFIGS = (paste_config, mgoblin_config) return app -class SetupFreshApp(object): - """ - Decorator to setup a fresh test application for this function. - - Cleans out test buckets and passes in a new, fresh test_app. - """ - def __init__(self, paste_config, mgoblin_config, dump_old_app=True): - self.paste_config = paste_config - self.mgoblin_config = mgoblin_config - self.dump_old_app = dump_old_app - - def __call__(self, func): - @wraps(func) - def wrapper(*args, **kwargs): - test_app = get_app( - paste_config=self.paste_config, - mgoblin_config=self.mgoblin_config, - dump_old_app=self.dump_old_app) - testing.clear_test_buckets() - return func(test_app, *args, **kwargs) - - return wrapper - -setup_fresh_app = SetupFreshApp(TEST_SERVER_CONFIG, TEST_APP_CONFIG) - - def install_fixtures_simple(db, fixtures): """ Very simply install fixtures in the database |