From 8bdf820e9b9c166883ef9717e127ba46ebe43cae Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 10 Jan 2018 13:53:45 -0800 Subject: [PATCH] reset standard os env after each test --- tests/conftest.py | 42 +++++++++++++++++++++++++++++++++++++++--- tests/test_cli.py | 19 ++++--------------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 3a8ae69e..486d4b0a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,16 +6,52 @@ :copyright: (c) 2015 by the Flask Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ -import flask import gc import os -import sys import pkgutil -import pytest +import sys import textwrap + +import pytest +from _pytest import monkeypatch + +import flask from flask import Flask as _Flask +@pytest.fixture(scope='session', autouse=True) +def _standard_os_environ(): + """Set up ``os.environ`` at the start of the test session to have + standard values. Returns a list of operations that is used by + :func:`._reset_os_environ` after each test. + """ + mp = monkeypatch.MonkeyPatch() + out = ( + (os.environ, 'FLASK_APP', monkeypatch.notset), + (os.environ, 'FLASK_ENV', monkeypatch.notset), + (os.environ, 'FLASK_DEBUG', monkeypatch.notset), + (os.environ, 'FLASK_RUN_FROM_CLI', monkeypatch.notset), + (os.environ, 'WERKZEUG_RUN_MAIN', monkeypatch.notset), + ) + + for _, key, value in out: + if value is monkeypatch.notset: + mp.delenv(key, False) + else: + mp.setenv(key, value) + + yield out + mp.undo() + + +@pytest.fixture(autouse=True) +def _reset_os_environ(monkeypatch, _standard_os_environ): + """Reset ``os.environ`` to the standard environ after each test, + in case a test changed something without cleaning up. + """ + monkeypatch._setitem.extend(_standard_os_environ) + + class Flask(_Flask): testing = True secret_key = 'test key' diff --git a/tests/test_cli.py b/tests/test_cli.py index 811ef0c8..d9216f3d 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -23,9 +23,11 @@ from _pytest.monkeypatch import notset from click.testing import CliRunner from flask import Flask, current_app -from flask.cli import AppGroup, FlaskGroup, NoAppException, ScriptInfo, dotenv, \ - find_best_app, get_version, load_dotenv, locate_app, prepare_import, \ +from flask.cli import ( + AppGroup, FlaskGroup, NoAppException, ScriptInfo, dotenv, + find_best_app, get_version, load_dotenv, locate_app, prepare_import, with_appcontext +) cwd = os.getcwd() test_path = os.path.abspath(os.path.join( @@ -33,19 +35,6 @@ test_path = os.path.abspath(os.path.join( )) -@pytest.fixture(autouse=True) -def manage_os_environ(monkeypatch): - # can't use monkeypatch.delitem since we don't want to restore a value - os.environ.pop('FLASK_APP', None) - os.environ.pop('FLASK_DEBUG', None) - # use monkeypatch internals to force-delete environ keys - monkeypatch._setitem.extend(( - (os.environ, 'FLASK_APP', notset), - (os.environ, 'FLASK_DEBUG', notset), - (os.environ, 'FLASK_RUN_FROM_CLI', notset), - )) - - @pytest.fixture def runner(): return CliRunner()