From f8d72dbba832db282a3ec04a5108fbd090f49a4f Mon Sep 17 00:00:00 2001
From: Michael Williamson
Date: Sun, 1 Dec 2013 11:47:48 +0000
Subject: Move docx reading into separate package
---
tests/docx/__init__.py | 0
tests/docx/docx_tests.py | 97 +++++++++++++++++++++++++++++++++++++++++++
tests/docx/xmlparser_tests.py | 69 ++++++++++++++++++++++++++++++
3 files changed, 166 insertions(+)
create mode 100644 tests/docx/__init__.py
create mode 100644 tests/docx/docx_tests.py
create mode 100644 tests/docx/xmlparser_tests.py
(limited to 'tests/docx')
diff --git a/tests/docx/__init__.py b/tests/docx/__init__.py
new file mode 100644
index 0000000..e69de29
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"")
+ assert_equal(xml_element("body", {}, []), xml)
+
+
+@istest
+def can_parse_empty_element_with_separate_closing_tag():
+ xml = _parse_xml_string(b"
")
+ assert_equal(xml_element("body", {}, []), xml)
+
+
+@istest
+def can_parse_attributes_of_tag():
+ xml = _parse_xml_string(b"")
+ assert_equal(xml_element("body", {"name": "bob"}, []), xml)
+
+
+@istest
+def can_parse_text_element():
+ xml = _parse_xml_string(b"Hello!")
+ assert_equal(xml_element("body", {}, [xml_text("Hello!")]), xml)
+
+
+@istest
+def can_parse_text_element_before_new_tag():
+ xml = _parse_xml_string(b"Hello!
")
+ assert_equal(xml_element("body", {}, [xml_text("Hello!"), xml_element("br", {}, [])]), xml)
+
+
+@istest
+def can_parse_element_with_children():
+ xml = _parse_xml_string(b"")
+ 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'')
+ assert_equal("{word}body", xml.name)
+
+
+@istest
+def mapped_namespaces_uris_are_translated_using_namespace_map():
+ xml = _parse_xml_string(b'', [("x", "word")])
+ assert_equal("x:body", xml.name)
+
+
+@istest
+def namespace_of_attributes_is_mapped_to_prefix():
+ xml = _parse_xml_string(b'', [("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'\n