File: test_json.py

package info (click to toggle)
python-flask-jwt-extended 4.7.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 592 kB
  • sloc: python: 4,279; makefile: 193; sh: 6
file content (138 lines) | stat: -rw-r--r-- 4,644 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import pytest
from flask import Flask
from flask import jsonify

from flask_jwt_extended import create_access_token
from flask_jwt_extended import create_refresh_token
from flask_jwt_extended import jwt_required
from flask_jwt_extended import JWTManager
from tests.utils import get_jwt_manager


@pytest.fixture(scope="function")
def app():
    app = Flask(__name__)
    app.config["JWT_SECRET_KEY"] = "foobarbaz"
    app.config["JWT_TOKEN_LOCATION"] = "json"
    JWTManager(app)

    @app.route("/protected", methods=["POST"])
    @jwt_required()
    def access_protected():
        return jsonify(foo="bar")

    @app.route("/refresh", methods=["POST"])
    @jwt_required(refresh=True)
    def refresh_protected():
        return jsonify(foo="bar")

    return app


def test_content_type(app):
    test_client = app.test_client()

    with app.test_request_context():
        access_token = create_access_token("username")
        refresh_token = create_refresh_token("username")

    data = {"access_token": access_token}
    response = test_client.post("/protected", data=data)
    expected_json = {"msg": "Invalid content-type. Must be application/json."}
    assert response.status_code == 401
    assert response.get_json() == expected_json

    data = {"refresh_token": refresh_token}
    response = test_client.post("/refresh", data=data)
    expected_json = {"msg": "Invalid content-type. Must be application/json."}
    assert response.status_code == 401
    assert response.get_json() == expected_json


def test_custom_body_key(app):
    app.config["JWT_JSON_KEY"] = "Foo"
    app.config["JWT_REFRESH_JSON_KEY"] = "Bar"
    test_client = app.test_client()

    with app.test_request_context():
        access_token = create_access_token("username")
        refresh_token = create_refresh_token("username")

    # Ensure 'default' keys no longer work
    data = {"access_token": access_token}
    response = test_client.post("/protected", json=data)
    assert response.status_code == 401
    assert response.get_json() == {"msg": 'Missing "Foo" key in json data.'}

    data = {"refresh_token": refresh_token}
    response = test_client.post("/refresh", json=data)
    assert response.status_code == 401
    assert response.get_json() == {"msg": 'Missing "Bar" key in json data.'}

    # Ensure new keys do work
    data = {"Foo": access_token}
    response = test_client.post("/protected", json=data)
    assert response.status_code == 200
    assert response.get_json() == {"foo": "bar"}

    data = {"Bar": refresh_token}
    response = test_client.post("/refresh", json=data)
    assert response.status_code == 200
    assert response.get_json() == {"foo": "bar"}


def test_missing_keys(app):
    test_client = app.test_client()
    jwtM = get_jwt_manager(app)
    headers = {"content-type": "application/json"}

    # Ensure 'default' no json response
    response = test_client.post("/protected", headers=headers)
    assert response.status_code == 401
    assert response.get_json() == {"msg": 'Missing "access_token" key in json data.'}

    # Test custom no json response
    @jwtM.unauthorized_loader
    def custom_response(err_str):
        return jsonify(foo="bar"), 201

    response = test_client.post("/protected", headers=headers)
    assert response.status_code == 201
    assert response.get_json() == {"foo": "bar"}


def test_defaults(app):
    test_client = app.test_client()

    with app.test_request_context():
        access_token = create_access_token("username")
        refresh_token = create_refresh_token("username")

    data = {"access_token": access_token}
    response = test_client.post("/protected", json=data)
    assert response.status_code == 200
    assert response.get_json() == {"foo": "bar"}

    data = {"refresh_token": refresh_token}
    response = test_client.post("/refresh", json=data)
    assert response.status_code == 200
    assert response.get_json() == {"foo": "bar"}


def test_custom_content_type(app):
    test_client = app.test_client()
    content_type = "application/json;charset=UTF-8"

    with app.test_request_context():
        access_token = create_access_token("username")
        refresh_token = create_refresh_token("username")

    data = {"access_token": access_token}
    response = test_client.post("/protected", json=data, content_type=content_type)
    assert response.status_code == 200
    assert response.get_json() == {"foo": "bar"}

    data = {"refresh_token": refresh_token}
    response = test_client.post("/refresh", json=data, content_type=content_type)
    assert response.status_code == 200
    assert response.get_json() == {"foo": "bar"}