Skip to content

Commit 8e9210c

Browse files
author
Steve Canny
committed
test: refactor test_api.py
1 parent 4bccc6f commit 8e9210c

1 file changed

Lines changed: 77 additions & 52 deletions

File tree

tests/test_api.py

Lines changed: 77 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,78 +6,103 @@
66

77
import pytest
88

9-
from mock import create_autospec, Mock, PropertyMock
10-
119
from docx import parts
1210
from docx.api import Document, _Document
1311
from docx.opc.constants import CONTENT_TYPE as CT
12+
from docx.opc.package import OpcPackage
1413

15-
from .unitutil import class_mock, var_mock
14+
from .unitutil import class_mock, instance_mock, var_mock
1615

1716

1817
class DescribeDocument(object):
1918

19+
def it_opens_a_docx_file(self, open_fixture):
20+
docx_, OpcPackage_, _Document_, package, document_part = open_fixture
21+
_document = Document(docx_)
22+
OpcPackage_.open.assert_called_once_with(docx_)
23+
_Document_.assert_called_once_with(package, document_part)
24+
assert _document is _Document_.return_value
25+
26+
def it_uses_default_if_no_file_provided(self, OpcPackage_, default_docx_):
27+
Document()
28+
OpcPackage_.open.assert_called_once_with(default_docx_)
29+
30+
def it_should_raise_if_not_a_Word_file(
31+
self, OpcPackage_, package_, docx_):
32+
package_.main_document.content_type = 'foobar'
33+
with pytest.raises(ValueError):
34+
Document(docx_)
35+
36+
# fixtures -------------------------------------------------------
37+
2038
@pytest.fixture
2139
def _Document_(self, request):
2240
return class_mock(request, 'docx.api._Document')
2341

2442
@pytest.fixture
25-
def default_docx(self, request):
43+
def default_docx_(self, request):
2644
return var_mock(request, 'docx.api._default_docx_path')
2745

2846
@pytest.fixture
29-
def OpcPackage_(self, OpcPackage_mockery):
30-
return OpcPackage_mockery[0]
47+
def document_part_(self, request):
48+
return instance_mock(
49+
request, parts._Document, content_type=CT.WML_DOCUMENT_MAIN
50+
)
3151

3252
@pytest.fixture
33-
def OpcPackage_mockery(self, request):
53+
def docx_(self, request):
54+
return instance_mock(request, str)
55+
56+
@pytest.fixture
57+
def OpcPackage_(self, request, package_):
3458
OpcPackage_ = class_mock(request, 'docx.api.OpcPackage')
35-
pkg = OpcPackage_.open.return_value
36-
main_document = PropertyMock(name='main_document')
37-
main_document.return_value.content_type = CT.WML_DOCUMENT_MAIN
38-
type(pkg).main_document = main_document
39-
document_part = main_document.return_value
40-
return (OpcPackage_, pkg, main_document, document_part)
41-
42-
def it_opens_a_docx_file_on_construction(self, OpcPackage_mockery,
43-
_Document_):
44-
# mockery ----------------------
45-
docx = Mock(name='docx')
46-
OpcPackage_, pkg, main_document, document_part = OpcPackage_mockery
47-
# exercise ---------------------
48-
doc = Document(docx)
49-
# verify -----------------------
50-
OpcPackage_.open.assert_called_once_with(docx)
51-
main_document.assert_called_once_with()
52-
_Document_.assert_called_once_with(pkg, document_part)
53-
assert isinstance(doc, _Document)
54-
55-
def it_uses_default_if_no_file_provided(self, OpcPackage_, _Document_,
56-
default_docx):
57-
Document()
58-
OpcPackage_.open.assert_called_once_with(default_docx)
59-
60-
def it_should_raise_if_not_a_docx_file(self, OpcPackage_mockery):
61-
# mockery ----------------------
62-
docx = Mock(name='docx')
63-
OpcPackage_, pkg, main_document, document_part = OpcPackage_mockery
64-
main_document.return_value.content_type = 'foobar'
65-
# verify -----------------------
66-
with pytest.raises(ValueError):
67-
Document(docx)
59+
OpcPackage_.open.return_value = package_
60+
return OpcPackage_
61+
62+
@pytest.fixture
63+
def open_fixture(
64+
self, request, docx_, OpcPackage_, _Document_, package_,
65+
document_part_):
66+
return docx_, OpcPackage_, _Document_, package_, document_part_
67+
68+
@pytest.fixture
69+
def package_(self, request, document_part_):
70+
package_ = instance_mock(request, OpcPackage)
71+
package_.main_document = document_part_
72+
return package_
6873

6974

7075
class Describe_Document(object):
7176

72-
def it_provides_access_to_the_document_body(self):
73-
document_part = create_autospec(parts._Document)
74-
doc = _Document(None, document_part)
75-
# exercise ---------------------
76-
body = doc.body
77-
# verify -----------------------
78-
assert body is document_part.body
79-
80-
def it_can_save_the_package(self):
81-
pkg, file_ = (Mock(name='pkg'), Mock(name='file_'))
82-
_Document(pkg, None).save(file_)
83-
pkg.save.assert_called_once_with(file_)
77+
def it_provides_access_to_the_document_body(self, document):
78+
body = document.body
79+
assert body is document._document.body
80+
81+
def it_provides_access_to_the_document_inline_shapes(self, document):
82+
body = document.inline_shapes
83+
assert body is document._document.inline_shapes
84+
85+
def it_can_save_the_package(self, save_fixture):
86+
document, package_, file_ = save_fixture
87+
document.save(file_)
88+
package_.save.assert_called_once_with(file_)
89+
90+
# fixtures -------------------------------------------------------
91+
92+
@pytest.fixture
93+
def document(self, request, package_, document_part_):
94+
return _Document(package_, document_part_)
95+
96+
@pytest.fixture
97+
def document_part_(self, request):
98+
return instance_mock(request, parts._Document)
99+
100+
@pytest.fixture
101+
def package_(self, request):
102+
return instance_mock(request, OpcPackage)
103+
104+
@pytest.fixture
105+
def save_fixture(self, request, package_):
106+
file_ = instance_mock(request, str)
107+
document = _Document(package_, None)
108+
return document, package_, file_

0 commit comments

Comments
 (0)