From 548e3ab30ae7c7f315dc7d387b681b0e54ca233e Mon Sep 17 00:00:00 2001 From: Fabien Coelho Date: Sat, 10 Aug 2024 03:05:58 +0200 Subject: [PATCH] add json/data merging --- FlaskTester.py | 12 +++++++----- docs/versions.md | 1 + tests/app2.py | 6 +++++- tests/test_app2.py | 9 +++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/FlaskTester.py b/FlaskTester.py index 1ff56d6..0ba2177 100755 --- a/FlaskTester.py +++ b/FlaskTester.py @@ -348,11 +348,13 @@ def request(self, method: str, path: str, status: int|None = None, content: str| cookies.update(kwargs["cookies"]) del kwargs["cookies"] - # FIXME allow or forbid? - # if "json" in kwargs and "data" in kwargs: - # log.warning("mix of json and data parameters in request") + # this is forbidden by Flask client + if "json" in kwargs and "data" in kwargs: + # merge into data to possibly keep uploads + kwargs["data"].update(kwargs["json"]) + del kwargs["json"] - # convert json parameters + # convert json parameters to json if "json" in kwargs: json_param = kwargs["json"] assert isinstance(json_param, dict) @@ -368,7 +370,7 @@ def request(self, method: str, path: str, status: int|None = None, content: str| else: # pydantic or standard dataclasses? json_param[name] = dataclasses.asdict(val) - # convert data parameters + # convert data parameters to simple strings if "data" in kwargs: data_param = kwargs["data"] assert isinstance(data_param, dict) diff --git a/docs/versions.md b/docs/versions.md index 0ed77fe..5512fbc 100644 --- a/docs/versions.md +++ b/docs/versions.md @@ -15,6 +15,7 @@ Improve comments. Activate _Python 3.13_ and _Pypy 3.10_ in GitHub CI. Restrict CI to _main_ branch. Add explicit `bcrypt` dependency for tests. +Allow mixing `json` and `data` parameters by merging into `data`. ## 4.2 on 2024-07-28 diff --git a/tests/app2.py b/tests/app2.py index ec1371f..f048777 100644 --- a/tests/app2.py +++ b/tests/app2.py @@ -16,7 +16,7 @@ def create_app(): app.get_user_pass(PASSDB.get) app.group_check("admin", ADMIN.__contains__) - # 3 routes + # 4 routes @app.get("/open", authorize="OPEN") def get_no_auth(lang: fsa.Cookie = "de"): return fsa.jsonify(HELLO.get(lang, "Hey")) @@ -29,4 +29,8 @@ def get_authenticated(user: fsa.CurrentUser, lang: fsa.Cookie = "de"): def get_only_admin(): return fsa.jsonify("Salut administrateur !") + @app.get("/add", authorize="OPEN") + def get_add(i: int, j: int): + return {"sum": i + j} + return app diff --git a/tests/test_app2.py b/tests/test_app2.py index be7c0e7..bcb93c4 100644 --- a/tests/test_app2.py +++ b/tests/test_app2.py @@ -26,3 +26,12 @@ def test_something(app): app.get("/open", 200, "Hello", login="calvin", auth="none") app.get("/open", 200, "Bonjour", login="hobbes", auth="none") app.get("/open", 200, "Guten Tag", login=None) + +def test_params(app): + res = app.get("/add", 200, data={"i": 39, "j": 3}, login=None) + assert res.is_json and res.json["sum"] == 42 + res = app.get("/add", 200, json={"i": 35, "j": 7}, login=None) + assert res.is_json and res.json["sum"] == 42 + # mixing data/json is okay for FlaskTester + res = app.get("/add", 200, data={"i": 30}, json={"j": 12}, login=None) + assert res.is_json and res.json["sum"] == 42