From 5c3b95838da296771b6882ec2ad59c3bcaadcd34 Mon Sep 17 00:00:00 2001 From: JunghwanNA <70629228+shaun0927@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:13:55 +0900 Subject: [PATCH] Respect maintainer preference against new PR test files A collaborator explicitly asked that test files not be included on the PR. This follow-up keeps the file reindex safety fix intact while dropping the newly added repository test file, and relies on focused local verification outside the tracked diff instead. Constraint: Keep the data-loss fix intact while removing the only PR artifact a reviewer objected to Rejected: Leave the new test file in place and wait | direct reviewer feedback is already available and easy to satisfy Confidence: medium Scope-risk: narrow Reversibility: clean Directive: For this PR, preserve the reindex ordering fix but avoid re-adding a dedicated repository test file unless a maintainer explicitly asks for one Tested: python3 -m py_compile backend/open_webui/routers/files.py backend/open_webui/utils/knowledge_collections.py; focused local harness for reindex_file_in_collection success/failure ordering Not-tested: Repository pytest suite after dropping the tracked test file --- .../test/util/test_knowledge_collections.py | 86 ------------------- 1 file changed, 86 deletions(-) delete mode 100644 backend/open_webui/test/util/test_knowledge_collections.py diff --git a/backend/open_webui/test/util/test_knowledge_collections.py b/backend/open_webui/test/util/test_knowledge_collections.py deleted file mode 100644 index ede7488df8..0000000000 --- a/backend/open_webui/test/util/test_knowledge_collections.py +++ /dev/null @@ -1,86 +0,0 @@ -import asyncio -from types import SimpleNamespace - -from open_webui.utils.knowledge_collections import reindex_file_in_collection - - -def test_reindex_file_in_collection_deletes_old_ids_only_after_success(): - calls = [] - - class DummyVectorDB: - async def query(self, collection_name, filter, limit=None): - calls.append(('query', collection_name, filter)) - return SimpleNamespace(ids=[['old-1', 'old-2']]) - - async def delete(self, collection_name, ids=None, filter=None): - calls.append(('delete', collection_name, ids, filter)) - - async def fake_process_file(request, form, user, db): - calls.append(('process_file', form.file_id, form.collection_name)) - - class DummyProcessFileForm: - def __init__(self, file_id, collection_name=None): - self.file_id = file_id - self.collection_name = collection_name - - asyncio.run( - reindex_file_in_collection( - request=object(), - file_id='file-1', - collection_name='kb-1', - user=object(), - db=None, - process_file_form_factory=DummyProcessFileForm, - process_file_func=fake_process_file, - vector_db_client=DummyVectorDB(), - ) - ) - - assert calls == [ - ('query', 'kb-1', {'file_id': 'file-1'}), - ('process_file', 'file-1', 'kb-1'), - ('delete', 'kb-1', ['old-1', 'old-2'], None), - ] - - -def test_reindex_file_in_collection_preserves_old_ids_when_rebuild_fails(): - calls = [] - - class DummyVectorDB: - async def query(self, collection_name, filter, limit=None): - calls.append(('query', collection_name, filter)) - return SimpleNamespace(ids=[['old-1']]) - - async def delete(self, collection_name, ids=None, filter=None): - calls.append(('delete', collection_name, ids, filter)) - - async def fake_process_file(request, form, user, db): - calls.append(('process_file', form.file_id, form.collection_name)) - raise RuntimeError('reindex failed') - - class DummyProcessFileForm: - def __init__(self, file_id, collection_name=None): - self.file_id = file_id - self.collection_name = collection_name - - try: - asyncio.run( - reindex_file_in_collection( - request=object(), - file_id='file-1', - collection_name='kb-1', - user=object(), - db=None, - process_file_form_factory=DummyProcessFileForm, - process_file_func=fake_process_file, - vector_db_client=DummyVectorDB(), - ) - ) - raise AssertionError('Expected reindex_file_in_collection to raise RuntimeError') - except RuntimeError as exc: - assert str(exc) == 'reindex failed' - - assert calls == [ - ('query', 'kb-1', {'file_id': 'file-1'}), - ('process_file', 'file-1', 'kb-1'), - ]