Skip to content

Commit 11f869e

Browse files
author
Steve Canny
committed
add Unmarshaller._unmarshal_relationships()
Also added Part._add_relationship() and OpcPackage._add_relationship() since they are one-liners and their method signatures were needed to enable them to be mocked for _unmarshal_relationships().
1 parent db1c1cb commit 11f869e

2 files changed

Lines changed: 43 additions & 0 deletions

File tree

opc/package.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,9 @@ def _unmarshal_relationships(pkg_reader, pkg, parts):
148148
relationships in *pkg_reader* with its target_part set to the actual
149149
target part in *parts*.
150150
"""
151+
for source_uri, srel in pkg_reader.iter_srels():
152+
source = pkg if source_uri == '/' else parts[source_uri]
153+
target = (srel.target_ref if srel.is_external
154+
else parts[srel.target_partname])
155+
source._add_relationship(srel.reltype, target, srel.rId,
156+
srel.is_external)

tests/test_package.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,40 @@ def it_can_unmarshal_parts(self):
151151
enumerate(part_properties))
152152
assert part_factory.call_args_list == expected_calls
153153
assert retval == expected_parts
154+
155+
def it_can_unmarshal_relationships(self):
156+
# test data --------------------
157+
reltype = 'http://reltype'
158+
# mockery ----------------------
159+
pkg_reader = Mock(name='pkg_reader')
160+
pkg_reader.iter_srels.return_value = (
161+
('/', Mock(name='srel1', rId='rId1', reltype=reltype,
162+
target_partname='partname1', is_external=False)),
163+
('/', Mock(name='srel2', rId='rId2', reltype=reltype,
164+
target_ref='target_ref_1', is_external=True)),
165+
('partname1', Mock(name='srel3', rId='rId3', reltype=reltype,
166+
target_partname='partname2', is_external=False)),
167+
('partname2', Mock(name='srel4', rId='rId4', reltype=reltype,
168+
target_ref='target_ref_2', is_external=True)),
169+
)
170+
pkg = Mock(name='pkg')
171+
parts = {}
172+
for num in range(1, 3):
173+
name = 'part%d' % num
174+
part = Mock(name=name)
175+
parts['partname%d' % num] = part
176+
pkg.attach_mock(part, name)
177+
# exercise ---------------------
178+
Unmarshaller._unmarshal_relationships(pkg_reader, pkg, parts)
179+
# verify -----------------------
180+
expected_pkg_calls = [
181+
call._add_relationship(
182+
reltype, parts['partname1'], 'rId1', False),
183+
call._add_relationship(
184+
reltype, 'target_ref_1', 'rId2', True),
185+
call.part1._add_relationship(
186+
reltype, parts['partname2'], 'rId3', False),
187+
call.part2._add_relationship(
188+
reltype, 'target_ref_2', 'rId4', True),
189+
]
190+
assert pkg.mock_calls == expected_pkg_calls

0 commit comments

Comments
 (0)