Switch test_app generation over to use py.test fixtures.
[mediagoblin.git] / mediagoblin / tests / tools.py
index efe562c75058c24d565453abbf9d694463d41d56..2e47cb5c234d69db109519a183cc27ce8223d29a 100644 (file)
@@ -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