Skip to content

Commit 321d8a9

Browse files
author
Steve Canny
committed
add _ContentTypeMap.from_xml()
1 parent ab2ec49 commit 321d8a9

2 files changed

Lines changed: 59 additions & 0 deletions

File tree

opc/pkgreader.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,15 @@ def from_xml(content_types_xml):
107107
Return a new |_ContentTypeMap| instance populated with the contents
108108
of *content_types_xml*.
109109
"""
110+
types_elm = oxml_fromstring(content_types_xml)
111+
ctmap = _ContentTypeMap()
112+
ctmap._overrides = dict(
113+
(o.partname, o.content_type) for o in types_elm.overrides
114+
)
115+
ctmap._defaults = dict(
116+
('.%s' % d.extension, d.content_type) for d in types_elm.defaults
117+
)
118+
return ctmap
110119

111120

112121
class _SerializedPart(object):

tests/test_pkgreader.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
from .unitutil import class_mock, initializer_mock, method_mock
2424

2525

26+
@pytest.fixture
27+
def oxml_fromstring(request):
28+
_patch = patch('opc.pkgreader.oxml_fromstring')
29+
request.addfinalizer(_patch.stop)
30+
return _patch.start()
31+
32+
2633
class DescribePackageReader(object):
2734

2835
@pytest.fixture
@@ -181,6 +188,49 @@ def it_can_retrieve_srels_for_a_source_uri(
181188
assert retval == srels
182189

183190

191+
class Describe_ContentTypeMap(object):
192+
193+
def it_can_construct_from_types_xml(self, oxml_fromstring):
194+
# test data --------------------
195+
content_types = (
196+
'app/vnd.type1', 'app/vnd.type2', 'app/vnd.type3',
197+
'app/vnd.type4',
198+
)
199+
content_types_xml = '<DontCare/>'
200+
extensions = ('rels', 'xml')
201+
exts = tuple(['.%s' % extension for extension in extensions])
202+
partnames = ('/part/name1.xml', '/part/name2.xml')
203+
# mockery ----------------------
204+
overrides = (
205+
Mock(name='override_elm_1', partname=partnames[0],
206+
content_type=content_types[0]),
207+
Mock(name='override_elm_2', partname=partnames[1],
208+
content_type=content_types[1]),
209+
)
210+
defaults = (
211+
Mock(name='default_elm_1', extension=extensions[0],
212+
content_type=content_types[2]),
213+
Mock(name='default_elm_2', extension=extensions[1],
214+
content_type=content_types[3]),
215+
)
216+
types_elm = Mock(
217+
name='types_elm', overrides=overrides, defaults=defaults
218+
)
219+
oxml_fromstring.return_value = types_elm
220+
# exercise ---------------------
221+
ct_map = _ContentTypeMap.from_xml(content_types_xml)
222+
# verify -----------------------
223+
expected_overrides = {
224+
partnames[0]: content_types[0], partnames[1]: content_types[1]
225+
}
226+
expected_defaults = {
227+
exts[0]: content_types[2], exts[1]: content_types[3]
228+
}
229+
oxml_fromstring.assert_called_once_with(content_types_xml)
230+
assert ct_map._overrides == expected_overrides
231+
assert ct_map._defaults == expected_defaults
232+
233+
184234
class Describe_SerializedRelationship(object):
185235

186236
def it_remembers_construction_values(self):

0 commit comments

Comments
 (0)