|
6 | 6 |
|
7 | 7 | import pytest |
8 | 8 |
|
9 | | -from mock import create_autospec, Mock, PropertyMock |
10 | | - |
11 | 9 | from docx import parts |
12 | 10 | from docx.api import Document, _Document |
13 | 11 | from docx.opc.constants import CONTENT_TYPE as CT |
| 12 | +from docx.opc.package import OpcPackage |
14 | 13 |
|
15 | | -from .unitutil import class_mock, var_mock |
| 14 | +from .unitutil import class_mock, instance_mock, var_mock |
16 | 15 |
|
17 | 16 |
|
18 | 17 | class DescribeDocument(object): |
19 | 18 |
|
| 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 | + |
20 | 38 | @pytest.fixture |
21 | 39 | def _Document_(self, request): |
22 | 40 | return class_mock(request, 'docx.api._Document') |
23 | 41 |
|
24 | 42 | @pytest.fixture |
25 | | - def default_docx(self, request): |
| 43 | + def default_docx_(self, request): |
26 | 44 | return var_mock(request, 'docx.api._default_docx_path') |
27 | 45 |
|
28 | 46 | @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 | + ) |
31 | 51 |
|
32 | 52 | @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_): |
34 | 58 | 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_ |
68 | 73 |
|
69 | 74 |
|
70 | 75 | class Describe_Document(object): |
71 | 76 |
|
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