mirror of https://github.com/tLDP/python-tldp
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.
205 lines
6.9 KiB
205 lines
6.9 KiB
# -*- coding: utf8 -*- |
|
# |
|
# Copyright (c) 2016 Linux Documentation Project |
|
|
|
from __future__ import absolute_import, division, print_function |
|
from __future__ import unicode_literals |
|
|
|
import os |
|
import errno |
|
import random |
|
import unittest |
|
from argparse import Namespace |
|
from io import StringIO |
|
|
|
from tldptesttools import TestToolsFilesystem |
|
|
|
# -- Test Data |
|
import example |
|
|
|
# -- SUT |
|
from tldp.sources import SourceCollection, SourceDocument |
|
from tldp.sources import scansourcedirs, sourcedoc_fromdir |
|
from tldp.sources import arg_issourcedoc |
|
|
|
sampledocs = os.path.join(os.path.dirname(__file__), 'sample-documents') |
|
|
|
|
|
class TestFileSourceCollectionMultiDir(TestToolsFilesystem): |
|
|
|
def test_multidir_finding_singlefiles(self): |
|
ex = random.choice(example.sources) |
|
doc0 = Namespace(reldir='LDP/howto', stem="A-Unique-Stem") |
|
doc1 = Namespace(reldir='LDP/guide', stem="A-Different-Stem") |
|
documents = (doc0, doc1) |
|
for d in documents: |
|
d.reldir, d.absdir = self.adddir(d.reldir) |
|
_, _ = self.addfile(d.reldir, ex.filename, stem=d.stem) |
|
s = scansourcedirs([x.absdir for x in documents]) |
|
self.assertEqual(2, len(s)) |
|
expected = set([x.stem for x in documents]) |
|
found = set(s.keys()) |
|
self.assertEqual(expected, found) |
|
|
|
def test_multidir_finding_namecollision(self): |
|
ex = random.choice(example.sources) |
|
doc0 = Namespace(reldir='LDP/howto', stem="A-Non-Unique-Stem") |
|
doc1 = Namespace(reldir='LDP/guide', stem="A-Non-Unique-Stem") |
|
documents = (doc0, doc1) |
|
for d in documents: |
|
d.reldir, d.absdir = self.adddir(d.reldir) |
|
_, _ = self.addfile(d.reldir, ex.filename, stem=d.stem) |
|
s = scansourcedirs([x.absdir for x in documents]) |
|
self.assertEqual(1, len(s)) |
|
expected = set([x.stem for x in documents]) |
|
found = set(s.keys()) |
|
self.assertEqual(expected, found) |
|
|
|
|
|
class TestFileSourceCollectionOneDir(TestToolsFilesystem): |
|
|
|
def test_finding_nonfile(self): |
|
maindir = 'LDP/LDP/howto' |
|
reldir, absdir = self.adddir(maindir) |
|
os.mkfifo(os.path.join(absdir, 'non-dir-non-file.xml')) |
|
s = scansourcedirs([absdir]) |
|
self.assertEqual(0, len(s)) |
|
|
|
def test_finding_singlefile(self): |
|
ex = random.choice(example.sources) |
|
maindir = 'LDP/LDP/howto' |
|
reldir, absdir = self.adddir(maindir) |
|
_, _ = self.addfile(reldir, ex.filename) |
|
s = scansourcedirs([absdir]) |
|
self.assertEqual(1, len(s)) |
|
|
|
def test_skipping_misnamed_singlefile(self): |
|
ex = random.choice(example.sources) |
|
maindir = 'LDP/LDP/howto' |
|
reldir, absdir = self.adddir(maindir) |
|
self.addfile(reldir, ex.filename, ext=".mis") |
|
s = scansourcedirs([absdir]) |
|
self.assertEqual(1, len(s)) |
|
|
|
def test_multiple_stems_of_different_extensions(self): |
|
ex = random.choice(example.sources) |
|
stem = 'A-Non-Unique-Stem' |
|
maindir = os.path.join('LDP/LDP/howto', stem) |
|
reldir, absdir = self.adddir(maindir) |
|
self.addfile(reldir, ex.filename, stem=stem, ext=".xml") |
|
self.addfile(reldir, ex.filename, stem=stem, ext=".md") |
|
s = scansourcedirs([absdir]) |
|
self.assertEqual(1, len(s)) |
|
|
|
|
|
class TestNullSourceCollection(TestToolsFilesystem): |
|
|
|
def test_SourceCollection_no_dirnames(self): |
|
s = SourceCollection() |
|
self.assertIsInstance(s, SourceCollection) |
|
self.assertTrue('docs' in str(s)) |
|
|
|
|
|
class TestInvalidSourceCollection(TestToolsFilesystem): |
|
|
|
def test_validateDirs_onebad(self): |
|
invalid0 = os.path.join(self.tempdir, 'unique', 'rabbit') |
|
with self.assertRaises(IOError) as ecm: |
|
scansourcedirs([invalid0]) |
|
e = ecm.exception |
|
self.assertTrue('unique/rabbit' in e.filename) |
|
|
|
def test_validateDirs_multibad(self): |
|
invalid0 = os.path.join(self.tempdir, 'unique', 'rabbit') |
|
invalid1 = os.path.join(self.tempdir, 'affable', 'elephant') |
|
with self.assertRaises(IOError) as ecm: |
|
scansourcedirs([invalid0, invalid1]) |
|
e = ecm.exception |
|
self.assertTrue('affable/elephant' in e.filename) |
|
|
|
def testEmptyDir(self): |
|
s = scansourcedirs([self.tempdir]) |
|
self.assertEqual(0, len(s)) |
|
|
|
|
|
class Test_sourcedoc_fromdir(unittest.TestCase): |
|
|
|
def test_sourcedoc_fromdir_missingdir(self): |
|
dirname = os.path.dirname('/frobnitz/path/to/extremely/unlikely/file') |
|
self.assertIsNone(sourcedoc_fromdir(dirname)) |
|
|
|
def test_sourcedoc_fromdir_withdots(self): |
|
dirname = os.path.dirname(example.ex_docbook4xml_dir.filename) |
|
doc = sourcedoc_fromdir(dirname) |
|
self.assertIsNotNone(doc) |
|
|
|
|
|
class Test_arg_issourcedoc(unittest.TestCase): |
|
|
|
def test_arg_issourcedoc_fromdir(self): |
|
fname = example.ex_linuxdoc_dir.filename |
|
dirname = os.path.dirname(fname) |
|
self.assertTrue(fname, arg_issourcedoc(dirname)) |
|
|
|
|
|
class TestSourceDocument(TestToolsFilesystem): |
|
|
|
def test_init(self): |
|
for ex in example.sources: |
|
fullpath = ex.filename |
|
fn = os.path.relpath(fullpath, start=example.sampledocs) |
|
doc = SourceDocument(fullpath) |
|
self.assertIsInstance(doc, SourceDocument) |
|
self.assertTrue(fn in str(doc)) |
|
self.assertTrue(fn in doc.md5sums) |
|
|
|
def test_fromfifo_should_fail(self): |
|
fifo = os.path.join(self.tempdir, 'fifofile') |
|
os.mkfifo(fifo) |
|
with self.assertRaises(ValueError) as ecm: |
|
SourceDocument(fifo) |
|
e = ecm.exception |
|
self.assertTrue('not identifiable' in e.args[0]) |
|
|
|
def test_fromdir(self): |
|
dirname = os.path.dirname(example.ex_linuxdoc_dir.filename) |
|
doc = SourceDocument(dirname) |
|
self.assertIsInstance(doc, SourceDocument) |
|
|
|
def test_detail(self): |
|
ex = example.ex_linuxdoc_dir |
|
s = SourceDocument(ex.filename) |
|
fout = StringIO() |
|
widths = Namespace(status=20, doctype=20, stem=50) |
|
s.detail(widths, False, file=fout) |
|
fout.seek(0) |
|
result = fout.read() |
|
fout.close() |
|
self.assertTrue(ex.stem in result) |
|
self.assertTrue('source' in result) |
|
|
|
def test_bad_dir_multiple_doctypes(self): |
|
fullpath = os.path.join(sampledocs, 'Bad-Dir-Multiple-Doctypes') |
|
with self.assertRaises(Exception) as ecm: |
|
SourceDocument(fullpath) |
|
e = ecm.exception |
|
self.assertTrue('multiple document choices' in e.args[0]) |
|
|
|
|
|
class TestMissingSourceDocuments(TestToolsFilesystem): |
|
|
|
def test_init_missing(self): |
|
missing = os.path.join(self.tempdir, 'vanishing') |
|
with self.assertRaises(IOError) as ecm: |
|
SourceDocument(missing) |
|
e = ecm.exception |
|
self.assertEqual(errno.ENOENT, e.errno) |
|
|
|
def test_init_wrongtype(self): |
|
with self.assertRaises(ValueError) as ecm: |
|
SourceDocument(self.tempdir) |
|
e = ecm.exception |
|
self.assertTrue('not identifiable' in e.args[0]) |
|
|
|
# |
|
# -- end of file
|
|
|