Since this thing is on the innerwebs I suppose it should have a
[python_utils.git] / tests / logging_utils_test.py
1 #!/usr/bin/env python3
2
3 # © Copyright 2021-2022, Scott Gasch
4
5 """logging_utils unittest."""
6
7 import os
8 import sys
9 import tempfile
10 import unittest
11
12 import logging_utils as lutils
13 import string_utils as sutils
14 import unittest_utils as uu
15
16
17 class TestLoggingUtils(unittest.TestCase):
18     def test_output_context(self):
19         unique_suffix = sutils.generate_uuid(True)
20         filename = f'/tmp/logging_utils_test.{unique_suffix}'
21         secret_message = f'This is a test, {unique_suffix}.'
22
23         with tempfile.SpooledTemporaryFile(mode='r+') as tmpfile1:
24             with uu.RecordStdout() as record:
25                 with lutils.OutputMultiplexerContext(
26                     lutils.OutputMultiplexer.Destination.FILENAMES
27                     | lutils.OutputMultiplexer.Destination.FILEHANDLES
28                     | lutils.OutputMultiplexer.Destination.LOG_INFO,
29                     filenames=[filename, '/dev/null'],
30                     handles=[tmpfile1, sys.stdout],
31                 ) as mplex:
32                     mplex.print(secret_message, end='')
33
34                 # Make sure it was written to the filename.
35                 with open(filename, 'r') as rf:
36                     self.assertEqual(rf.readline(), secret_message)
37                 os.unlink(filename)
38
39             # Make sure it was written to stdout.
40             tmp = record().readline()
41             self.assertEqual(tmp, secret_message)
42
43             # Make sure it was written to the filehandle.
44             tmpfile1.seek(0)
45             tmp = tmpfile1.readline()
46             self.assertEqual(tmp, secret_message)
47
48     def test_record_streams(self):
49         with uu.RecordMultipleStreams(sys.stderr, sys.stdout) as record:
50             print("This is a test!")
51             print("This is one too.", file=sys.stderr)
52         self.assertEqual(record().readlines(), ["This is a test!\n", "This is one too.\n"])
53
54
55 if __name__ == '__main__':
56     unittest.main()