Files

136 lines
3.8 KiB
Python

#!/usr/bin/env python
import socket
import warnings
import pytest
from flask import _request_ctx_stack
from ._internal import _determine_scope
from ._internal import _make_accept_header
from ._internal import _rewrite_server_name
from ._internal import deprecated
from .live_server import LiveServer
@pytest.fixture
def client(app):
"""A Flask test client. An instance of :class:`flask.testing.TestClient`
by default.
"""
with app.test_client() as client:
yield client
@pytest.fixture
def client_class(request, client):
"""Uses to set a ``client`` class attribute to current Flask test client::
@pytest.mark.usefixtures('client_class')
class TestView:
def login(self, email, password):
credentials = {'email': email, 'password': password}
return self.client.post(url_for('login'), data=credentials)
def test_login(self):
assert self.login('foo@example.com', 'pass').status_code == 200
"""
if request.cls is not None:
request.cls.client = client
@pytest.fixture(scope=_determine_scope)
def live_server(request, app, pytestconfig):
"""Run application in a separate process.
When the ``live_server`` fixture is applied, the ``url_for`` function
works as expected::
def test_server_is_up_and_running(live_server):
index_url = url_for('index', _external=True)
assert index_url == 'http://localhost:5000/'
res = urllib2.urlopen(index_url)
assert res.code == 200
"""
# Set or get a port
port = app.config.get("LIVESERVER_PORT", None)
if not port:
port = pytestconfig.getvalue("live_server_port")
if port == 0:
# Bind to an open port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 0))
port = s.getsockname()[1]
s.close()
host = pytestconfig.getvalue("live_server_host")
# Explicitly set application ``SERVER_NAME`` for test suite
original_server_name = app.config["SERVER_NAME"] or "localhost"
final_server_name = _rewrite_server_name(original_server_name, str(port))
app.config["SERVER_NAME"] = final_server_name
wait = request.config.getvalue("live_server_wait")
clean_stop = request.config.getvalue("live_server_clean_stop")
server = LiveServer(app, host, port, wait, clean_stop)
if request.config.getvalue("start_live_server"):
server.start()
request.addfinalizer(server.stop)
yield server
if original_server_name is not None:
app.config["SERVER_NAME"] = original_server_name
@pytest.fixture
def config(app):
"""An application config."""
return app.config
@pytest.fixture
def request_ctx(app):
"""The request context which contains all request relevant information,
e.g. `session`, `g`, `flashes`, etc.
"""
warnings.warn(
"In Werzeug 2.0.0, the Client request methods "
"(client.get, client.post) always return an instance of TestResponse. This "
"class provides a reference to the request object through 'response.request' "
"The fixture 'request_ctx' is deprecated and will be removed in the future, using TestResponse.request "
"is the prefered way.",
DeprecationWarning,
stacklevel=2,
)
return _request_ctx_stack.top
@pytest.fixture(params=["application/json", "text/html"])
def mimetype(request):
return request.param
@pytest.fixture
def accept_mimetype(mimetype):
return _make_accept_header(mimetype)
@pytest.fixture
def accept_json(request):
return _make_accept_header("application/json")
@pytest.fixture
def accept_jsonp():
return _make_accept_header("application/json-p")
@pytest.fixture(params=["*", "*/*"])
def accept_any(request):
return _make_accept_header(request.param)