From d538009005c8fa9d209075a41740083c468a36b4 Mon Sep 17 00:00:00 2001 From: ulleo Date: Tue, 27 Oct 2026 15:39:48 +0800 Subject: [PATCH] fix: return 400 for insufficient Excel columns --- .../apps/data_training/api/data_training.py | 2 +- backend/apps/terminology/api/terminology.py | 2 +- backend/tests/test_excel_http_errors.py | 35 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/backend/apps/data_training/api/data_training.py b/backend/apps/data_training/api/data_training.py index 5cc4c6888..04e89628e 100644 --- a/backend/apps/data_training/api/data_training.py +++ b/backend/apps/data_training/api/data_training.py @@ -197,7 +197,7 @@ def inner(): for sheet_name in sheet_names: if get_excel_column_count(save_path, sheet_name) < len(use_cols): - raise Exception(trans("i18n_excel_import.col_num_not_match")) + raise HTTPException(400, trans("i18n_excel_import.col_num_not_match")) df = pd.read_excel( save_path, diff --git a/backend/apps/terminology/api/terminology.py b/backend/apps/terminology/api/terminology.py index d14b845fb..7d21ef435 100644 --- a/backend/apps/terminology/api/terminology.py +++ b/backend/apps/terminology/api/terminology.py @@ -208,7 +208,7 @@ def inner(): for sheet_name in sheet_names: if get_excel_column_count(save_path, sheet_name) < len(use_cols): - raise Exception(trans("i18n_excel_import.col_num_not_match")) + raise HTTPException(400, trans("i18n_excel_import.col_num_not_match")) df = pd.read_excel( save_path, diff --git a/backend/tests/test_excel_http_errors.py b/backend/tests/test_excel_http_errors.py index d6e072309..811e5fd23 100644 --- a/backend/tests/test_excel_http_errors.py +++ b/backend/tests/test_excel_http_errors.py @@ -144,6 +144,41 @@ def test_valid_knowledge_workbook_reaches_batch_import( assert batch.call_args.args[:3] == (session, [], 1) +@pytest.mark.parametrize( + "module,batch_name,column_count", + [ + (terminology, "batch_create_terminology", 6), + (data_training, "batch_create_training", 4), + ], +) +@pytest.mark.parametrize("empty", [False, True]) +@pytest.mark.parametrize( + "language,message", + [ + ("zh-CN", "EXCEL列数量不匹配"), + ("en", "Number of columns in Excel does not match"), + ], +) +def test_insufficient_excel_columns_return_localized_400( + api, monkeypatch, module, batch_name, column_count, empty, language, message +): + client, session = api + client.app.dependency_overrides.pop(get_i18n) + monkeypatch.setattr(module, "session_maker", lambda: session) + batch = Mock() + monkeypatch.setattr(module, batch_name, batch) + columns = [] if empty else range(column_count - 1) + response = client.post( + module.router.prefix + "/uploadExcel", + files={"file": ("invalid.xlsx", workbook(columns))}, + headers={"Accept-Language": language}, + ) + assert response.status_code == 400, response.text + assert response.json() == message + batch.assert_not_called() + session.commit.assert_not_called() + + @pytest.mark.parametrize( "filename,exists,status,message", [