Skip to main content

FlaskTester - Pytest fixtures for Flask internal and external authenticated tests

This package allows to run authenticated tests against a Flask application, either with internal Flask tests (aka test_client) or external tests (with requests which performs actual HTTP requests), including password and token authentication and per-user cookies.

Only one set of tests is needed, switching from internal to external is achieved by setting an environment variable.

Status Tests Coverage Issues Python Version Badges License

Usage

Install package with pip install FlaskTester or equivalent.

The following test creates a local fixture with 2 users identified by a password, and retrieves tokens for both users using a /login route provided by the application. It then proceeds to run authenticated requests against the /admin route.

import pytest
from FlaskTester import ft_authenticator, ft_client
import secret

def authHook(api, user: str, pwd: str|None):
    if pwd is not None:  # get a token when a login/password is provided
        res = api.get("/login", login=user, auth="basic", status=200)
        api.setToken(user, res.json["token"])
    else:  # remove token
        api.setToken(user, None)

@pytest.fixture
def app(ft_client):
    # register authentication hook
    ft_client.setHook(authHook)
    # add test passwords for Calvin and Hobbes (must be consistent with app!)
    ft_client.setPass("calvin", secret.PASSES["calvin"])
    ft_client.setPass("hobbes", secret.PASSES["hobbes"])
    # also set a cookie
    ft_client.setCookie("hobbes", "lang", "fr")
    ft_client.setCookie("calvin", "lang", "en")
    # return working client
    yield ft_client

def test_app_admin(app):
    app.get("/admin", login=None, status=401)
    for auth in ["bearer", "basic", "param"]:
        res = app.get("/admin", login="calvin", auth=auth, status=200)
        assert res.json["user"] == "calvin" and res.json["isadmin"]
        res = app.get("/admin", login="hobbes", auth=auth, status=403)
        assert 'not in group "ADMIN"' in res.text

This can be run against a local or remote server:

export TEST_SEED="some-random-data"              # shared test seed
flask --app app:app run &                        # start flask app
pid=$!                                           # keep pid
export FLASK_TESTER_APP="http://localhost:5000"  # set app url, local or remote
pytest test.py                                   # run external tests
kill $pid                                        # stop app with pid

Or locally with the Flask internal test infrastructure:

export FLASK_TESTER_APP="app:app"                # set app package
pytest test.py                                   # run internal tests

The above test runs with tests/app.py Flask REST application back-end with password and token authentication based on FlaskSimpleAuth. The code uses 23 lines of Python for implementing password (basic and parameters) and token authentications, admin group authorization, and routes for token generation (2), identity tests (2) and an incredible open cookie-based translation service.

See the documentation.

License

This code is Public Domain.

All software has bug, this is software, hence… Beware that you may lose your hairs or your friends because of it. If you like it, feel free to send a postcard to the author.

Versions

Packages are distributed from PyPI, sources are available on GitHub, please report any issues.

Release files for FlaskTester 5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for FlaskTester 5.1
File Size Uploaded
flasktester-5.1.tar.gz 11.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for FlaskTester 5.1
File Interpreter ABI Platform
flasktester-5.1-py3-none-any.whl Python 3 none any Details

Total release size: 21.6 kB

Release files / flasktester-5.1.tar.gz

Download URL flasktester-5.1.tar.gz
Size 11.9 kB
Tags Source
SHA-256 checksum
How to use checksums
1eb6b2f16654923295bdca2d84c9c268aec75fff50803c957b24d95f2c08dd04
BLAKE2b-256 checksum
How to use checksums
181f26869968d26ccdbed9fa4ac6f1830b5cf3350ac08a77c1dad4c6cc753347
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release files / flasktester-5.1-py3-none-any.whl

Download URL flasktester-5.1-py3-none-any.whl
Size 9.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
273445b3cf63217ff6fa47ce0c66f31db8e11fc332bf2f3fc1049bfc26bcf40f
BLAKE2b-256 checksum
How to use checksums
e7131701afdc392395d4cfc2528ceeb08968cc938f928a113a040be3a19547fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release history Release notifications | RSS feed

This release

5.1 This release

2 release files

5.0

2 release files

4.3

2 release files

4.2

2 release files

4.1

2 release files

4.0

2 release files

3.6

2 release files

3.5

2 release files

3.4

2 release files

3.3

2 release files

3.2

2 release files

3.1

2 release files

3.0

2 release files

2.0

2 release files

1.4

2 release files

1.3

2 release files

1.2

2 release files

1.1

2 release files

1.0

2 release files

0.9

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page