# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import io
from pypdf import PdfReader
import frappe
import frappe.utils.pdf as pdfgen
from frappe.core.doctype.file.test_file import make_test_image_file
from frappe.tests import IntegrationTestCase
class TestPdf(IntegrationTestCase):
@property
def html(self):
return """
This is a test html snippet
"""
def runTest(self):
self.test_read_options_from_html()
def test_read_options_from_html(self):
_, html_options = pdfgen.read_options_from_html(self.html)
self.assertTrue(html_options["margin-top"] == "0")
self.assertTrue(html_options["margin-left"] == "10mm")
self.assertTrue(html_options["margin-right"] == "0")
html_1 = """
Hello
"""
_, options = pdfgen.read_options_from_html(html_1)
self.assertTrue(options["margin-top"] == "0")
self.assertTrue(options["margin-left"] == "10mm")
self.assertTrue(options["margin-bottom"] == "20mm")
# margin-right was for .more-info (child of .print-format)
# so it should not be extracted into options
self.assertFalse(options.get("margin-right"))
def test_empty_style(self):
html = """
Hello
"""
_, options = pdfgen.read_options_from_html(html)
self.assertTrue(options)
def test_pdf_encryption(self):
password = "qwe"
pdf = pdfgen.get_pdf(self.html, options={"password": password})
reader = PdfReader(io.BytesIO(pdf))
self.assertTrue(reader.is_encrypted)
self.assertTrue(reader.decrypt(password))
def test_pdf_generation_as_a_user(self):
frappe.set_user("Administrator")
pdf = pdfgen.get_pdf(self.html)
self.assertTrue(pdf)
def test_private_images_in_pdf(self):
with make_test_image_file(private=True) as file:
html = f"""
"""
pdf = pdfgen.get_pdf(html)
# If image was actually retrieved then size will be in few kbs, else bytes.
self.assertGreaterEqual(len(pdf), 10_000)