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
|
# encoding: utf-8
"""
Test suite for opc.oxml module
"""
from docx.opc.constants import RELATIONSHIP_TARGET_MODE as RTM
from docx.opc.oxml import (
CT_Default, CT_Override, CT_Relationship, CT_Relationships, CT_Types
)
from docx.oxml.xmlchemy import serialize_for_reading
from .unitdata.rels import (
a_Default, an_Override, a_Relationship, a_Relationships, a_Types
)
class DescribeCT_Default(object):
def it_provides_read_access_to_xml_values(self):
default = a_Default().element
assert default.extension == 'xml'
assert default.content_type == 'application/xml'
def it_can_construct_a_new_default_element(self):
default = CT_Default.new('xml', 'application/xml')
expected_xml = a_Default().xml
assert default.xml == expected_xml
class DescribeCT_Override(object):
def it_provides_read_access_to_xml_values(self):
override = an_Override().element
assert override.partname == '/part/name.xml'
assert override.content_type == 'app/vnd.type'
def it_can_construct_a_new_override_element(self):
override = CT_Override.new('/part/name.xml', 'app/vnd.type')
expected_xml = an_Override().xml
assert override.xml == expected_xml
class DescribeCT_Relationship(object):
def it_provides_read_access_to_xml_values(self):
rel = a_Relationship().element
assert rel.rId == 'rId9'
assert rel.reltype == 'ReLtYpE'
assert rel.target_ref == 'docProps/core.xml'
assert rel.target_mode == RTM.INTERNAL
def it_can_construct_from_attribute_values(self):
cases = (
('rId9', 'ReLtYpE', 'foo/bar.xml', None),
('rId9', 'ReLtYpE', 'bar/foo.xml', RTM.INTERNAL),
('rId9', 'ReLtYpE', 'http://some/link', RTM.EXTERNAL),
)
for rId, reltype, target, target_mode in cases:
if target_mode is None:
rel = CT_Relationship.new(rId, reltype, target)
else:
rel = CT_Relationship.new(rId, reltype, target, target_mode)
builder = a_Relationship().with_target(target)
if target_mode == RTM.EXTERNAL:
builder = builder.with_target_mode(RTM.EXTERNAL)
expected_rel_xml = builder.xml
assert rel.xml == expected_rel_xml
class DescribeCT_Relationships(object):
def it_can_construct_a_new_relationships_element(self):
rels = CT_Relationships.new()
expected_xml = (
'<Relationships xmlns="http://schemas.openxmlformats.org/package'
'/2006/relationships"/>\n'
)
assert serialize_for_reading(rels) == expected_xml
def it_can_build_rels_element_incrementally(self):
# setup ------------------------
rels = CT_Relationships.new()
# exercise ---------------------
rels.add_rel('rId1', 'http://reltype1', 'docProps/core.xml')
rels.add_rel('rId2', 'http://linktype', 'http://some/link', True)
rels.add_rel('rId3', 'http://reltype2', '../slides/slide1.xml')
# verify -----------------------
expected_rels_xml = a_Relationships().xml
assert serialize_for_reading(rels) == expected_rels_xml
def it_can_generate_rels_file_xml(self):
expected_xml = (
'<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\'?>\n'
'<Relationships xmlns="http://schemas.openxmlformats.org/package'
'/2006/relationships"/>'.encode('utf-8')
)
assert CT_Relationships.new().xml == expected_xml
class DescribeCT_Types(object):
def it_provides_access_to_default_child_elements(self):
types = a_Types().element
assert len(types.defaults) == 2
for default in types.defaults:
assert isinstance(default, CT_Default)
def it_provides_access_to_override_child_elements(self):
types = a_Types().element
assert len(types.overrides) == 3
for override in types.overrides:
assert isinstance(override, CT_Override)
def it_should_have_empty_list_on_no_matching_elements(self):
types = a_Types().empty().element
assert types.defaults == []
assert types.overrides == []
def it_can_construct_a_new_types_element(self):
types = CT_Types.new()
expected_xml = a_Types().empty().xml
assert types.xml == expected_xml
def it_can_build_types_element_incrementally(self):
types = CT_Types.new()
types.add_default('xml', 'application/xml')
types.add_default('jpeg', 'image/jpeg')
types.add_override('/docProps/core.xml', 'app/vnd.type1')
types.add_override('/ppt/presentation.xml', 'app/vnd.type2')
types.add_override('/docProps/thumbnail.jpeg', 'image/jpeg')
expected_types_xml = a_Types().xml
assert types.xml == expected_types_xml
|