2021-07-03 20:16:56 +00:00
import pytest
import os
import PyPDF3
from pystitcher . stitcher import Stitcher
from itertools import chain
ROOT_DIR = os . path . dirname ( os . path . abspath ( __file__ ) ) + " /../ "
TEST_DATA = [
2021-07-03 20:42:39 +00:00
( " clean " , 6 , { ' Author ' : ' Wiki, the Cat ' , ' Title ' : ' Super Potato Book ' , ' Subject ' : ' A book about adventures of Wiki, the cat. ' , ' Keywords ' : ' wiki,potato,jelly ' } , [ ( ' Super Potato Book ' , 0 , 0 ) , ( ' Volume 1 ' , 0 , 0 ) , ( ' Part 1 ' , 0 , 1 ) , ( ' Volume 2 ' , 3 , 0 ) , ( ' Part 2 ' , 3 , 1 ) ] ) ,
( " keep " , 6 , { ' Title ' : ' Super Potato Book ' } , [ ( ' Super Potato Book ' , 0 , 0 ) , ( ' Volume 1 ' , 0 , 0 ) , ( ' Part 1 ' , 0 , 1 ) , ( ' Chapter 1 ' , 0 , 2 ) , ( ' Chapter 2 ' , 1 , 2 ) , ( ' Scene 1 ' , 1 , 3 ) , ( ' Scene 2 ' , 2 , 3 ) , ( ' Volume 2 ' , 3 , 0 ) , ( ' Part 3 ' , 3 , 1 ) , ( ' Chapter 3 ' , 3 , 2 ) , ( ' Chapter 4 ' , 4 , 2 ) , ( ' Scene 3 ' , 4 , 3 ) , ( ' Scene 4 ' , 5 , 3 ) ] ) ,
( " flatten " , 6 , { } , [ ( ' Super Potato Book ' , 0 , 0 ) , ( ' Volume 1 ' , 0 , 0 ) , ( ' Part 1 ' , 0 , 1 ) , ( ' Chapter 1 ' , 0 , 2 ) , ( ' Chapter 2 ' , 1 , 2 ) , ( ' Scene 1 ' , 1 , 2 ) , ( ' Scene 2 ' , 2 , 2 ) , ( ' Volume 2 ' , 3 , 0 ) , ( ' Part 3 ' , 3 , 1 ) , ( ' Chapter 3 ' , 3 , 2 ) , ( ' Chapter 4 ' , 4 , 2 ) , ( ' Scene 3 ' , 4 , 2 ) , ( ' Scene 4 ' , 5 , 2 ) ] ) ,
( " rotate " , 9 , { } , [ ( ' Super Potato Book ' , 0 , 0 ) , ( ' Volume 1 ' , 0 , 0 ) , ( ' Part 1 ' , 0 , 1 ) , ( ' Volume 2 ' , 3 , 0 ) , ( ' Part 2 ' , 3 , 1 ) , ( ' Volume 3 ' , 6 , 0 ) , ( ' Part 3 ' , 6 , 1 ) ] ) ,
( " min " , 3 , { } , [ ( ' Part 1 ' , 0 , 0 ) , ( ' Chapter 1 ' , 0 , 1 ) , ( ' Chapter 2 ' , 1 , 1 ) , ( ' Scene 1 ' , 1 , 2 ) , ( ' Scene 2 ' , 2 , 2 ) ] )
2021-07-03 20:16:56 +00:00
]
def pdf_name ( name ) :
return " tests/ %s .pdf " % name
def render ( name ) :
input_file = open ( " tests/book- %s .md " % name , ' r ' )
output_file = " %s .pdf " % name
stitcher = Stitcher ( input_file )
stitcher . generate ( output_file , True )
# Switch back to main directory
os . chdir ( ROOT_DIR )
return pdf_name ( name )
2021-07-03 20:34:02 +00:00
def flatten_bookmarks ( bookmarks , level = 0 ) :
2021-07-03 20:16:56 +00:00
""" Given a list, possibly nested to any level, return it flattened. """
output = [ ]
for destination in bookmarks :
if type ( destination ) == type ( [ ] ) :
2021-07-03 20:34:02 +00:00
output . extend ( flatten_bookmarks ( destination , level + 1 ) )
2021-07-03 20:16:56 +00:00
else :
2021-07-03 20:34:02 +00:00
output . append ( ( destination , level ) )
2021-07-03 20:16:56 +00:00
return output
def get_all_bookmarks ( pdf ) :
2021-07-03 20:34:02 +00:00
""" Returns a list of all bookmarks with title, page number, and level in a PDF file """
bookmarks = flatten_bookmarks ( pdf . getOutlines ( ) )
return [ ( d [ 0 ] [ ' /Title ' ] , pdf . getDestinationPageNumber ( d [ 0 ] ) , d [ 1 ] ) for d in bookmarks ]
2021-07-03 20:16:56 +00:00
2021-07-03 20:42:39 +00:00
@pytest.mark.parametrize ( " name,pages,metadata, bookmarks " , TEST_DATA )
def test_book ( name , pages , metadata , bookmarks ) :
2021-07-03 20:16:56 +00:00
output_file = render ( name )
pdf = PyPDF3 . PdfFileReader ( output_file )
2021-07-03 20:34:02 +00:00
assert pages == pdf . getNumPages ( )
assert bookmarks == get_all_bookmarks ( pdf )
2021-07-03 20:42:39 +00:00
info = pdf . getDocumentInfo ( )
assert ' pystitcher/1.0.1 ' == info [ ' /Producer ' ]
assert ' pystitcher/1.0.1 ' == info [ ' /Creator ' ]
for key in metadata :
assert info [ " / %s " % key ] == metadata [ key ]