1# -*- coding: utf-8 -*-
2# Part of Odoo. See LICENSE file for full copyright and licensing details.
3
4from odoo.tests.common import TransactionCase
5from odoo.tools import pdf
6from odoo.modules.module import get_module_resource
7import io
8
9
10class TestPdf(TransactionCase):
11    """ Tests on pdf. """
12
13    def setUp(self):
14        super().setUp()
15        file_path = get_module_resource('base', 'tests', 'minimal.pdf')
16        self.file = open(file_path, 'rb').read()
17        self.minimal_reader_buffer = io.BytesIO(self.file)
18        self.minimal_pdf_reader = pdf.OdooPdfFileReader(self.minimal_reader_buffer)
19
20    def test_odoo_pdf_file_reader(self):
21        attachments = list(self.minimal_pdf_reader.getAttachments())
22        self.assertEqual(len(attachments), 0)
23
24        pdf_writer = pdf.PdfFileWriter()
25        pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader)
26        pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment')
27
28        attachments = list(self.minimal_pdf_reader.getAttachments())
29        self.assertEqual(len(attachments), 1)
30
31    def test_odoo_pdf_file_writer(self):
32        attachments = list(self.minimal_pdf_reader.getAttachments())
33        self.assertEqual(len(attachments), 0)
34
35        pdf_writer = pdf.OdooPdfFileWriter()
36        pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader)
37
38        pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment')
39        attachments = list(self.minimal_pdf_reader.getAttachments())
40        self.assertEqual(len(attachments), 1)
41
42        pdf_writer.addAttachment('another_attachment.txt', b'My awesome OTHER attachment')
43        attachments = list(self.minimal_pdf_reader.getAttachments())
44        self.assertEqual(len(attachments), 2)
45
46    def test_odoo_pdf_file_reader_with_owner_encryption(self):
47        pdf_writer = pdf.OdooPdfFileWriter()
48        pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader)
49
50        pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment')
51        pdf_writer.addAttachment('another_attachment.txt', b'My awesome OTHER attachment')
52
53        pdf_writer.encrypt("", "foo")
54
55        with io.BytesIO() as writer_buffer:
56            pdf_writer.write(writer_buffer)
57            encrypted_content = writer_buffer.getvalue()
58
59        with io.BytesIO(encrypted_content) as reader_buffer:
60            pdf_reader = pdf.OdooPdfFileReader(reader_buffer)
61            attachments = list(pdf_reader.getAttachments())
62
63        self.assertEqual(len(attachments), 2)
64
65    def test_merge_pdf(self):
66        self.assertEqual(self.minimal_pdf_reader.getNumPages(), 1)
67        page = self.minimal_pdf_reader.getPage(0)
68
69        merged_pdf = pdf.merge_pdf([self.file, self.file])
70        merged_reader_buffer = io.BytesIO(merged_pdf)
71        merged_pdf_reader = pdf.OdooPdfFileReader(merged_reader_buffer)
72        self.assertEqual(merged_pdf_reader.getNumPages(), 2)
73        merged_reader_buffer.close()
74
75    def test_branded_file_writer(self):
76        # It's not easy to create a PDF with PyPDF2, so instead we copy minimal.pdf with our custom pdf writer
77        pdf_writer = pdf.PdfFileWriter()  # BrandedFileWriter
78        pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader)
79        writer_buffer = io.BytesIO()
80        pdf_writer.write(writer_buffer)
81        branded_content = writer_buffer.getvalue()
82        writer_buffer.close()
83
84        # Read the metadata of the newly created pdf.
85        reader_buffer = io.BytesIO(branded_content)
86        pdf_reader = pdf.PdfFileReader(reader_buffer)
87        pdf_info = pdf_reader.getDocumentInfo()
88        self.assertEqual(pdf_info['/Producer'], 'Odoo')
89        self.assertEqual(pdf_info['/Creator'], 'Odoo')
90        reader_buffer.close()
91
92    def tearDown(self):
93        super().tearDown()
94        self.minimal_reader_buffer.close()
95