diff options
Diffstat (limited to 'tests/docx')
| -rw-r--r-- | tests/docx/__init__.py | 0 | ||||
| -rw-r--r-- | tests/docx/docx_tests.py | 97 | ||||
| -rw-r--r-- | tests/docx/xmlparser_tests.py | 69 |
3 files changed, 166 insertions, 0 deletions
diff --git a/tests/docx/__init__.py b/tests/docx/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/docx/__init__.py diff --git a/tests/docx/docx_tests.py b/tests/docx/docx_tests.py new file mode 100644 index 0000000..9e9efe2 --- /dev/null +++ b/tests/docx/docx_tests.py @@ -0,0 +1,97 @@ +from nose.tools import istest, assert_equal + +from mammoth import docx, documents +from mammoth.docx.xmlparser import element as xml_element, text as xml_text +from ..testing import test_path + +@istest +class ReadTests(object): + @istest + def can_read_document_with_single_paragraph_with_single_run_of_text(self): + with open(test_path("single-paragraph.docx")) as fileobj: + result = docx.read(fileobj=fileobj) + expected_document = documents.Document([ + documents.paragraph([ + documents.Run([ + documents.Text("Walking on imported air") + ]) + ]) + ]) + assert_equal(expected_document, result.value) + + +@istest +class ReadXmlElementTests(object): + @istest + def text_from_text_element_is_read(self): + element = _text_element("Hello!") + assert_equal(documents.Text("Hello!"), docx.read_xml_element(element)) + + @istest + def can_read_text_within_run(self): + element = _run_element_with_text("Hello!") + assert_equal( + documents.Run([documents.Text("Hello!")]), + docx.read_xml_element(element) + ) + + @istest + def can_read_text_within_paragraph(self): + element = _paragraph_element_with_text("Hello!") + assert_equal( + documents.paragraph([documents.Run([documents.Text("Hello!")])]), + docx.read_xml_element(element) + ) + + @istest + def can_read_text_within_document(self): + element = _document_element_with_text("Hello!") + assert_equal( + documents.Document([documents.paragraph([documents.Run([documents.Text("Hello!")])])]), + docx.read_xml_element(element) + ) + + @istest + def paragraph_has_no_style_if_it_has_no_properties(self): + element = xml_element("w:p") + assert_equal(None, docx.read_xml_element(element).style_name) + + @istest + def paragraph_has_style_name_read_from_paragraph_properties_if_present(self): + style_xml = xml_element("w:pStyle", {"w:val": "Heading1"}) + properties_xml = xml_element("w:pPr", {}, [style_xml]) + paragraph_xml = xml_element("w:p", {}, [properties_xml]) + paragraph = docx.read_xml_element(paragraph_xml) + assert_equal("Heading1", paragraph.style_name) + + @istest + def unrecognised_elements_are_ignored(self): + element = xml_element("w:huh", {}, []) + assert_equal(None, docx.read_xml_element(element)) + + @istest + def unrecognised_children_are_ignored(self): + element = xml_element("w:r", {}, [_text_element("Hello!"), xml_element("w:huh", {}, [])]) + assert_equal( + documents.Run([documents.Text("Hello!")]), + docx.read_xml_element(element) + ) + + +def _document_element_with_text(text): + return xml_element("w:document", {}, [ + xml_element("w:body", {}, [_paragraph_element_with_text(text)]) + ]) + + +def _paragraph_element_with_text(text): + return xml_element("w:p", {}, [_run_element_with_text(text)]) + + +def _run_element_with_text(text): + return xml_element("w:r", {}, [_text_element(text)]) + + +def _text_element(value): + return xml_element("w:t", {}, [xml_text(value)]) + diff --git a/tests/docx/xmlparser_tests.py b/tests/docx/xmlparser_tests.py new file mode 100644 index 0000000..5e33778 --- /dev/null +++ b/tests/docx/xmlparser_tests.py @@ -0,0 +1,69 @@ +import io + +from nose.tools import istest, assert_equal + +from mammoth.docx.xmlparser import parse_xml, element as xml_element, text as xml_text + + +@istest +def can_parse_self_closing_element(): + xml = _parse_xml_string(b"<body/>") + assert_equal(xml_element("body", {}, []), xml) + + +@istest +def can_parse_empty_element_with_separate_closing_tag(): + xml = _parse_xml_string(b"<body></body>") + assert_equal(xml_element("body", {}, []), xml) + + +@istest +def can_parse_attributes_of_tag(): + xml = _parse_xml_string(b"<body name='bob'></body>") + assert_equal(xml_element("body", {"name": "bob"}, []), xml) + + +@istest +def can_parse_text_element(): + xml = _parse_xml_string(b"<body>Hello!</body>") + assert_equal(xml_element("body", {}, [xml_text("Hello!")]), xml) + + +@istest +def can_parse_text_element_before_new_tag(): + xml = _parse_xml_string(b"<body>Hello!<br/></body>") + assert_equal(xml_element("body", {}, [xml_text("Hello!"), xml_element("br", {}, [])]), xml) + + +@istest +def can_parse_element_with_children(): + xml = _parse_xml_string(b"<body><a/><b/></body>") + assert_equal([xml_element("a", {}, []), xml_element("b", {}, [])], xml.children) + + +@istest +def unmapped_namespaces_uris_are_included_in_braces_as_prefix(): + xml = _parse_xml_string(b'<w:body xmlns:w="word"/>') + assert_equal("{word}body", xml.name) + + +@istest +def mapped_namespaces_uris_are_translated_using_namespace_map(): + xml = _parse_xml_string(b'<w:body xmlns:w="word"/>', [("x", "word")]) + assert_equal("x:body", xml.name) + + +@istest +def namespace_of_attributes_is_mapped_to_prefix(): + xml = _parse_xml_string(b'<w:body xmlns:w="word" w:val="Hello!"/>', [("x", "word")]) + assert_equal("Hello!", xml.attributes["x:val"]) + + +@istest +def whitespace_between_xml_declaration_and_root_tag_is_ignored(): + xml = _parse_xml_string(b'<?xml version="1.0" ?>\n<body/>') + assert_equal("body", xml.name) + + +def _parse_xml_string(string, namespace_mapping=None): + return parse_xml(io.BytesIO(string), namespace_mapping) |
