diff options
| author | Benjamin Frantzen (bfr) <bfr@odoo.com> | 2020-06-10 17:03:10 +0000 |
|---|---|---|
| committer | Benjamin Frantzen (bfr) <bfr@odoo.com> | 2020-06-18 16:49:32 +0000 |
| commit | ae15f89f73cffaebd20ba74b9c20ad641a1ea5e4 (patch) | |
| tree | c2cab938806908dfbf7f0477976c3d7d289e91d7 /odoo/addons/base/tests/test_pdf.py | |
| parent | 80379606dbc7d4afdb22476eea97a28ed88fe497 (diff) | |
[FIX] tools.pdf: do not crash when PDF has no attachments
In the PDF, `DictionaryObject` can be wrapped in `IndirectObject`. For nested
dictionaries, using `get` on a `DictionaryObject` will unwrap the result if it's
an `IndirectObject`, but not `__getitem__` so when trying to futher call `get`
on the result will cause an error: we need to unwrap the object first.
Instead, we patch `DictionaryObject.get()` for it to unwrap the object in case
it's an `IndirectObject`.
This is a follow-up commit of fece5ab1bf2fef043b131f1bd0886f0841116103
closes odoo/odoo#53269
X-original-commit: 189a0b28ec7fdb7472f936450cfd7b4bfd6912ed
Signed-off-by: Olivier Dony (odo) <odo@openerp.com>
Signed-off-by: bfr-o <bfr-o@users.noreply.github.com>
Diffstat (limited to 'odoo/addons/base/tests/test_pdf.py')
| -rw-r--r-- | odoo/addons/base/tests/test_pdf.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/odoo/addons/base/tests/test_pdf.py b/odoo/addons/base/tests/test_pdf.py new file mode 100644 index 00000000000..6954ca4a689 --- /dev/null +++ b/odoo/addons/base/tests/test_pdf.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests.common import TransactionCase +from odoo.tools import pdf +from odoo.modules.module import get_module_resource +import io + + +class TestPdf(TransactionCase): + """ Tests on pdf. """ + + def setUp(self): + super().setUp() + file_path = get_module_resource('base', 'tests', 'minimal.pdf') + self.file = open(file_path, 'rb').read() + self.minimal_reader_buffer = io.BytesIO(self.file) + self.minimal_pdf_reader = pdf.OdooPdfFileReader(self.minimal_reader_buffer) + + def test_odoo_pdf_file_reader(self): + attachments = list(self.minimal_pdf_reader.getAttachments()) + self.assertEqual(len(attachments), 0) + + pdf_writer = pdf.PdfFileWriter() + pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) + pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment') + + attachments = list(self.minimal_pdf_reader.getAttachments()) + self.assertEqual(len(attachments), 1) + + def test_odoo_pdf_file_writer(self): + attachments = list(self.minimal_pdf_reader.getAttachments()) + self.assertEqual(len(attachments), 0) + + pdf_writer = pdf.OdooPdfFileWriter() + pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) + + pdf_writer.addAttachment('test_attachment.txt', b'My awesome attachment') + attachments = list(self.minimal_pdf_reader.getAttachments()) + self.assertEqual(len(attachments), 1) + + pdf_writer.addAttachment('another_attachment.txt', b'My awesome OTHER attachment') + attachments = list(self.minimal_pdf_reader.getAttachments()) + self.assertEqual(len(attachments), 2) + + def test_merge_pdf(self): + self.assertEqual(self.minimal_pdf_reader.getNumPages(), 1) + page = self.minimal_pdf_reader.getPage(0) + + merged_pdf = pdf.merge_pdf([self.file, self.file]) + merged_reader_buffer = io.BytesIO(merged_pdf) + merged_pdf_reader = pdf.OdooPdfFileReader(merged_reader_buffer) + self.assertEqual(merged_pdf_reader.getNumPages(), 2) + merged_reader_buffer.close() + + def test_branded_file_writer(self): + # It's not easy to create a PDF with PyPDF2, so instead we copy minimal.pdf with our custom pdf writer + pdf_writer = pdf.PdfFileWriter() # BrandedFileWriter + pdf_writer.cloneReaderDocumentRoot(self.minimal_pdf_reader) + writer_buffer = io.BytesIO() + pdf_writer.write(writer_buffer) + branded_content = writer_buffer.getvalue() + writer_buffer.close() + + # Read the metadata of the newly created pdf. + reader_buffer = io.BytesIO(branded_content) + pdf_reader = pdf.PdfFileReader(reader_buffer) + pdf_info = pdf_reader.getDocumentInfo() + self.assertEqual(pdf_info['/Producer'], 'Odoo') + self.assertEqual(pdf_info['/Creator'], 'Odoo') + reader_buffer.close() + + def tearDown(self): + super().tearDown() + self.minimal_reader_buffer.close() |
