You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
7.0 KiB
201 lines
7.0 KiB
#!/usr/bin/env python |
|
|
|
# $Id: test_odt.py 8069 2017-05-16 21:07:07Z dkuhlman $ |
|
# Author: Dave Kuhlman <dkuhlman@rexx.com> |
|
# Copyright: This module has been placed in the public domain. |
|
|
|
""" |
|
Tests for docutils odtwriter. |
|
|
|
Instructions for adding a new test: |
|
|
|
1. Add a new method to class DocutilsOdtTestCase (below) named |
|
test_odt_xxxx, where xxxx describes your new feature. See |
|
test_odt_basic for an example. |
|
|
|
2. Add a new input reST (.txt) file in test/functional/input. This |
|
file should contain the smallest amount of reST that tests your |
|
new feature. Name this file odt_xxxx.txt. |
|
|
|
3. Convert your input reST (.txt) file to an ODF (.odt) file using |
|
rst2odt.py. Place this ODF (.odt) file in |
|
test/functional/expected. Name this file odt_xxxx.odt. |
|
You can also pass parameter save_output_name='filename' to method |
|
process_test() in order to produce expected output. |
|
See and modify variable TEMP_FILE_PATH for destination. |
|
|
|
4. Run your test. Your new test should pass. |
|
|
|
5. If any other tests fail, that's a possible regression. |
|
|
|
""" |
|
|
|
import sys |
|
import os |
|
import StringIO |
|
import zipfile |
|
from xml.dom import minidom |
|
import tempfile |
|
|
|
from __init__ import DocutilsTestSupport |
|
|
|
import docutils |
|
import docutils.core |
|
from docutils._compat import BytesIO |
|
|
|
# |
|
# Globals |
|
TEMP_FILE_PATH = 'functional/output/' |
|
INPUT_PATH = 'functional/input/' |
|
EXPECTED_PATH = 'functional/expected/' |
|
|
|
class DocutilsOdtTestCase(DocutilsTestSupport.StandardTestCase): |
|
# |
|
# Check to see if we can import the needed XML library. |
|
# Report failure if we cannot. |
|
def check_import(self): |
|
WhichElementTree = '' |
|
try: |
|
# 1. Try to use lxml. |
|
#from lxml import etree |
|
#WhichElementTree = 'lxml' |
|
raise ImportError('Ignoring lxml') |
|
except ImportError, e: |
|
try: |
|
# 2. Try to use ElementTree from the Python standard library. |
|
from xml.etree import ElementTree as etree |
|
WhichElementTree = 'elementtree' |
|
except ImportError, e: |
|
try: |
|
# 3. Try to use a version of ElementTree installed as a separate |
|
# product. |
|
from elementtree import ElementTree as etree |
|
WhichElementTree = 'elementtree' |
|
except ImportError, e: |
|
s1 = '\nSkipped test of odf_odt writer. ' \ |
|
'In order to test odf_odt writer ' \ |
|
'must install either a version of Python containing ' \ |
|
'ElementTree (Python version >=2.5) or ' \ |
|
'install ElementTree.\n\n' |
|
#self.fail(s1) |
|
sys.stderr.write(s1) |
|
return WhichElementTree |
|
|
|
def process_test(self, input_filename, expected_filename, |
|
save_output_name=None, settings_overrides=None): |
|
if not self.check_import(): |
|
return |
|
# Test that xmlcharrefreplace is the default output encoding |
|
# error handler. |
|
input_file = open(INPUT_PATH + input_filename, 'rb') |
|
expected_file = open(EXPECTED_PATH + expected_filename, 'rb') |
|
input = input_file.read() |
|
expected = expected_file.read() |
|
input_file.close() |
|
expected_file.close() |
|
if settings_overrides is None: |
|
settings_overrides={} |
|
settings_overrides['_disable_config'] = True |
|
settings_overrides['language_code'] = 'en-US' |
|
|
|
result = docutils.core.publish_string( |
|
source=input, |
|
reader_name='standalone', |
|
writer_name='odf_odt', |
|
settings_overrides=settings_overrides) |
|
## msg = 'file length not equal: expected length: %d actual length: %d' % ( |
|
## len(expected), len(result), ) |
|
## self.assertEqual(str(len(result)), str(len(expected))) |
|
if save_output_name: |
|
filename = '%s%s%s' % (TEMP_FILE_PATH, os.sep, save_output_name,) |
|
outfile = open(filename, 'wb') |
|
outfile.write(result) |
|
outfile.close() |
|
content1 = self.extract_file(result, 'content.xml') |
|
content2 = self.extract_file(expected, 'content.xml') |
|
msg = 'content.xml not equal: expected len: %d actual len: %d' % ( |
|
len(content2), len(content1), ) |
|
self.assertEqual(content1, content2, msg) |
|
|
|
def extract_file(self, payload, filename): |
|
payloadfile = BytesIO() |
|
payloadfile.write(payload) |
|
payloadfile.seek(0) |
|
zfile = zipfile.ZipFile(payloadfile, 'r') |
|
content1 = zfile.read(filename) |
|
doc = minidom.parseString(content1) |
|
#content2 = doc.toprettyxml(indent=' ') |
|
content2 = doc.toxml() |
|
return content2 |
|
|
|
def assertEqual(self, first, second, msg=None): |
|
if msg is None: |
|
msg2 = msg |
|
else: |
|
sep = '+' * 60 |
|
msg1 = '\n%s\nresult:\n%s\n%s\nexpected:\n%s\n%s' % ( |
|
sep, first, sep, second, sep, ) |
|
#msg2 = '%s\n%s' % (msg1, msg, ) |
|
msg2 = '%s' % (msg, ) |
|
DocutilsTestSupport.StandardTestCase.assertEqual(self, |
|
first, second, msg2) |
|
|
|
# |
|
# Unit test methods |
|
# |
|
# All test methods should be named "test_odt_xxxx", where |
|
# xxxx is replaced with a name for the new test. |
|
# See instructions above in module doc-string. |
|
# |
|
|
|
def test_odt_basic(self): |
|
self.process_test('odt_basic.txt', 'odt_basic.odt', |
|
save_output_name='odt_basic.odt' |
|
) |
|
|
|
def test_odt_nested_class(self): |
|
self.process_test('odt_nested_class.txt', |
|
'odt_nested_class.odt', |
|
save_output_name='odt_nested_class.odt' |
|
) |
|
self.process_test('odt_unnested_class.txt', |
|
'odt_unnested_class.odt', |
|
save_output_name='odt_unnested_class.odt' |
|
) |
|
self.process_test('odt_no_class.txt', |
|
'odt_no_class.odt', |
|
save_output_name='odt_no_class.odt' |
|
) |
|
|
|
def test_odt_tables1(self): |
|
self.process_test('odt_tables1.txt', 'odt_tables1.odt', |
|
save_output_name='odt_tables1.odt' |
|
) |
|
|
|
def test_odt_custom_headfoot(self): |
|
settings_overrides = { |
|
'custom_header': 'Page %p% of %P%', |
|
'custom_footer': 'Title: %t% Date: %d3% Time: %t4%', |
|
'language_code': 'en-US', |
|
} |
|
self.process_test('odt_custom_headfoot.txt', 'odt_custom_headfoot.odt', |
|
settings_overrides=settings_overrides, |
|
save_output_name='odt_custom_headfoot.odt' |
|
) |
|
|
|
# |
|
# Template for new tests. |
|
# Also add functional/input/odt_xxxx.txt and |
|
# functional/expected/odt_xxxx.odt |
|
# Replace all xxxx with name of your test. |
|
# |
|
## def test_odt_xxxx(self): |
|
## self.process_test('odt_xxxx.txt', 'odt_xxxx.odt') |
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
if __name__ == '__main__': |
|
import unittest |
|
unittest.main()
|
|
|