""" Part of the bsie test suite. A copy of the license is provided with the project. Author: Matthias Baumgartner, 2022 """ # standard imports import logging import os import unittest # bsie imports from bsie.utils import errors import bsie.reader.path import bsie.reader.stat # objects to test from bsie.reader.chain import ReaderChain ## code ## class TestReaderChain(unittest.TestCase): def test_construct(self): # subreaders are built chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {}) self.assertIsInstance(chain, ReaderChain) self.assertEqual(chain._children, (bsie.reader.stat.Stat(), bsie.reader.path.Path())) # subreaders that failed to build are omitted with self.assertLogs(logging.getLogger('bsie.reader.chain'), logging.WARNING): chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.invalid.Invalid'], {}) self.assertEqual(chain._children, (bsie.reader.stat.Stat(), )) with self.assertLogs(logging.getLogger('bsie.reader.chain'), logging.WARNING): chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Invalid'], {}) self.assertEqual(chain._children, (bsie.reader.stat.Stat(), )) # warning is issued if there are no subreaders with self.assertLogs(logging.getLogger('bsie.reader.chain'), logging.WARNING): chain = ReaderChain([], {}) self.assertEqual(chain._children, tuple()) def test_essentials(self): chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {}) # identity self.assertEqual(chain, chain) self.assertEqual(hash(chain), hash(chain)) # comparison works across instances self.assertEqual(chain, ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {})) self.assertEqual(hash(chain), hash(ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {}))) # comparison respects subreaders self.assertNotEqual(hash(chain), hash(ReaderChain(['bsie.reader.path.Path'], {}))) self.assertNotEqual(hash(chain), hash(ReaderChain(['bsie.reader.path.Path'], {}))) # comparison respects subreader order self.assertNotEqual(chain, ReaderChain(['bsie.reader.path.Path', 'bsie.reader.stat.Stat'], {})) self.assertNotEqual(hash(chain), hash(ReaderChain(['bsie.reader.path.Path', 'bsie.reader.stat.Stat'], {}))) # string representation self.assertEqual(str(chain), 'ReaderChain(Stat, Path)') self.assertEqual(repr(chain), 'ReaderChain((Stat(), Path()))') def test_call(self): chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {}) # chain first probes first child self.assertEqual(chain(__file__), os.stat(__file__)) # chain probes second child if first one failes self.assertEqual(chain(''), '') self.assertEqual(chain('missing-file'), 'missing-file') # chain raises a ReaderError if childs were exhausted chain = ReaderChain(['bsie.reader.stat.Stat'], {}) # chain probes second child if first one failes self.assertRaises(errors.ReaderError, chain, '') ## main ## if __name__ == '__main__': unittest.main() ## EOF ##