Skip to content

Commit 686b01b

Browse files
committed
rfctr: modernize tests related to pptx.opc.package
1 parent 8fa420d commit 686b01b

File tree

8 files changed

+162
-297
lines changed

8 files changed

+162
-297
lines changed

tests/opc/test_package.py

Lines changed: 79 additions & 171 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
RELATIONSHIP_TYPE as RT,
1515
)
1616
from pptx.opc.oxml import CT_Relationship, CT_Relationships
17-
from pptx.opc.packuri import PACKAGE_URI, PackURI
1817
from pptx.opc.package import (
1918
OpcPackage,
2019
Part,
@@ -25,7 +24,7 @@
2524
_Relationship,
2625
_Relationships,
2726
)
28-
from pptx.opc.serialized import PackageReader
27+
from pptx.opc.packuri import PACKAGE_URI, PackURI
2928
from pptx.oxml import parse_xml
3029

3130
from ..unitutil.cxml import element
@@ -125,32 +124,6 @@ def it_can_iterate_over_its_relationships(self, request, _rels_prop_):
125124
rels[2],
126125
)
127126

128-
def it_can_establish_a_relationship_to_another_part(
129-
self, request, _rels_prop_, relationships_
130-
):
131-
relationships_.get_or_add.return_value = "rId99"
132-
_rels_prop_.return_value = relationships_
133-
part_ = instance_mock(request, Part)
134-
package = OpcPackage(None)
135-
136-
rId = package.relate_to(part_, "http://rel/type")
137-
138-
relationships_.get_or_add.assert_called_once_with("http://rel/type", part_)
139-
assert rId == "rId99"
140-
141-
def it_can_find_a_part_related_by_reltype(
142-
self, request, _rels_prop_, relationships_
143-
):
144-
related_part_ = instance_mock(request, Part, name="related_part_")
145-
relationships_.part_with_reltype.return_value = related_part_
146-
_rels_prop_.return_value = relationships_
147-
package = OpcPackage(None)
148-
149-
related_part = package.part_related_by(RT.SLIDE)
150-
151-
relationships_.part_with_reltype.assert_called_once_with(RT.SLIDE)
152-
assert related_part is related_part_
153-
154127
@pytest.mark.parametrize(
155128
"ns, expected_n",
156129
(((), 1), ((1,), 2), ((1, 2), 3), ((2, 4), 3), ((1, 4), 3)),
@@ -174,6 +147,32 @@ def it_can_find_the_next_available_partname(self, request, ns, expected_n):
174147
PackURI_.assert_called_once_with(next_partname)
175148
assert partname == next_partname
176149

150+
def it_can_find_a_part_related_by_reltype(
151+
self, request, _rels_prop_, relationships_
152+
):
153+
related_part_ = instance_mock(request, Part, name="related_part_")
154+
relationships_.part_with_reltype.return_value = related_part_
155+
_rels_prop_.return_value = relationships_
156+
package = OpcPackage(None)
157+
158+
related_part = package.part_related_by(RT.SLIDE)
159+
160+
relationships_.part_with_reltype.assert_called_once_with(RT.SLIDE)
161+
assert related_part is related_part_
162+
163+
def it_can_establish_a_relationship_to_another_part(
164+
self, request, _rels_prop_, relationships_
165+
):
166+
relationships_.get_or_add.return_value = "rId99"
167+
_rels_prop_.return_value = relationships_
168+
part_ = instance_mock(request, Part)
169+
package = OpcPackage(None)
170+
171+
rId = package.relate_to(part_, "http://rel/type")
172+
173+
relationships_.get_or_add.assert_called_once_with("http://rel/type", part_)
174+
assert rId == "rId99"
175+
177176
def it_can_save_to_a_pkg_file(self, request, _rels_prop_, relationships_):
178177
_rels_prop_.return_value = relationships_
179178
parts_ = tuple(instance_mock(request, Part) for _ in range(3))
@@ -314,18 +313,6 @@ def it_loads_the_xml_relationships_from_the_package_to_help(self, request):
314313
def package_(self, request):
315314
return instance_mock(request, OpcPackage)
316315

317-
@pytest.fixture
318-
def package_reader_(self, request):
319-
return instance_mock(request, PackageReader)
320-
321-
@pytest.fixture
322-
def _package_reader_prop_(self, request):
323-
return property_mock(request, _PackageLoader, "_package_reader")
324-
325-
@pytest.fixture
326-
def _parts_prop_(self, request):
327-
return property_mock(request, _PackageLoader, "_parts")
328-
329316
@pytest.fixture
330317
def _xml_rels_prop_(self, request):
331318
return property_mock(request, _PackageLoader, "_xml_rels")
@@ -335,25 +322,24 @@ class DescribePart(object):
335322
"""Unit-test suite for `pptx.opc.package.Part` objects."""
336323

337324
def it_can_be_constructed_by_PartFactory(self, request, package_):
338-
partname_ = PackURI("/ppt/slides/slide1.xml")
325+
partname_ = instance_mock(request, PackURI)
339326
_init_ = initializer_mock(request, Part)
340327

341-
part = Part.load(partname_, CT.PML_SLIDE, b"blob", package_)
328+
part = Part.load(partname_, CT.PML_SLIDE, package_, b"blob")
342329

343-
_init_.assert_called_once_with(part, partname_, CT.PML_SLIDE, b"blob", package_)
330+
_init_.assert_called_once_with(part, partname_, CT.PML_SLIDE, package_, b"blob")
344331
assert isinstance(part, Part)
345332

346333
def it_uses_the_load_blob_as_its_blob(self):
347334
assert Part(None, None, None, b"blob").blob == b"blob"
348335

349336
def it_can_change_its_blob(self):
350-
part, new_blob = Part(None, None, "xyz", None), "foobar"
351-
part.blob = new_blob
352-
assert part.blob == new_blob
337+
part = Part(None, None, None, b"old-blob")
338+
part.blob = b"new-blob"
339+
assert part.blob == b"new-blob"
353340

354-
def it_knows_its_content_type(self, content_type_fixture):
355-
part, expected_content_type = content_type_fixture
356-
assert part.content_type == expected_content_type
341+
def it_knows_its_content_type(self):
342+
assert Part(None, CT.PML_SLIDE, None).content_type == CT.PML_SLIDE
357343

358344
@pytest.mark.parametrize("ref_count, calls", ((2, []), (1, [call("rId42")])))
359345
def it_can_drop_a_relationship(
@@ -370,26 +356,26 @@ def it_can_drop_a_relationship(
370356
_rel_ref_count_.assert_called_once_with(part, "rId42")
371357
assert relationships_.pop.call_args_list == calls
372358

373-
def it_knows_the_package_it_belongs_to(self, package_get_fixture):
374-
part, expected_package = package_get_fixture
375-
assert part.package == expected_package
359+
def it_knows_the_package_it_belongs_to(self, package_):
360+
assert Part(None, None, package_).package is package_
376361

377-
def it_can_find_a_related_part_by_reltype(self, related_part_fixture):
378-
part, reltype_, related_part_ = related_part_fixture
362+
def it_can_find_a_part_related_by_reltype(self, _rels_prop_, relationships_, part_):
363+
relationships_.part_with_reltype.return_value = part_
364+
_rels_prop_.return_value = relationships_
365+
part = Part(None, None, None)
379366

380-
related_part = part.part_related_by(reltype_)
367+
related_part = part.part_related_by(RT.CHART)
381368

382-
part.rels.part_with_reltype.assert_called_once_with(reltype_)
383-
assert related_part is related_part_
369+
relationships_.part_with_reltype.assert_called_once_with(RT.CHART)
370+
assert related_part is part_
384371

385-
def it_knows_its_partname(self, partname_get_fixture):
386-
part, expected_partname = partname_get_fixture
387-
assert part.partname == expected_partname
372+
def it_knows_its_partname(self):
373+
assert Part(PackURI("/part/name"), None, None).partname == PackURI("/part/name")
388374

389-
def it_can_change_its_partname(self, partname_set_fixture):
390-
part, new_partname = partname_set_fixture
391-
part.partname = new_partname
392-
assert part.partname == new_partname
375+
def it_can_change_its_partname(self):
376+
part = Part(PackURI("/old/part/name"), None, None)
377+
part.partname = PackURI("/new/part/name")
378+
assert part.partname == PackURI("/new/part/name")
393379

394380
def it_can_establish_a_relationship_to_another_part(
395381
self, _rels_prop_, relationships_, part_
@@ -403,13 +389,19 @@ def it_can_establish_a_relationship_to_another_part(
403389
relationships_.get_or_add.assert_called_once_with(RT.SLIDE, part_)
404390
assert rId == "rId42"
405391

406-
def it_can_establish_an_external_relationship(self, relate_to_url_fixture):
407-
part, url_, reltype_, rId_ = relate_to_url_fixture
392+
def and_it_can_establish_an_external_relationship(
393+
self, _rels_prop_, relationships_
394+
):
395+
relationships_.get_or_add_ext_rel.return_value = "rId24"
396+
_rels_prop_.return_value = relationships_
397+
part = Part(None, None, None)
408398

409-
rId = part.relate_to(url_, reltype_, is_external=True)
399+
rId = part.relate_to("http://url", RT.HYPERLINK, is_external=True)
410400

411-
part.rels.get_or_add_ext_rel.assert_called_once_with(reltype_, url_)
412-
assert rId is rId_
401+
relationships_.get_or_add_ext_rel.assert_called_once_with(
402+
RT.HYPERLINK, "http://url"
403+
)
404+
assert rId == "rId24"
413405

414406
def it_can_find_a_related_part_by_rId(
415407
self, request, _rels_prop_, relationships_, relationship_, part_
@@ -424,20 +416,18 @@ def it_can_find_a_related_part_by_rId(
424416
relationships_.__getitem__.assert_called_once_with("rId17")
425417
assert related_part is part_
426418

427-
def it_provides_access_to_its_relationships(self, rels_fixture):
428-
part, Relationships_, partname_, rels_ = rels_fixture
429-
430-
rels = part.rels
431-
432-
Relationships_.assert_called_once_with(partname_.baseURI)
433-
assert rels is rels_
434-
435-
def it_can_find_the_uri_of_an_external_relationship(self, target_ref_fixture):
436-
part, rId_, url_ = target_ref_fixture
419+
def it_can_find_a_target_ref_URI_by_rId(
420+
self, request, _rels_prop_, relationships_, relationship_
421+
):
422+
relationship_.target_ref = "http://url"
423+
relationships_.__getitem__.return_value = relationship_
424+
_rels_prop_.return_value = relationships_
425+
part = Part(None, None, None)
437426

438-
url = part.target_ref(rId_)
427+
target_ref = part.target_ref("rId9")
439428

440-
assert url == url_
429+
relationships_.__getitem__.assert_called_once_with("rId9")
430+
assert target_ref == "http://url"
441431

442432
def it_can_load_a_blob_from_a_file_path_to_help(self):
443433
path = absjoin(test_file_dir, "minimal.pptx")
@@ -451,89 +441,27 @@ def it_can_load_a_blob_from_a_file_like_object_to_help(self):
451441
part = Part(None, None, None, None)
452442
assert part._blob_from_file(io.BytesIO(b"012345")) == b"012345"
453443

454-
# fixtures ---------------------------------------------
455-
456-
@pytest.fixture
457-
def blob_fixture(self, blob_):
458-
part = Part(None, None, blob_, None)
459-
return part, blob_
460-
461-
@pytest.fixture
462-
def content_type_fixture(self):
463-
content_type = "content/type"
464-
part = Part(None, content_type, None, None)
465-
return part, content_type
466-
467-
@pytest.fixture
468-
def package_get_fixture(self, package_):
469-
part = Part(None, None, package_)
470-
return part, package_
471-
472-
@pytest.fixture
473-
def partname_get_fixture(self):
474-
partname = PackURI("/part/name")
475-
part = Part(partname, None, None, None)
476-
return part, partname
477-
478-
@pytest.fixture
479-
def partname_set_fixture(self):
480-
old_partname = PackURI("/old/part/name")
481-
new_partname = PackURI("/new/part/name")
482-
part = Part(old_partname, None, None, None)
483-
return part, new_partname
484-
485-
@pytest.fixture
486-
def relate_to_url_fixture(self, part, _rels_prop_, rels_, url_, reltype_, rId_):
487-
_rels_prop_.return_value = rels_
488-
return part, url_, reltype_, rId_
489-
490-
@pytest.fixture
491-
def related_part_fixture(self, part, _rels_prop_, rels_, reltype_, part_):
492-
_rels_prop_.return_value = rels_
493-
return part, reltype_, part_
444+
def it_constructs_its_relationships_object_to_help(self, request, relationships_):
445+
_Relationships_ = class_mock(
446+
request, "pptx.opc.package._Relationships", return_value=relationships_
447+
)
448+
part = Part(PackURI("/ppt/slides/slide1.xml"), None, None)
494449

495-
@pytest.fixture
496-
def rels_fixture(self, Relationships_, partname_, rels_):
497-
part = Part(partname_, None, None)
498-
return part, Relationships_, partname_, rels_
450+
rels = part._rels
499451

500-
@pytest.fixture
501-
def target_ref_fixture(self, part, _rels_prop_, rId_, rel_, url_):
502-
_rels_prop_.return_value = {rId_: rel_}
503-
return part, rId_, url_
452+
_Relationships_.assert_called_once_with("/ppt/slides")
453+
assert rels is relationships_
504454

505455
# fixture components ---------------------------------------------
506456

507-
@pytest.fixture
508-
def blob_(self, request):
509-
return instance_mock(request, bytes)
510-
511457
@pytest.fixture
512458
def package_(self, request):
513459
return instance_mock(request, OpcPackage)
514460

515-
@pytest.fixture
516-
def part(self):
517-
return Part(None, None, None)
518-
519461
@pytest.fixture
520462
def part_(self, request):
521463
return instance_mock(request, Part)
522464

523-
@pytest.fixture
524-
def partname_(self, request):
525-
return instance_mock(request, PackURI)
526-
527-
@pytest.fixture
528-
def Relationships_(self, request, rels_):
529-
return class_mock(
530-
request, "pptx.opc.package._Relationships", return_value=rels_
531-
)
532-
533-
@pytest.fixture
534-
def rel_(self, request, rId_, url_):
535-
return instance_mock(request, _Relationship, rId=rId_, target_ref=url_)
536-
537465
@pytest.fixture
538466
def relationship_(self, request):
539467
return instance_mock(request, _Relationship)
@@ -542,30 +470,10 @@ def relationship_(self, request):
542470
def relationships_(self, request):
543471
return instance_mock(request, _Relationships)
544472

545-
@pytest.fixture
546-
def rels_(self, request, part_, rel_, rId_):
547-
rels_ = instance_mock(request, _Relationships)
548-
rels_.part_with_reltype.return_value = part_
549-
rels_.get_or_add.return_value = rel_
550-
rels_.get_or_add_ext_rel.return_value = rId_
551-
return rels_
552-
553473
@pytest.fixture
554474
def _rels_prop_(self, request):
555475
return property_mock(request, Part, "_rels")
556476

557-
@pytest.fixture
558-
def reltype_(self, request):
559-
return instance_mock(request, str)
560-
561-
@pytest.fixture
562-
def rId_(self, request):
563-
return instance_mock(request, str)
564-
565-
@pytest.fixture
566-
def url_(self, request):
567-
return instance_mock(request, str)
568-
569477

570478
class DescribeXmlPart(object):
571479
"""Unit-test suite for `pptx.opc.package.XmlPart` objects."""

tests/opc/unitdata/rels.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def with_indent(self, indent):
2525
return self
2626

2727

28-
class RelationshipsBuilder(object):
29-
"""Builder class for test _Relationships"""
28+
class _RelationshipsBuilder(object):
29+
"""Builder class for test _Relationshipss"""
3030

3131
partname_tmpls = {
3232
RT.SLIDE_MASTER: "/ppt/slideMasters/slideMaster%d.xml",
@@ -295,7 +295,7 @@ def a_Relationships():
295295

296296

297297
def a_rels():
298-
return RelationshipsBuilder()
298+
return _RelationshipsBuilder()
299299

300300

301301
def a_Types():

0 commit comments

Comments
 (0)