1+ import os
2+ import pytest
3+ import tempfile
4+ from unittest .mock import MagicMock , patch
5+ from pdf_rag import upload_pdf , load_pdf , split_text , index_docs , retrieve_docs , answer_question
6+ from langchain_core .documents import Document
7+
8+ @pytest .fixture
9+ def sample_pdf ():
10+ """Creates a temporary sample PDF file for testing."""
11+ temp_pdf = tempfile .NamedTemporaryFile (delete = False , suffix = ".pdf" )
12+ temp_pdf .write (b"%PDF-1.4 Sample PDF Content" )
13+ temp_pdf .close ()
14+ yield temp_pdf .name
15+ os .remove (temp_pdf .name )
16+
17+
18+ def test_upload_pdf (sample_pdf ):
19+ """Test the upload_pdf function."""
20+ mock_file = MagicMock ()
21+ mock_file .name = "test.pdf"
22+ mock_file .getbuffer .return_value = open (sample_pdf , "rb" ).read ()
23+
24+ saved_path = upload_pdf (mock_file )
25+ assert os .path .exists (saved_path )
26+ os .remove (saved_path )
27+
28+
29+ @patch ("pdf_rag.PDFPlumberLoader.load" )
30+ def test_load_pdf (mock_pdf_loader , sample_pdf ):
31+ """Test loading a PDF."""
32+ mock_pdf_loader .return_value = [Document (page_content = "Sample text" )]
33+ result = load_pdf (sample_pdf )
34+ assert isinstance (result , list )
35+ assert result [0 ].page_content == "Sample text"
36+
37+
38+ def test_split_text ():
39+ """Test text splitting."""
40+ documents = [Document (page_content = "Sample text that needs splitting." )]
41+ chunks = split_text (documents )
42+ assert isinstance (chunks , list )
43+ assert len (chunks ) > 0
44+
45+
46+ @patch ("pdf_rag.InMemoryVectorStore.add_documents" )
47+ def test_index_docs (mock_add_docs ):
48+ """Test document indexing."""
49+ documents = [Document (page_content = "Indexed text" )]
50+ index_docs (documents )
51+ mock_add_docs .assert_called_once ()
52+
53+
54+ @patch ("pdf_rag.InMemoryVectorStore.similarity_search" )
55+ def test_retrieve_docs (mock_search ):
56+ """Test document retrieval."""
57+ mock_search .return_value = [Document (page_content = "Relevant text" )]
58+ result = retrieve_docs ("test query" )
59+ assert isinstance (result , list )
60+ assert len (result ) > 0
61+
62+
63+ @patch ("pdf_rag.OllamaLLM.invoke" )
64+ def test_answer_question (mock_invoke ):
65+ """Test question answering."""
66+ mock_invoke .return_value = "This is an answer."
67+ docs = [Document (page_content = "Context text" )]
68+ result = answer_question ("What is this?" , docs )
69+ assert result == "This is an answer."
0 commit comments