mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-04 03:27:12 -05:00 
			
		
		
		
	Moves ASN barcode testing into a dedicated class
This commit is contained in:
		
							parent
							
								
									2ab77fbaf7
								
							
						
					
					
						commit
						4fce5aba63
					
				@ -1,6 +1,5 @@
 | 
				
			|||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import tempfile
 | 
					 | 
				
			||||||
from unittest import mock
 | 
					from unittest import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
@ -198,58 +197,6 @@ class TestBarcode(DirectoriesMixin, TestCase):
 | 
				
			|||||||
        img = Image.open(test_file)
 | 
					        img = Image.open(test_file)
 | 
				
			||||||
        self.assertEqual(barcodes.barcode_reader(img), ["CUSTOM BARCODE"])
 | 
					        self.assertEqual(barcodes.barcode_reader(img), ["CUSTOM BARCODE"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_barcode_reader_asn_normal(self):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        GIVEN:
 | 
					 | 
				
			||||||
            - Image containing standard ASNxxxxx barcode
 | 
					 | 
				
			||||||
        WHEN:
 | 
					 | 
				
			||||||
            - Image is scanned for barcodes
 | 
					 | 
				
			||||||
        THEN:
 | 
					 | 
				
			||||||
            - The barcode is located
 | 
					 | 
				
			||||||
            - The barcode value is correct
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        test_file = os.path.join(
 | 
					 | 
				
			||||||
            self.BARCODE_SAMPLE_DIR,
 | 
					 | 
				
			||||||
            "barcode-39-asn-123.png",
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        img = Image.open(test_file)
 | 
					 | 
				
			||||||
        self.assertEqual(barcodes.barcode_reader(img), ["ASN00123"])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def test_barcode_reader_asn_invalid(self):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        GIVEN:
 | 
					 | 
				
			||||||
            - Image containing invalid ASNxxxxx barcode
 | 
					 | 
				
			||||||
            - The number portion of the ASN is not a number
 | 
					 | 
				
			||||||
        WHEN:
 | 
					 | 
				
			||||||
            - Image is scanned for barcodes
 | 
					 | 
				
			||||||
        THEN:
 | 
					 | 
				
			||||||
            - The barcode is located
 | 
					 | 
				
			||||||
            - The barcode value is correct
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        test_file = os.path.join(
 | 
					 | 
				
			||||||
            self.BARCODE_SAMPLE_DIR,
 | 
					 | 
				
			||||||
            "barcode-39-asn-invalid.png",
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        img = Image.open(test_file)
 | 
					 | 
				
			||||||
        self.assertEqual(barcodes.barcode_reader(img), ["ASNXYZXYZ"])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def test_barcode_reader_asn_custom_prefix(self):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        GIVEN:
 | 
					 | 
				
			||||||
            - Image containing custom prefix barcode
 | 
					 | 
				
			||||||
        WHEN:
 | 
					 | 
				
			||||||
            - Image is scanned for barcodes
 | 
					 | 
				
			||||||
        THEN:
 | 
					 | 
				
			||||||
            - The barcode is located
 | 
					 | 
				
			||||||
            - The barcode value is correct
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        test_file = os.path.join(
 | 
					 | 
				
			||||||
            self.BARCODE_SAMPLE_DIR,
 | 
					 | 
				
			||||||
            "barcode-39-asn-custom-prefix.png",
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        img = Image.open(test_file)
 | 
					 | 
				
			||||||
        self.assertEqual(barcodes.barcode_reader(img), ["CUSTOM-PREFIX-00123"])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def test_get_mime_type(self):
 | 
					    def test_get_mime_type(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        GIVEN:
 | 
					        GIVEN:
 | 
				
			||||||
@ -908,6 +855,144 @@ class TestBarcode(DirectoriesMixin, TestCase):
 | 
				
			|||||||
        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
					        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
				
			||||||
        self.assertListEqual(separator_page_numbers, [])
 | 
					        self.assertListEqual(separator_page_numbers, [])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestAsnBarcodes(DirectoriesMixin, TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SAMPLE_DIR = os.path.join(
 | 
				
			||||||
 | 
					        os.path.dirname(__file__),
 | 
				
			||||||
 | 
					        "samples",
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    BARCODE_SAMPLE_DIR = os.path.join(SAMPLE_DIR, "barcodes")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_barcode_reader_asn_normal(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        GIVEN:
 | 
				
			||||||
 | 
					            - Image containing standard ASNxxxxx barcode
 | 
				
			||||||
 | 
					        WHEN:
 | 
				
			||||||
 | 
					            - Image is scanned for barcodes
 | 
				
			||||||
 | 
					        THEN:
 | 
				
			||||||
 | 
					            - The barcode is located
 | 
				
			||||||
 | 
					            - The barcode value is correct
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        test_file = os.path.join(
 | 
				
			||||||
 | 
					            self.BARCODE_SAMPLE_DIR,
 | 
				
			||||||
 | 
					            "barcode-39-asn-123.png",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        img = Image.open(test_file)
 | 
				
			||||||
 | 
					        self.assertEqual(barcodes.barcode_reader(img), ["ASN00123"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_barcode_reader_asn_invalid(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        GIVEN:
 | 
				
			||||||
 | 
					            - Image containing invalid ASNxxxxx barcode
 | 
				
			||||||
 | 
					            - The number portion of the ASN is not a number
 | 
				
			||||||
 | 
					        WHEN:
 | 
				
			||||||
 | 
					            - Image is scanned for barcodes
 | 
				
			||||||
 | 
					        THEN:
 | 
				
			||||||
 | 
					            - The barcode is located
 | 
				
			||||||
 | 
					            - The barcode value is correct
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        test_file = os.path.join(
 | 
				
			||||||
 | 
					            self.BARCODE_SAMPLE_DIR,
 | 
				
			||||||
 | 
					            "barcode-39-asn-invalid.png",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        img = Image.open(test_file)
 | 
				
			||||||
 | 
					        self.assertEqual(barcodes.barcode_reader(img), ["ASNXYZXYZ"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_barcode_reader_asn_custom_prefix(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        GIVEN:
 | 
				
			||||||
 | 
					            - Image containing custom prefix barcode
 | 
				
			||||||
 | 
					        WHEN:
 | 
				
			||||||
 | 
					            - Image is scanned for barcodes
 | 
				
			||||||
 | 
					        THEN:
 | 
				
			||||||
 | 
					            - The barcode is located
 | 
				
			||||||
 | 
					            - The barcode value is correct
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        test_file = os.path.join(
 | 
				
			||||||
 | 
					            self.BARCODE_SAMPLE_DIR,
 | 
				
			||||||
 | 
					            "barcode-39-asn-custom-prefix.png",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        img = Image.open(test_file)
 | 
				
			||||||
 | 
					        self.assertEqual(barcodes.barcode_reader(img), ["CUSTOM-PREFIX-00123"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @override_settings(CONSUMER_ASN_BARCODE_PREFIX="CUSTOM-PREFIX-")
 | 
				
			||||||
 | 
					    def test_scan_file_for_asn_custom_prefix(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        GIVEN:
 | 
				
			||||||
 | 
					            - PDF containing an ASN barcode with custom prefix
 | 
				
			||||||
 | 
					            - The ASN value is 123
 | 
				
			||||||
 | 
					        WHEN:
 | 
				
			||||||
 | 
					            - File is scanned for barcodes
 | 
				
			||||||
 | 
					        THEN:
 | 
				
			||||||
 | 
					            - The ASN is located
 | 
				
			||||||
 | 
					            - The ASN integer value is correct
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        test_file = os.path.join(
 | 
				
			||||||
 | 
					            self.BARCODE_SAMPLE_DIR,
 | 
				
			||||||
 | 
					            "barcode-39-asn-custom-prefix.pdf",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        doc_barcode_info = barcodes.scan_file_for_barcodes(
 | 
				
			||||||
 | 
					            test_file,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        asn = barcodes.get_asn_from_barcodes(doc_barcode_info.barcodes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
				
			||||||
 | 
					        self.assertEqual(asn, 123)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_scan_file_for_asn_barcode_invalid(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        GIVEN:
 | 
				
			||||||
 | 
					            - PDF containing an ASN barcode
 | 
				
			||||||
 | 
					            - The ASN value is XYZXYZ
 | 
				
			||||||
 | 
					        WHEN:
 | 
				
			||||||
 | 
					            - File is scanned for barcodes
 | 
				
			||||||
 | 
					        THEN:
 | 
				
			||||||
 | 
					            - The ASN is located
 | 
				
			||||||
 | 
					            - The ASN value is not used
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        test_file = os.path.join(
 | 
				
			||||||
 | 
					            self.BARCODE_SAMPLE_DIR,
 | 
				
			||||||
 | 
					            "barcode-39-asn-invalid.pdf",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        doc_barcode_info = barcodes.scan_file_for_barcodes(
 | 
				
			||||||
 | 
					            test_file,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        asn = barcodes.get_asn_from_barcodes(doc_barcode_info.barcodes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
				
			||||||
 | 
					        self.assertEqual(asn, None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @override_settings(CONSUMER_ENABLE_ASN_BARCODE=True)
 | 
				
			||||||
 | 
					    def test_consume_barcode_file_asn_assignment(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        GIVEN:
 | 
				
			||||||
 | 
					            - PDF containing an ASN barcode
 | 
				
			||||||
 | 
					            - The ASN value is 123
 | 
				
			||||||
 | 
					        WHEN:
 | 
				
			||||||
 | 
					            - File is scanned for barcodes
 | 
				
			||||||
 | 
					        THEN:
 | 
				
			||||||
 | 
					            - The ASN is located
 | 
				
			||||||
 | 
					            - The ASN integer value is correct
 | 
				
			||||||
 | 
					            - The ASN is provided as the override value to the consumer
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        test_file = os.path.join(
 | 
				
			||||||
 | 
					            self.BARCODE_SAMPLE_DIR,
 | 
				
			||||||
 | 
					            "barcode-39-asn-123.pdf",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dst = os.path.join(settings.SCRATCH_DIR, "barcode-39-asn-123.pdf")
 | 
				
			||||||
 | 
					        shutil.copy(test_file, dst)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with mock.patch("documents.consumer.Consumer.try_consume_file") as mocked_call:
 | 
				
			||||||
 | 
					            tasks.consume_file(dst)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            args, kwargs = mocked_call.call_args
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self.assertEqual(kwargs["override_asn"], 123)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_scan_file_for_asn_barcode(self):
 | 
					    def test_scan_file_for_asn_barcode(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        GIVEN:
 | 
					        GIVEN:
 | 
				
			||||||
@ -952,82 +1037,6 @@ class TestBarcode(DirectoriesMixin, TestCase):
 | 
				
			|||||||
        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
					        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
				
			||||||
        self.assertEqual(asn, None)
 | 
					        self.assertEqual(asn, None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_scan_file_for_asn_barcode_invalid(self):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        GIVEN:
 | 
					 | 
				
			||||||
            - PDF containing an ASN barcode
 | 
					 | 
				
			||||||
            - The ASN value is XYZXYZ
 | 
					 | 
				
			||||||
        WHEN:
 | 
					 | 
				
			||||||
            - File is scanned for barcodes
 | 
					 | 
				
			||||||
        THEN:
 | 
					 | 
				
			||||||
            - The ASN is located
 | 
					 | 
				
			||||||
            - The ASN value is not used
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        test_file = os.path.join(
 | 
					 | 
				
			||||||
            self.BARCODE_SAMPLE_DIR,
 | 
					 | 
				
			||||||
            "barcode-39-asn-invalid.pdf",
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        doc_barcode_info = barcodes.scan_file_for_barcodes(
 | 
					 | 
				
			||||||
            test_file,
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        asn = barcodes.get_asn_from_barcodes(doc_barcode_info.barcodes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
					 | 
				
			||||||
        self.assertEqual(asn, None)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @override_settings(CONSUMER_ASN_BARCODE_PREFIX="CUSTOM-PREFIX-")
 | 
					 | 
				
			||||||
    def test_scan_file_for_asn_custom_prefix(self):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        GIVEN:
 | 
					 | 
				
			||||||
            - PDF containing an ASN barcode with custom prefix
 | 
					 | 
				
			||||||
            - The ASN value is 123
 | 
					 | 
				
			||||||
        WHEN:
 | 
					 | 
				
			||||||
            - File is scanned for barcodes
 | 
					 | 
				
			||||||
        THEN:
 | 
					 | 
				
			||||||
            - The ASN is located
 | 
					 | 
				
			||||||
            - The ASN integer value is correct
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        test_file = os.path.join(
 | 
					 | 
				
			||||||
            self.BARCODE_SAMPLE_DIR,
 | 
					 | 
				
			||||||
            "barcode-39-asn-custom-prefix.pdf",
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        doc_barcode_info = barcodes.scan_file_for_barcodes(
 | 
					 | 
				
			||||||
            test_file,
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        asn = barcodes.get_asn_from_barcodes(doc_barcode_info.barcodes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.assertEqual(doc_barcode_info.pdf_path, test_file)
 | 
					 | 
				
			||||||
        self.assertEqual(asn, 123)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @override_settings(CONSUMER_ENABLE_ASN_BARCODE=True)
 | 
					 | 
				
			||||||
    def test_consume_barcode_file_asn_assignment(self):
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        GIVEN:
 | 
					 | 
				
			||||||
            - PDF containing an ASN barcode
 | 
					 | 
				
			||||||
            - The ASN value is 123
 | 
					 | 
				
			||||||
        WHEN:
 | 
					 | 
				
			||||||
            - File is scanned for barcodes
 | 
					 | 
				
			||||||
        THEN:
 | 
					 | 
				
			||||||
            - The ASN is located
 | 
					 | 
				
			||||||
            - The ASN integer value is correct
 | 
					 | 
				
			||||||
            - The ASN is provided as the override value to the consumer
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        test_file = os.path.join(
 | 
					 | 
				
			||||||
            self.BARCODE_SAMPLE_DIR,
 | 
					 | 
				
			||||||
            "barcode-39-asn-123.pdf",
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        dst = os.path.join(settings.SCRATCH_DIR, "barcode-39-asn-123.pdf")
 | 
					 | 
				
			||||||
        shutil.copy(test_file, dst)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        with mock.patch("documents.consumer.Consumer.try_consume_file") as mocked_call:
 | 
					 | 
				
			||||||
            tasks.consume_file(dst)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            args, kwargs = mocked_call.call_args
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            self.assertEqual(kwargs["override_asn"], 123)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @override_settings(CONSUMER_ENABLE_ASN_BARCODE=True)
 | 
					    @override_settings(CONSUMER_ENABLE_ASN_BARCODE=True)
 | 
				
			||||||
    def test_asn_too_large(self):
 | 
					    def test_asn_too_large(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,7 @@ import shutil
 | 
				
			|||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
from contextlib import contextmanager
 | 
					from contextlib import contextmanager
 | 
				
			||||||
 | 
					from unittest import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.apps import apps
 | 
					from django.apps import apps
 | 
				
			||||||
from django.db import connection
 | 
					from django.db import connection
 | 
				
			||||||
@ -86,6 +87,30 @@ class DirectoriesMixin:
 | 
				
			|||||||
        remove_dirs(self.dirs)
 | 
					        remove_dirs(self.dirs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ConsumerProgressMixin:
 | 
				
			||||||
 | 
					    def setUp(self) -> None:
 | 
				
			||||||
 | 
					        self.send_progress_patcher = mock.patch(
 | 
				
			||||||
 | 
					            "documents.consumer.Consumer._send_progress",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.send_progress_mock = self.send_progress_patcher.start()
 | 
				
			||||||
 | 
					        super().setUp()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tearDown(self) -> None:
 | 
				
			||||||
 | 
					        super().tearDown()
 | 
				
			||||||
 | 
					        self.send_progress_patcher.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DocumentConsumeDelayMixin:
 | 
				
			||||||
 | 
					    def setUp(self) -> None:
 | 
				
			||||||
 | 
					        self.consume_file_patcher = mock.patch("documents.tasks.consume_file.delay")
 | 
				
			||||||
 | 
					        self.consume_file_mock = self.consume_file_patcher.start()
 | 
				
			||||||
 | 
					        super().setUp()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tearDown(self) -> None:
 | 
				
			||||||
 | 
					        super().tearDown()
 | 
				
			||||||
 | 
					        self.consume_file_patcher.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestMigrations(TransactionTestCase):
 | 
					class TestMigrations(TransactionTestCase):
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def app(self):
 | 
					    def app(self):
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user