Skip to content

Commit cfd0ae8

Browse files
committed
Adds test coverage
1 parent 183d367 commit cfd0ae8

File tree

4 files changed

+124
-15
lines changed

4 files changed

+124
-15
lines changed

poetry.lock

Lines changed: 86 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,15 @@ Flask-WTF = "^0.15.1"
3030
ipdb = "^0.13.9"
3131
pytest = "^6.2.4"
3232
pytest-black = "^0.3.12"
33+
pytest-cov = "^2.12.1"
3334
pytest-flake8 = "^1.0.7"
3435
pytest-flask = "^1.2.0"
3536
pytest-mock = "^3.6.1"
3637
tox = "^3.24.2"
3738

3839
[tool.pytest.ini_options]
3940
flake8-ignore = ["E501", "W503"]
40-
addopts = "--flake8 --black"
41+
addopts = "--flake8 --black --cov flask_simplelogin --cov-report term --cov-fail-under=70"
4142

4243
[tool.tox]
4344
legacy_tox_ini = """

tests/conftest.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import pytest
2-
from flask import Flask, jsonify, render_template
2+
from flask import Flask, jsonify, render_template, session
33
from flask.views import MethodView
44
from flask_simplelogin import SimpleLogin, login_required, get_username
5+
from itsdangerous import URLSafeTimedSerializer
56

67

78
@pytest.fixture
@@ -49,3 +50,18 @@ def get(self):
4950
myapp.add_url_rule("/protected", view_func=ProtectedView.as_view("protected"))
5051

5152
return myapp
53+
54+
55+
@pytest.fixture
56+
def csrf_token_for():
57+
"""Based on how Flask-WTF generates it on the fly:
58+
https://github.com/wtforms/flask-wtf/blob/main/src/flask_wtf/csrf.py#L54-L63
59+
"""
60+
61+
def generator(app):
62+
serilaizer = URLSafeTimedSerializer(
63+
app.config["SECRET_KEY"], salt="wtf-csrf-token"
64+
)
65+
return serilaizer.dumps(session["csrf_token"])
66+
67+
return generator

tests/test_app.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from unittest.mock import call
22

3-
from flask import session, url_for
4-
from itsdangerous import URLSafeTimedSerializer
3+
from flask import url_for
54

65
from flask_simplelogin import is_logged_in
76

@@ -52,29 +51,37 @@ def test_positive_redirect_to_allowed_host(app):
5251
assert response.status_code == 200
5352

5453

55-
def test_is_logged_in(app, client):
56-
def generate_csrf_token_form_value(app):
57-
"""Based on how Flask-WTF generates it on the fly:
58-
https://github.com/wtforms/flask-wtf/blob/main/src/flask_wtf/csrf.py#L54-L63
59-
"""
60-
return URLSafeTimedSerializer(
61-
app.config["SECRET_KEY"], salt="wtf-csrf-token"
62-
).dumps(session["csrf_token"])
63-
54+
def test_is_logged_in(app, client, csrf_token_for):
6455
client.get(url_for("simplelogin.login"))
6556
assert not is_logged_in()
6657
response = client.post(
6758
url_for("simplelogin.login"),
6859
data={
6960
"username": "admin",
7061
"password": "secret",
71-
"csrf_token": generate_csrf_token_form_value(app),
62+
"csrf_token": csrf_token_for(app),
7263
},
7364
)
7465
assert response.status_code == 302
7566
assert is_logged_in()
7667

7768

69+
def test_logout(app, client, csrf_token_for):
70+
client.get(url_for("simplelogin.login"))
71+
assert not is_logged_in()
72+
client.post(
73+
url_for("simplelogin.login"),
74+
data={
75+
"username": "admin",
76+
"password": "secret",
77+
"csrf_token": csrf_token_for(app),
78+
},
79+
)
80+
assert is_logged_in()
81+
client.get(url_for("simplelogin.logout"))
82+
assert not is_logged_in()
83+
84+
7885
def test_flash(app, mocker):
7986
mock_flash = mocker.patch("flask_simplelogin.flash")
8087
app.extensions["simplelogin"].flash("login_success")

0 commit comments

Comments
 (0)