aboutsummaryrefslogtreecommitdiffstats
path: root/test/reader/test_chain.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/reader/test_chain.py')
-rw-r--r--test/reader/test_chain.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/test/reader/test_chain.py b/test/reader/test_chain.py
new file mode 100644
index 0000000..901faa1
--- /dev/null
+++ b/test/reader/test_chain.py
@@ -0,0 +1,85 @@
+"""
+
+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 ##