Skip to content

Commit 233b496

Browse files
authored
fix update knowledge (#3334)
# Description
1 parent 1f826c9 commit 233b496

File tree

3 files changed

+130
-4
lines changed

3 files changed

+130
-4
lines changed

backend/api/quivr_api/modules/knowledge/controller/knowledge_routes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ async def update_knowledge(
230230
detail="You do not have permission to access this knowledge.",
231231
)
232232
km = await knowledge_service.update_knowledge(km, payload)
233-
return km
233+
return await km.to_dto()
234234
except KnowledgeNotFoundException as e:
235235
raise HTTPException(
236236
status_code=status.HTTP_404_NOT_FOUND, detail=f"{e.message}"

backend/api/quivr_api/modules/knowledge/tests/test_knowledge_controller.py

Lines changed: 129 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
import pytest
66
import pytest_asyncio
77
from httpx import ASGITransport, AsyncClient
8-
from quivr_api.models.settings import BrainSettings
98
from quivr_core.models import KnowledgeStatus
109
from sqlmodel import select
1110
from sqlmodel.ext.asyncio.session import AsyncSession
1211

1312
from quivr_api.main import app
1413
from quivr_api.middlewares.auth.auth_bearer import get_current_user
14+
from quivr_api.models.settings import BrainSettings
1515
from quivr_api.modules.brain.entity.brain_entity import Brain, BrainType
1616
from quivr_api.modules.brain.entity.brain_user import BrainUserDB
1717
from quivr_api.modules.knowledge.controller.knowledge_routes import (
1818
get_knowledge_service,
1919
)
20-
from quivr_api.modules.knowledge.dto.inputs import LinkKnowledgeBrain
20+
from quivr_api.modules.knowledge.dto.inputs import KnowledgeUpdate, LinkKnowledgeBrain
2121
from quivr_api.modules.knowledge.dto.outputs import KnowledgeDTO
2222
from quivr_api.modules.knowledge.repository.knowledges import KnowledgeRepository
2323
from quivr_api.modules.knowledge.service.knowledge_service import KnowledgeService
@@ -315,3 +315,130 @@ def _send_task(*args, **kwargs):
315315

316316
# 4. Assert both files are being scheduled for processing
317317
assert len(tasks) == 2
318+
319+
320+
@pytest.mark.asyncio(loop_scope="session")
321+
async def test_move_knowledge_to_folder(
322+
monkeypatch,
323+
session: AsyncSession,
324+
test_client: AsyncClient,
325+
brain: Brain,
326+
user: User,
327+
sync: Sync,
328+
):
329+
assert brain.brain_id
330+
tasks = {}
331+
332+
def _send_task(*args, **kwargs):
333+
tasks["args"] = args
334+
tasks["kwargs"] = {**kwargs["kwargs"]}
335+
336+
monkeypatch.setattr("quivr_api.celery_config.celery.send_task", _send_task)
337+
338+
folder_data = {
339+
"file_name": "folder",
340+
"source": "local",
341+
"is_folder": True,
342+
"parent_id": None,
343+
}
344+
response = await test_client.post(
345+
"/knowledge/",
346+
files={
347+
"knowledge_data": (None, json.dumps(folder_data), "application/json"),
348+
},
349+
)
350+
# 1. Insert folder
351+
folder_km = KnowledgeDTO.model_validate(response.json())
352+
file_data = {
353+
"file_name": "test_file.txt",
354+
"source": "local",
355+
"is_folder": True,
356+
"parent_id": None,
357+
}
358+
359+
multipart_data = {
360+
"knowledge_data": (None, json.dumps(file_data), "application/json"),
361+
}
362+
# 2. Insert file in Root
363+
response = await test_client.post(
364+
"/knowledge/",
365+
files=multipart_data,
366+
)
367+
file_km = KnowledgeDTO.model_validate(response.json())
368+
369+
# Move file to folder
370+
update = KnowledgeUpdate(parent_id=folder_km.id)
371+
response = await test_client.patch(
372+
f"/knowledge/{file_km.id}",
373+
content=update.model_dump_json(exclude_unset=True),
374+
headers={"Content-Type": "application/json"},
375+
)
376+
assert response.status_code == 202
377+
updated_km = KnowledgeDTO.model_validate(response.json())
378+
379+
# 3. Validate that created knowledges are correct
380+
assert updated_km.parent and updated_km.parent.id
381+
assert updated_km.parent.id == folder_km.id
382+
383+
384+
@pytest.mark.asyncio(loop_scope="session")
385+
async def test_move_knowledge_to_root(
386+
monkeypatch,
387+
session: AsyncSession,
388+
test_client: AsyncClient,
389+
brain: Brain,
390+
user: User,
391+
sync: Sync,
392+
):
393+
assert brain.brain_id
394+
tasks = {}
395+
396+
def _send_task(*args, **kwargs):
397+
tasks["args"] = args
398+
tasks["kwargs"] = {**kwargs["kwargs"]}
399+
400+
monkeypatch.setattr("quivr_api.celery_config.celery.send_task", _send_task)
401+
402+
folder_data = {
403+
"file_name": "folder",
404+
"source": "local",
405+
"is_folder": True,
406+
"parent_id": None,
407+
}
408+
response = await test_client.post(
409+
"/knowledge/",
410+
files={
411+
"knowledge_data": (None, json.dumps(folder_data), "application/json"),
412+
},
413+
)
414+
# 1. Insert folder
415+
folder_km = KnowledgeDTO.model_validate(response.json())
416+
file_data = {
417+
"file_name": "test_file.txt",
418+
"source": "local",
419+
"is_folder": True,
420+
"parent_id": str(folder_km.id),
421+
}
422+
423+
multipart_data = {
424+
"knowledge_data": (None, json.dumps(file_data), "application/json"),
425+
}
426+
# 2. Insert file in Root
427+
response = await test_client.post(
428+
"/knowledge/",
429+
files=multipart_data,
430+
)
431+
file_km = KnowledgeDTO.model_validate(response.json())
432+
433+
# Move file to Root
434+
update = KnowledgeUpdate(parent_id=None)
435+
response = await test_client.patch(
436+
f"/knowledge/{file_km.id}",
437+
content=update.model_dump_json(exclude_unset=True),
438+
headers={"Content-Type": "application/json"},
439+
)
440+
assert response.status_code == 202
441+
updated_km = KnowledgeDTO.model_validate(response.json())
442+
443+
# 3. Validate that updated
444+
assert updated_km.parent is None

backend/worker/quivr_worker/process/processor.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,6 @@ async def refresh_sync_folder(self, folder_km: KnowledgeDB) -> KnowledgeDB:
285285
folder_id=folder_km.sync_file_id,
286286
recursive=False,
287287
)
288-
breakpoint()
289288
for sync_entry in filter(lambda s: s.id not in sync_children, sync_files):
290289
await self.add_new_sync_entry(folder=folder_km, sync_entry=sync_entry)
291290

0 commit comments

Comments
 (0)