|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
tests
|
|
|
|
~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
Tests Flask itself. The majority of Flask is already tested
|
|
|
|
as part of Werkzeug.
|
|
|
|
|
|
|
|
:copyright: (c) 2014 by Armin Ronacher.
|
|
|
|
:license: BSD, see LICENSE for more details.
|
|
|
|
"""
|
|
|
|
|
|
|
|
from __future__ import print_function
|
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import warnings
|
|
|
|
from functools import update_wrapper
|
|
|
|
from contextlib import contextmanager
|
|
|
|
from flask._compat import StringIO
|
|
|
|
|
|
|
|
|
|
|
|
def add_to_path(path):
|
|
|
|
"""Adds an entry to sys.path if it's not already there. This does
|
|
|
|
not append it but moves it to the front so that we can be sure it
|
|
|
|
is loaded.
|
|
|
|
"""
|
|
|
|
if not os.path.isdir(path):
|
|
|
|
raise RuntimeError('Tried to add nonexisting path')
|
|
|
|
|
|
|
|
def _samefile(x, y):
|
|
|
|
if x == y:
|
|
|
|
return True
|
|
|
|
try:
|
|
|
|
return os.path.samefile(x, y)
|
|
|
|
except (IOError, OSError, AttributeError):
|
|
|
|
# Windows has no samefile
|
|
|
|
return False
|
|
|
|
sys.path[:] = [x for x in sys.path if not _samefile(path, x)]
|
|
|
|
sys.path.insert(0, path)
|
|
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
|
|
|
def catch_warnings():
|
|
|
|
"""Catch warnings in a with block in a list"""
|
|
|
|
# make sure deprecation warnings are active in tests
|
|
|
|
warnings.simplefilter('default', category=DeprecationWarning)
|
|
|
|
|
|
|
|
filters = warnings.filters
|
|
|
|
warnings.filters = filters[:]
|
|
|
|
old_showwarning = warnings.showwarning
|
|
|
|
log = []
|
|
|
|
|
|
|
|
def showwarning(message, category, filename, lineno, file=None, line=None):
|
|
|
|
log.append(locals())
|
|
|
|
try:
|
|
|
|
warnings.showwarning = showwarning
|
|
|
|
yield log
|
|
|
|
finally:
|
|
|
|
warnings.filters = filters
|
|
|
|
warnings.showwarning = old_showwarning
|
|
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
|
|
|
def catch_stderr():
|
|
|
|
"""Catch stderr in a StringIO"""
|
|
|
|
old_stderr = sys.stderr
|
|
|
|
sys.stderr = rv = StringIO()
|
|
|
|
try:
|
|
|
|
yield rv
|
|
|
|
finally:
|
|
|
|
sys.stderr = old_stderr
|
|
|
|
|
|
|
|
|
|
|
|
def emits_module_deprecation_warning(f):
|
|
|
|
def new_f(self, *args, **kwargs):
|
|
|
|
with catch_warnings() as log:
|
|
|
|
f(self, *args, **kwargs)
|
|
|
|
assert log, 'expected deprecation warning'
|
|
|
|
for entry in log:
|
|
|
|
assert 'Modules are deprecated' in str(entry['message'])
|
|
|
|
return update_wrapper(new_f, f)
|