From 7873ad11f602297a294f7ec2e8a71529537f29cd Mon Sep 17 00:00:00 2001 From: Taren Sanders Date: Fri, 6 Nov 2026 09:46:10 +1100 Subject: [PATCH] Raise RedcapError when file import/export fails --- redcap/request.py | 7 ++++++- tests/unit/callback_utils.py | 6 ++++++ tests/unit/test_simple_project.py | 13 +++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/redcap/request.py b/redcap/request.py index 4a58636..bc94d16 100644 --- a/redcap/request.py +++ b/redcap/request.py @@ -190,7 +190,12 @@ def execute( bad_request = False - if self.fmt == "json": + # empty json content is hardcoded, so check the real response instead + if self.config.return_empty_json: + bad_request = not response.ok or "" in response.text.lower() + if bad_request: + content = response.text + elif self.fmt == "json": try: bad_request = "error" in content.keys() # type: ignore except AttributeError: diff --git a/tests/unit/callback_utils.py b/tests/unit/callback_utils.py index 39fdadc..b1fc8d3 100644 --- a/tests/unit/callback_utils.py +++ b/tests/unit/callback_utils.py @@ -290,6 +290,12 @@ def handle_simple_project_file_request(**kwargs) -> Any: data = kwargs["data"] headers = kwargs["headers"] resp = {} + if "bad_record" in str(data): + resp = ( + '' + "The record 'bad_record' does not exist" + ) + return (400, headers, resp) # file export if " filename" not in str(data): # name of the data file that was imported diff --git a/tests/unit/test_simple_project.py b/tests/unit/test_simple_project.py index aeb58f0..f28fd4f 100644 --- a/tests/unit/test_simple_project.py +++ b/tests/unit/test_simple_project.py @@ -175,6 +175,19 @@ def test_file_import(simple_project): simple_project.import_file("1", "file", upload_fname, fobj) +def test_file_import_raises_on_error(simple_project): + this_dir, _ = os.path.split(__file__) + upload_fname = os.path.join(this_dir, "data.txt") + with open(upload_fname, "r", encoding="UTF-8") as fobj: + with pytest.raises(RedcapError): + simple_project.import_file("bad_record", "file", upload_fname, fobj) + + +def test_file_delete_raises_on_error(simple_project): + with pytest.raises(RedcapError): + simple_project.delete_file("bad_record", "file") + + def test_file_export(simple_project): record, field = "1", "file" content, headers = simple_project.export_file(record, field)