mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 19:17:13 -05:00 
			
		
		
		
	more tests
This commit is contained in:
		
							parent
							
								
									c7c6be42be
								
							
						
					
					
						commit
						09950ca199
					
				
							
								
								
									
										218
									
								
								src/documents/tests/test_api.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								src/documents/tests/test_api.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,218 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					import tempfile
 | 
				
			||||||
 | 
					from unittest import mock
 | 
				
			||||||
 | 
					from unittest.mock import MagicMock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.contrib.auth.models import User
 | 
				
			||||||
 | 
					from django.test import override_settings
 | 
				
			||||||
 | 
					from rest_framework.test import APITestCase, APIClient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from documents.models import Document, Correspondent, DocumentType, Tag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DocumentApiTest(APITestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        self.scratch_dir = tempfile.mkdtemp()
 | 
				
			||||||
 | 
					        self.media_dir = tempfile.mkdtemp()
 | 
				
			||||||
 | 
					        self.originals_dir = os.path.join(self.media_dir, "documents", "originals")
 | 
				
			||||||
 | 
					        self.thumbnail_dir = os.path.join(self.media_dir, "documents", "thumbnails")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        os.makedirs(self.originals_dir, exist_ok=True)
 | 
				
			||||||
 | 
					        os.makedirs(self.thumbnail_dir, exist_ok=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        override_settings(
 | 
				
			||||||
 | 
					            SCRATCH_DIR=self.scratch_dir,
 | 
				
			||||||
 | 
					            MEDIA_ROOT=self.media_dir,
 | 
				
			||||||
 | 
					            ORIGINALS_DIR=self.originals_dir,
 | 
				
			||||||
 | 
					            THUMBNAIL_DIR=self.thumbnail_dir
 | 
				
			||||||
 | 
					        ).enable()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        user = User.objects.create_superuser(username="temp_admin")
 | 
				
			||||||
 | 
					        self.client.force_login(user=user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tearDown(self):
 | 
				
			||||||
 | 
					        shutil.rmtree(self.scratch_dir, ignore_errors=True)
 | 
				
			||||||
 | 
					        shutil.rmtree(self.media_dir, ignore_errors=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testDocuments(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/").data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(response['count'], 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        c = Correspondent.objects.create(name="c", pk=41)
 | 
				
			||||||
 | 
					        dt = DocumentType.objects.create(name="dt", pk=63)
 | 
				
			||||||
 | 
					        tag = Tag.objects.create(name="t", pk=85)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc = Document.objects.create(title="WOW", content="the content", correspondent=c, document_type=dt, checksum="123")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc.tags.add(tag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/", format='json')
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(response.data['count'], 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        returned_doc = response.data['results'][0]
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['id'], doc.id)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['title'], doc.title)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['correspondent']['name'], c.name)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['document_type']['name'], dt.name)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['correspondent']['id'], c.id)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['document_type']['id'], dt.id)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['correspondent']['id'], returned_doc['correspondent_id'])
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['document_type']['id'], returned_doc['document_type_id'])
 | 
				
			||||||
 | 
					        self.assertEqual(len(returned_doc['tags']), 1)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['tags'][0]['name'], tag.name)
 | 
				
			||||||
 | 
					        self.assertEqual(returned_doc['tags'][0]['id'], tag.id)
 | 
				
			||||||
 | 
					        self.assertListEqual(returned_doc['tags_id'], [tag.id])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        c2 = Correspondent.objects.create(name="c2")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        returned_doc['correspondent_id'] = c2.pk
 | 
				
			||||||
 | 
					        returned_doc['title'] = "the new title"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.put('/api/documents/{}/'.format(doc.pk), returned_doc, format='json')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc_after_save = Document.objects.get(id=doc.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(doc_after_save.correspondent, c2)
 | 
				
			||||||
 | 
					        self.assertEqual(doc_after_save.title, "the new title")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.client.delete("/api/documents/{}/".format(doc_after_save.pk))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(len(Document.objects.all()), 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_document_actions(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        _, filename = tempfile.mkstemp(dir=self.originals_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        content = b"This is a test"
 | 
				
			||||||
 | 
					        content_thumbnail = b"thumbnail content"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with open(filename, "wb") as f:
 | 
				
			||||||
 | 
					            f.write(content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc = Document.objects.create(title="none", filename=os.path.basename(filename), file_type="pdf")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with open(os.path.join(self.thumbnail_dir, "{:07d}.png".format(doc.pk)), "wb") as f:
 | 
				
			||||||
 | 
					            f.write(content_thumbnail)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get('/api/documents/{}/download/'.format(doc.pk))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(response.content, content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get('/api/documents/{}/preview/'.format(doc.pk))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(response.content, content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get('/api/documents/{}/thumb/'.format(doc.pk))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(response.content, content_thumbnail)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_document_actions_not_existing_file(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc = Document.objects.create(title="none", filename=os.path.basename("asd"), file_type="pdf")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get('/api/documents/{}/download/'.format(doc.pk))
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 404)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get('/api/documents/{}/preview/'.format(doc.pk))
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 404)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get('/api/documents/{}/thumb/'.format(doc.pk))
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 404)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_document_filters(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc1 = Document.objects.create(title="none1", checksum="A")
 | 
				
			||||||
 | 
					        doc2 = Document.objects.create(title="none2", checksum="B")
 | 
				
			||||||
 | 
					        doc3 = Document.objects.create(title="none3", checksum="C")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        tag_inbox = Tag.objects.create(name="t1", is_inbox_tag=True)
 | 
				
			||||||
 | 
					        tag_2 = Tag.objects.create(name="t2")
 | 
				
			||||||
 | 
					        tag_3 = Tag.objects.create(name="t3")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc1.tags.add(tag_inbox)
 | 
				
			||||||
 | 
					        doc2.tags.add(tag_2)
 | 
				
			||||||
 | 
					        doc3.tags.add(tag_2)
 | 
				
			||||||
 | 
					        doc3.tags.add(tag_3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/?is_in_inbox=true")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        results = response.data['results']
 | 
				
			||||||
 | 
					        self.assertEqual(len(results), 1)
 | 
				
			||||||
 | 
					        self.assertEqual(results[0]['id'], doc1.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/?is_in_inbox=false")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        results = response.data['results']
 | 
				
			||||||
 | 
					        self.assertEqual(len(results), 2)
 | 
				
			||||||
 | 
					        self.assertEqual(results[0]['id'], doc2.id)
 | 
				
			||||||
 | 
					        self.assertEqual(results[1]['id'], doc3.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/?tags__id__in={},{}".format(tag_inbox.id, tag_3.id))
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        results = response.data['results']
 | 
				
			||||||
 | 
					        self.assertEqual(len(results), 2)
 | 
				
			||||||
 | 
					        self.assertEqual(results[0]['id'], doc1.id)
 | 
				
			||||||
 | 
					        self.assertEqual(results[1]['id'], doc3.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/?tags__id__all={},{}".format(tag_2.id, tag_3.id))
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        results = response.data['results']
 | 
				
			||||||
 | 
					        self.assertEqual(len(results), 1)
 | 
				
			||||||
 | 
					        self.assertEqual(results[0]['id'], doc3.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/?tags__id__all={},{}".format(tag_inbox.id, tag_3.id))
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        results = response.data['results']
 | 
				
			||||||
 | 
					        self.assertEqual(len(results), 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/documents/?tags__id__all={}a{}".format(tag_inbox.id, tag_3.id))
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        results = response.data['results']
 | 
				
			||||||
 | 
					        self.assertEqual(len(results), 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @mock.patch("documents.index.autocomplete")
 | 
				
			||||||
 | 
					    def test_search_autocomplete(self, m):
 | 
				
			||||||
 | 
					        m.side_effect = lambda ix, term, limit: [term for _ in range(limit)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/search/autocomplete/?term=test")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(len(response.data), 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/search/autocomplete/?term=test&limit=20")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(len(response.data), 20)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/search/autocomplete/?term=test&limit=-1")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 400)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/search/autocomplete/")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 400)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/search/autocomplete/?term=")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(len(response.data), 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_statistics(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc1 = Document.objects.create(title="none1", checksum="A")
 | 
				
			||||||
 | 
					        doc2 = Document.objects.create(title="none2", checksum="B")
 | 
				
			||||||
 | 
					        doc3 = Document.objects.create(title="none3", checksum="C")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        tag_inbox = Tag.objects.create(name="t1", is_inbox_tag=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        doc1.tags.add(tag_inbox)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        response = self.client.get("/api/statistics/")
 | 
				
			||||||
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(response.data['documents_total'], 3)
 | 
				
			||||||
 | 
					        self.assertEqual(response.data['documents_inbox'], 1)
 | 
				
			||||||
@ -223,17 +223,16 @@ class SearchAutoCompleteView(APIView):
 | 
				
			|||||||
        if 'term' in request.query_params:
 | 
					        if 'term' in request.query_params:
 | 
				
			||||||
            term = request.query_params['term']
 | 
					            term = request.query_params['term']
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            term = None
 | 
					            return HttpResponseBadRequest("Term required")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if 'limit' in request.query_params:
 | 
					        if 'limit' in request.query_params:
 | 
				
			||||||
            limit = int(request.query_params['limit'])
 | 
					            limit = int(request.query_params['limit'])
 | 
				
			||||||
 | 
					            if limit <= 0:
 | 
				
			||||||
 | 
					                return HttpResponseBadRequest("Invalid limit")
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            limit = 10
 | 
					            limit = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if term is not None:
 | 
					 | 
				
			||||||
        return Response(index.autocomplete(self.ix, term, limit))
 | 
					        return Response(index.autocomplete(self.ix, term, limit))
 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            return Response([])
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class StatisticsView(APIView):
 | 
					class StatisticsView(APIView):
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user