From b9f606988bc1a143a0b6bd9d5afa0752e05d6a34 Mon Sep 17 00:00:00 2001 From: "Martin A. Brown" Date: Tue, 1 Mar 2016 19:53:33 -0800 Subject: [PATCH] try to simplify testing logic lots of adjustments to testing to make it more understandable (and self-contained), although not much shorter --- tests/test_driver.py | 187 +++++++++++++++++++--------------------- tests/test_inventory.py | 21 +++-- tests/tldptesttools.py | 65 ++++++++------ 3 files changed, 143 insertions(+), 130 deletions(-) diff --git a/tests/test_driver.py b/tests/test_driver.py index a011dc2..bdbd3a4 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -2,6 +2,7 @@ from __future__ import absolute_import, division, print_function import os +import unittest from cStringIO import StringIO from argparse import Namespace @@ -14,95 +15,46 @@ import example import tldp.config import tldp.driver +opj = os.path.join +opd = os.path.dirname +opa = os.path.abspath +extras = opa(opj(opd(opd(__file__)), 'extras')) + widths = Namespace(status=20, stem=50) class TestDriverDetail(TestInventoryBase): def test_stale_detail_verbosity(self): + c = self.config self.add_stale('Frobnitz-HOWTO', example.ex_docbook4xml) - config = Namespace( - pubdir=self.pubdir, - sourcedir=self.sourcedirs, - verbose=True, - ) - inv = tldp.inventory.Inventory(config.pubdir, config.sourcedir) + c.verbose=True, + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) docs = inv.all.values() stdout = StringIO() - tldp.driver.detail(config, docs, file=stdout) + tldp.driver.detail(c, docs, file=stdout) stdout.seek(0) self.assertTrue('newer file' in stdout.read()) def test_broken_detail_verbosity(self): + c = self.config self.add_broken('Frobnitz-HOWTO', example.ex_docbook4xml) - config = Namespace( - pubdir=self.pubdir, - sourcedir=self.sourcedirs, - verbose=True, - ) - inv = tldp.inventory.Inventory(config.pubdir, config.sourcedir) + c.verbose=True, + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) docs = inv.all.values() stdout = StringIO() - tldp.driver.detail(config, docs, file=stdout) + tldp.driver.detail(c, docs, file=stdout) stdout.seek(0) self.assertTrue('missing file' in stdout.read()) -class TestDriverBuild(TestInventoryBase): - - def test_build_linuxdoc(self): - self.add_new('Frobnitz-Linuxdoc-HOWTO', example.ex_linuxdoc) - config, args = tldp.config.collectconfiguration('ldptool', []) - config.pubdir = self.pubdir - config.sourcedir = self.sourcedirs - config.skip = [] - inv = tldp.inventory.Inventory(config.pubdir, config.sourcedir) - self.assertEquals(1, len(inv.all.keys())) - docs = inv.all.values() - tldp.driver.build(config, docs) - doc = docs.pop(0) - self.assertTrue(doc.output.iscomplete) - - def test_build_docbooksgml(self): - self.add_new('Frobnitz-DocBook-SGML-HOWTO', example.ex_docbooksgml) - config, args = tldp.config.collectconfiguration('ldptool', []) - config.pubdir = self.pubdir - config.sourcedir = self.sourcedirs - config.skip = ['Frobnitz-DocBook-SGML-HOWTO'] - inv = tldp.inventory.Inventory(config.pubdir, config.sourcedir) - self.assertEquals(1, len(inv.all.keys())) - docs = inv.all.values() - tldp.driver.build(config, docs) - doc = docs.pop(0) - self.assertFalse(doc.output.iscomplete) - # -- after figuring out collateindex and friends, this should say - # self.assertTrue(doc.output.iscomplete) - - def test_build_docbook4xml(self): - self.add_new('Frobnitz-DocBook-XML-4-HOWTO', example.ex_docbook4xml) - config, args = tldp.config.collectconfiguration('ldptool', []) - config.pubdir = self.pubdir - config.sourcedir = self.sourcedirs - config.skip = ['Frobnitz-DocBook-XML-4-HOWTO'] - inv = tldp.inventory.Inventory(config.pubdir, config.sourcedir) - self.assertEquals(1, len(inv.all.keys())) - docs = inv.all.values() - tldp.driver.build(config, docs) - doc = docs.pop(0) - self.assertFalse(doc.output.iscomplete) - # -- after figuring out the XSL files at test time, this should say - # self.assertTrue(doc.output.iscomplete) - - class TestDriverSummary(TestInventoryBase): def test_summary(self): + c = self.config self.add_new('Frobnitz-DocBook-XML-4-HOWTO', example.ex_docbook4xml) - config, args = tldp.config.collectconfiguration('ldptool', []) - config.pubdir = self.pubdir - config.sourcedir = self.sourcedirs stdout = StringIO() - tldp.driver.summary(config, None, file=stdout) + tldp.driver.summary(c, None, file=stdout) stdout.seek(0) parts = stdout.read().split() idx = parts.index('new') @@ -112,38 +64,52 @@ class TestDriverSummary(TestInventoryBase): class TestDriverRun(TestInventoryBase): def test_run(self): + c = self.config ex = example.ex_linuxdoc self.add_published('Published-HOWTO', ex) self.add_new('New-HOWTO', ex) self.add_stale('Stale-HOWTO', ex) self.add_orphan('Orphan-HOWTO', ex) self.add_broken('Broken-HOWTO', ex) - argv = ['--pubdir', self.pubdir, '--sourcedir', self.sourcedir] - fullpath = os.path.join(self.tempdir, 'sources', 'Published-HOWTO.sgml') - argv.extend(['stale', 'Orphan-HOWTO', fullpath]) + argv = ['--pubdir', c.pubdir, '--sourcedir', c.sourcedir[0]] + fullpath = os.path.join(self.tempdir, 'sources', 'New-HOWTO.sgml') + argv.extend(['--build', 'stale', 'Orphan-HOWTO', fullpath]) tldp.driver.run(argv) - inv = tldp.inventory.Inventory(self.pubdir, self.sourcedirs) - self.assertEquals(3, len(inv.published.keys())) + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) + self.assertEquals(4, len(inv.published.keys())) + self.assertEquals(1, len(inv.broken.keys())) + + def test_run_extra_args(self): + c = self.config + self.add_new('New-HOWTO', example.ex_linuxdoc) + argv = ['--pubdir', c.pubdir, '--sourcedir', c.sourcedir[0]] + fullpath = os.path.join(self.tempdir, 'sources', 'New-HOWTO.sgml') + argv.extend(['--build', 'stale', 'Orphan-HOWTO', fullpath, 'extra']) + val = tldp.driver.run(argv) + self.assertTrue('Unknown arguments' in val) def test_run_no_action(self): + c = self.config ex = example.ex_linuxdoc self.add_new('New-HOWTO', ex) - argv = ['--pubdir', self.pubdir, '--sourcedir', self.sourcedir] + argv = ['--pubdir', c.pubdir, '--sourcedir', c.sourcedir[0]] tldp.driver.run(argv) - inv = tldp.inventory.Inventory(self.pubdir, self.sourcedirs) + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) self.assertEquals(1, len(inv.published.keys())) def test_run_oops_no_sourcedir(self): + c = self.config ex = example.ex_linuxdoc self.add_new('New-HOWTO', ex) - argv = ['--pubdir', self.pubdir] + argv = ['--pubdir', c.pubdir] exit = tldp.driver.run(argv) self.assertTrue('required for inventory' in exit) def test_run_oops_no_pubdir(self): + c = self.config ex = example.ex_linuxdoc self.add_new('New-HOWTO', ex) - argv = ['--sourcedir', self.sourcedir] + argv = ['--sourcedir', c.sourcedir[0]] exit = tldp.driver.run(argv) self.assertTrue('required for inventory' in exit) @@ -151,57 +117,84 @@ class TestDriverRun(TestInventoryBase): class TestDriverProcessSkips(TestInventoryBase): def test_skipDocuments_status(self): + c = self.config ex = example.ex_linuxdoc - self.add_published('Published-HOWTO', ex) self.add_new('New-HOWTO', ex) self.add_stale('Stale-HOWTO', ex) - self.add_orphan('Orphan-HOWTO', ex) - self.add_broken('Broken-HOWTO', ex) - config, args = tldp.config.collectconfiguration('ldptool', []) - config.pubdir = self.pubdir - config.sourcedir = self.sourcedirs - config.skip = ['stale'] - inv = tldp.inventory.Inventory(self.pubdir, self.sourcedirs) + c.skip = ['stale'] + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) docs = inv.all.values() - inc, exc = tldp.driver.processSkips(config, docs) + inc, exc = tldp.driver.processSkips(c, docs) self.assertTrue(1, len(exc)) excluded = exc.pop() self.assertEquals(excluded.stem, 'Stale-HOWTO') self.assertEquals(len(inc) + 1, len(inv.all.keys())) def test_skipDocuments_stem(self): + c = self.config ex = example.ex_linuxdoc self.add_published('Published-HOWTO', ex) self.add_new('New-HOWTO', ex) - self.add_stale('Stale-HOWTO', ex) - self.add_orphan('Orphan-HOWTO', ex) - self.add_broken('Broken-HOWTO', ex) - config, args = tldp.config.collectconfiguration('ldptool', []) - config.pubdir = self.pubdir - config.sourcedir = self.sourcedirs - config.skip = ['Published-HOWTO'] - inv = tldp.inventory.Inventory(self.pubdir, self.sourcedirs) + c.skip = ['Published-HOWTO'] + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) docs = inv.all.values() - inc, exc = tldp.driver.processSkips(config, docs) + inc, exc = tldp.driver.processSkips(c, docs) self.assertTrue(1, len(exc)) excluded = exc.pop() self.assertEquals(excluded.stem, 'Published-HOWTO') self.assertEquals(len(inc) + 1, len(inv.all.keys())) def test_skipDocuments_doctype(self): + c = self.config self.add_published('Linuxdoc-HOWTO', example.ex_linuxdoc) self.add_new('Docbook4XML-HOWTO', example.ex_docbook4xml) - config, args = tldp.config.collectconfiguration('ldptool', []) - config.pubdir = self.pubdir - config.sourcedir = self.sourcedirs - config.skip = ['Docbook4XML'] - inv = tldp.inventory.Inventory(self.pubdir, self.sourcedirs) + c.skip = ['Docbook4XML'] + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) docs = inv.all.values() - inc, exc = tldp.driver.processSkips(config, docs) + inc, exc = tldp.driver.processSkips(c, docs) self.assertTrue(1, len(exc)) excluded = exc.pop() self.assertEquals(excluded.stem, 'Docbook4XML-HOWTO') self.assertEquals(len(inc) + 1, len(inv.all.keys())) +@unittest.skip("Except when you want to spend time....") +class TestDriverBuild(TestInventoryBase): + + def test_build_linuxdoc(self): + c = self.config + self.add_new('Frobnitz-Linuxdoc-HOWTO', example.ex_linuxdoc) + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) + self.assertEquals(1, len(inv.all.keys())) + docs = inv.all.values() + c.skip = [] + tldp.driver.build(c, docs) + doc = docs.pop(0) + self.assertTrue(doc.output.iscomplete) + + def test_build_docbooksgml(self): + c = self.config + self.add_new('Frobnitz-DocBook-SGML-HOWTO', example.ex_docbooksgml) + c.docbooksgml_collateindex = os.path.join(extras, 'collateindex.pl') + c.docbooksgml_ldpdsl = os.path.join(extras, 'ldp.dsl') + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) + self.assertEquals(1, len(inv.all.keys())) + docs = inv.all.values() + tldp.driver.build(c, docs) + doc = docs.pop(0) + self.assertTrue(doc.output.iscomplete) + + def test_build_docbook4xml(self): + c = self.config + self.add_new('Frobnitz-DocBook-XML-4-HOWTO', example.ex_docbook4xml) + c.docbook4xml_xslsingle = os.path.join(extras, 'ldp-html.xsl') + c.docbook4xml_xslprint = os.path.join(extras, 'ldp-print.xsl') + c.docbook4xml_xslchunk = os.path.join(extras, 'ldp-html-chunk.xsl') + inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir) + self.assertEquals(1, len(inv.all.keys())) + docs = inv.all.values() + tldp.driver.build(c, docs) + doc = docs.pop(0) + self.assertTrue(doc.output.iscomplete) + # # -- end of file diff --git a/tests/test_inventory.py b/tests/test_inventory.py index eb6a868..5268ac3 100644 --- a/tests/test_inventory.py +++ b/tests/test_inventory.py @@ -15,19 +15,21 @@ from tldp.inventory import Inventory class TestInventoryUsage(TestInventoryBase): def test_inventory_repr(self): + c = self.config ex = random.choice(example.sources) self.add_published('Frobnitz-HOWTO', ex) - i = Inventory(self.pubdir, self.sourcedirs) + i = Inventory(c.pubdir, c.sourcedir) self.assertTrue('1 published' in str(i)) def test_status_class_accessors(self): + c = self.config ex = random.choice(example.sources) self.add_published('Published-HOWTO', ex) self.add_new('New-HOWTO', ex) self.add_stale('Stale-HOWTO', ex) self.add_orphan('Orphan-HOWTO', ex) self.add_broken('Broken-HOWTO', ex) - i = Inventory(self.pubdir, self.sourcedirs) + i = Inventory(c.pubdir, c.sourcedir) self.assertTrue('Orphan-HOWTO' in i.orphans.keys()) self.assertTrue('Orphan-HOWTO' in i.orphaned.keys()) self.assertTrue(3, len(i.problems.keys())) @@ -37,9 +39,10 @@ class TestInventoryUsage(TestInventoryBase): self.assertTrue(5, len(i.outputs.keys())) def test_detect_status_published(self): + c = self.config ex = random.choice(example.sources) self.add_published('Frobnitz-HOWTO', ex) - i = Inventory(self.pubdir, self.sourcedirs) + i = Inventory(c.pubdir, c.sourcedir) self.assertEquals(0, len(i.stale)) self.assertEquals(1, len(i.published)) self.assertEquals(0, len(i.new)) @@ -47,9 +50,10 @@ class TestInventoryUsage(TestInventoryBase): self.assertEquals(0, len(i.broken)) def test_detect_status_new(self): + c = self.config ex = random.choice(example.sources) self.add_new('Frobnitz-HOWTO', ex) - i = Inventory(self.pubdir, self.sourcedirs) + i = Inventory(c.pubdir, c.sourcedir) self.assertEquals(0, len(i.stale)) self.assertEquals(0, len(i.published)) self.assertEquals(1, len(i.new)) @@ -57,9 +61,10 @@ class TestInventoryUsage(TestInventoryBase): self.assertEquals(0, len(i.broken)) def test_detect_status_orphan(self): + c = self.config ex = random.choice(example.sources) self.add_orphan('Frobnitz-HOWTO', ex) - i = Inventory(self.pubdir, self.sourcedirs) + i = Inventory(c.pubdir, c.sourcedir) self.assertEquals(0, len(i.stale)) self.assertEquals(0, len(i.published)) self.assertEquals(0, len(i.new)) @@ -67,9 +72,10 @@ class TestInventoryUsage(TestInventoryBase): self.assertEquals(0, len(i.broken)) def test_detect_status_stale(self): + c = self.config ex = random.choice(example.sources) self.add_stale('Frobnitz-HOWTO', ex) - i = Inventory(self.pubdir, self.sourcedirs) + i = Inventory(c.pubdir, c.sourcedir) self.assertEquals(1, len(i.stale)) self.assertEquals(1, len(i.published)) self.assertEquals(0, len(i.new)) @@ -77,9 +83,10 @@ class TestInventoryUsage(TestInventoryBase): self.assertEquals(0, len(i.broken)) def test_detect_status_broken(self): + c = self.config ex = random.choice(example.sources) self.add_broken('Frobnitz-HOWTO', ex) - i = Inventory(self.pubdir, self.sourcedirs) + i = Inventory(c.pubdir, c.sourcedir) self.assertEquals(0, len(i.stale)) self.assertEquals(1, len(i.published)) self.assertEquals(0, len(i.new)) diff --git a/tests/tldptesttools.py b/tests/tldptesttools.py index 535a735..a1ced44 100644 --- a/tests/tldptesttools.py +++ b/tests/tldptesttools.py @@ -9,6 +9,7 @@ import unittest from tempfile import mkdtemp from tempfile import NamedTemporaryFile as ntf +from tldp.config import collectconfiguration from tldp.outputs import OutputNamingConvention @@ -55,15 +56,17 @@ class TestToolsFilesystem(unittest.TestCase): return relpath, absdir def addfile(self, reldir, filename, stem=None, ext=None): + dirname = os.path.join(self.tempdir, reldir) + assert os.path.isdir(dirname) if stem is None: stem, _ = stem_and_ext(filename) if ext is None: _, ext = stem_and_ext(filename) - newname = os.path.join(self.tempdir, reldir, stem + ext) + newname = os.path.join(dirname, stem + ext) if os.path.isfile(filename): shutil.copy(filename, newname) else: - with open(newname): + with open(newname, 'w') as f: pass relname = os.path.relpath(newname, self.tempdir) return relname, newname @@ -106,6 +109,8 @@ class TestOutputDirSkeleton(OutputNamingConvention): class TestSourceDocSkeleton(object): def __init__(self, dirname): + if isinstance(dirname, list): + dirname = dirname[0] if not os.path.abspath(dirname): raise Exception("Please use absolute path in unit tests....") self.dirname = dirname @@ -121,34 +126,42 @@ class TestSourceDocSkeleton(object): f.write(content) -class TestInventoryBase(TestToolsFilesystem): +class TestInventoryBase(unittest.TestCase): - def setupcollections(self): - attrs = ('pubdir', 'sourcedir', 'sourcedirs') - already = all([hasattr(self, x) for x in attrs]) - if already: - return - self.pubdir = os.path.join(self.tempdir, 'outputs') - self.sourcedir = os.path.join(self.tempdir, 'sources') - self.sourcedirs = [self.sourcedir] - for d in (self.sourcedir, self.pubdir): + def setUp(self): + self.makeTempdir() + self.config, _ = collectconfiguration('ldptool', []) + c = self.config + c.pubdir = os.path.join(self.tempdir, 'outputs') + c.sourcedir = os.path.join(self.tempdir, 'sources') + for d in (c.sourcedir, c.pubdir): if not os.path.isdir(d): os.mkdir(d) + c.sourcedir = [c.sourcedir] + + def tearDown(self): + self.removeTempdir() + + def makeTempdir(self): + self.tempdir = mkdtemp(prefix='tldp-test-') + + def removeTempdir(self): + shutil.rmtree(self.tempdir) def add_stale(self, stem, ex): - self.setupcollections() - myoutput = TestOutputDirSkeleton(os.path.join(self.pubdir, stem), stem) + c = self.config + myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem) myoutput.mkdir() myoutput.create_expected_docs() - time.sleep(0.002) - mysource = TestSourceDocSkeleton(self.sourcedir) + time.sleep(0.001) + mysource = TestSourceDocSkeleton(c.sourcedir) mysource.addsourcefile(stem + ex.ext, ex.filename) def add_broken(self, stem, ex): - self.setupcollections() - mysource = TestSourceDocSkeleton(self.sourcedir) + c = self.config + mysource = TestSourceDocSkeleton(c.sourcedir) mysource.addsourcefile(stem + ex.ext, ex.filename) - myoutput = TestOutputDirSkeleton(os.path.join(self.pubdir, stem), stem) + myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem) myoutput.mkdir() myoutput.create_expected_docs() prop = random.choice(myoutput.expected) @@ -157,21 +170,21 @@ class TestInventoryBase(TestToolsFilesystem): os.unlink(fname) def add_new(self, stem, ex): - self.setupcollections() - mysource = TestSourceDocSkeleton(self.sourcedir) + c = self.config + mysource = TestSourceDocSkeleton(c.sourcedir) mysource.addsourcefile(stem + ex.ext, ex.filename) def add_orphan(self, stem, ex): - self.setupcollections() - myoutput = TestOutputDirSkeleton(os.path.join(self.pubdir, stem), stem) + c = self.config + myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem) myoutput.mkdir() myoutput.create_expected_docs() def add_published(self, stem, ex): - self.setupcollections() - mysource = TestSourceDocSkeleton(self.sourcedir) + c = self.config + mysource = TestSourceDocSkeleton(c.sourcedir) mysource.addsourcefile(stem + ex.ext, ex.filename) - myoutput = TestOutputDirSkeleton(os.path.join(self.pubdir, stem), stem) + myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem) myoutput.mkdir() myoutput.create_expected_docs()