1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
# pyright: reportPrivateUsage=false
"""Unit-test suite for the docx.text.pagebreak module."""
from typing import cast
import pytest
from docx import types as t
from docx.oxml.text.paragraph import CT_P
from docx.text.pagebreak import RenderedPageBreak
from ..unitutil.cxml import element, xml
class DescribeRenderedPageBreak:
"""Unit-test suite for the docx.text.pagebreak.RenderedPageBreak object."""
def it_raises_on_preceding_fragment_when_page_break_is_not_first_in_paragrah(
self, fake_parent: t.ProvidesStoryPart
):
p_cxml = 'w:p/(w:r/(w:t"abc",w:lastRenderedPageBreak,w:lastRenderedPageBreak))'
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[-1]
page_break = RenderedPageBreak(lrpb, fake_parent)
with pytest.raises(ValueError, match="only defined on first rendered page-br"):
page_break.preceding_paragraph_fragment
def it_produces_None_for_preceding_fragment_when_page_break_is_leading(
self, fake_parent: t.ProvidesStoryPart
):
"""A page-break with no preceding content is "leading"."""
p_cxml = 'w:p/(w:pPr/w:ind,w:r/(w:lastRenderedPageBreak,w:t"foo",w:t"bar"))'
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[0]
page_break = RenderedPageBreak(lrpb, fake_parent)
preceding_fragment = page_break.preceding_paragraph_fragment
assert preceding_fragment is None
def it_can_split_off_the_preceding_paragraph_content_when_in_a_run(
self, fake_parent: t.ProvidesStoryPart
):
p_cxml = (
"w:p/("
" w:pPr/w:ind"
' ,w:r/(w:t"foo",w:lastRenderedPageBreak,w:t"bar")'
' ,w:r/w:t"barfoo"'
")"
)
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[0]
page_break = RenderedPageBreak(lrpb, fake_parent)
preceding_fragment = page_break.preceding_paragraph_fragment
expected_cxml = 'w:p/(w:pPr/w:ind,w:r/w:t"foo")'
assert preceding_fragment is not None
assert preceding_fragment._p.xml == xml(expected_cxml)
def and_it_can_split_off_the_preceding_paragraph_content_when_in_a_hyperlink(
self, fake_parent: t.ProvidesStoryPart
):
p_cxml = (
"w:p/("
" w:pPr/w:ind"
' ,w:hyperlink/w:r/(w:t"foo",w:lastRenderedPageBreak,w:t"bar")'
' ,w:r/w:t"barfoo"'
")"
)
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[0]
page_break = RenderedPageBreak(lrpb, fake_parent)
preceding_fragment = page_break.preceding_paragraph_fragment
expected_cxml = 'w:p/(w:pPr/w:ind,w:hyperlink/w:r/(w:t"foo",w:t"bar"))'
assert preceding_fragment is not None
assert preceding_fragment._p.xml == xml(expected_cxml)
def it_raises_on_following_fragment_when_page_break_is_not_first_in_paragrah(
self, fake_parent: t.ProvidesStoryPart
):
p_cxml = 'w:p/(w:r/(w:lastRenderedPageBreak,w:lastRenderedPageBreak,w:t"abc"))'
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[-1]
page_break = RenderedPageBreak(lrpb, fake_parent)
with pytest.raises(ValueError, match="only defined on first rendered page-br"):
page_break.following_paragraph_fragment
def it_produces_None_for_following_fragment_when_page_break_is_trailing(
self, fake_parent: t.ProvidesStoryPart
):
"""A page-break with no following content is "trailing"."""
p_cxml = 'w:p/(w:pPr/w:ind,w:r/(w:t"foo",w:t"bar",w:lastRenderedPageBreak))'
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[0]
page_break = RenderedPageBreak(lrpb, fake_parent)
following_fragment = page_break.following_paragraph_fragment
assert following_fragment is None
def it_can_split_off_the_following_paragraph_content_when_in_a_run(
self, fake_parent: t.ProvidesStoryPart
):
p_cxml = 'w:p/(w:pPr/w:ind,w:r/(w:t"foo",w:lastRenderedPageBreak,w:t"bar"),w:r/w:t"foo")'
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[0]
page_break = RenderedPageBreak(lrpb, fake_parent)
following_fragment = page_break.following_paragraph_fragment
expected_cxml = 'w:p/(w:pPr/w:ind,w:r/w:t"bar",w:r/w:t"foo")'
assert following_fragment is not None
assert following_fragment._p.xml == xml(expected_cxml)
def and_it_can_split_off_the_following_paragraph_content_when_in_a_hyperlink(
self, fake_parent: t.ProvidesStoryPart
):
p_cxml = (
"w:p/("
" w:pPr/w:ind"
' ,w:hyperlink/w:r/(w:t"foo",w:lastRenderedPageBreak,w:t"bar")'
' ,w:r/w:t"baz"'
' ,w:r/w:t"qux"'
")"
)
p = cast(CT_P, element(p_cxml))
lrpb = p.lastRenderedPageBreaks[0]
page_break = RenderedPageBreak(lrpb, fake_parent)
following_fragment = page_break.following_paragraph_fragment
expected_cxml = 'w:p/(w:pPr/w:ind,w:r/w:t"baz",w:r/w:t"qux")'
assert following_fragment is not None
assert following_fragment._p.xml == xml(expected_cxml)
|