Coverage for tests/test_translate_header.py: 15%
82 statements
« prev ^ index » next coverage.py v6.5.0, created at 2023-03-29 02:15 -0700
« prev ^ index » next coverage.py v6.5.0, created at 2023-03-29 02:15 -0700
1# This file is part of astro_metadata_translator.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (http://www.lsst.org).
6# See the LICENSE file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# Use of this source code is governed by a 3-clause BSD-style
10# license that can be found in the LICENSE file.
12import io
13import os.path
14import unittest
16from astro_metadata_translator.bin.translateheader import process_files
18TESTDIR = os.path.abspath(os.path.dirname(__file__))
19TESTDATA = os.path.join(TESTDIR, "data")
22class TestTranslateHeader(unittest.TestCase):
23 """Test that the translate_header CLI logic works."""
25 def _readlines(self, stream):
26 """Return the lines written to the stream.
28 Parameters
29 ----------
30 stream : `io.StringIO`
31 The stream to read.
33 Returns
34 -------
35 lines : `list` of `str`
36 The lines contained in the stream.
37 """
38 stream.seek(0)
39 return [ll.rstrip() for ll in stream.readlines()]
41 def test_translate_header(self):
42 """Translate some header files."""
43 with io.StringIO() as out:
44 with io.StringIO() as err:
45 okay, failed = process_files(
46 [TESTDATA],
47 r"^fitsheader.*yaml$",
48 0,
49 False,
50 outstream=out,
51 errstream=err,
52 output_mode="none",
53 )
54 self.assertEqual(self._readlines(out), [])
55 lines = self._readlines(err)
56 self.assertEqual(len(lines), 10)
57 self.assertTrue(lines[0].startswith("Analyzing"), f"Line: '{lines[0]}'")
59 self.assertEqual(len(okay), 10)
60 self.assertEqual(len(failed), 0)
62 def test_translate_header_table(self):
63 """Translate some header files with table output."""
64 with io.StringIO() as out:
65 with io.StringIO() as err:
66 okay, failed = process_files(
67 [TESTDATA], r"^fitsheader.*yaml$", 0, False, outstream=out, errstream=err
68 )
69 output = self._readlines(out)
70 self.assertTrue(output[0].startswith("ObsId"))
71 self.assertTrue(output[1].startswith("-------"))
72 self.assertEqual(len(output), 12)
73 errlines = self._readlines(err)
74 self.assertEqual(len(errlines), 0)
76 self.assertEqual(len(okay), 10)
77 self.assertEqual(len(failed), 0)
79 def test_translate_header_fails(self):
80 """Translate some header files that fail."""
81 with io.StringIO() as out:
82 with io.StringIO() as err:
83 okay, failed = process_files(
84 [TESTDATA], r"^.*yaml$", 0, False, outstream=out, errstream=err, output_mode="none"
85 )
87 lines = self._readlines(out)
88 self.assertEqual(len(lines), len(failed))
89 self.assertTrue(lines[0].startswith("Failure processing"), f"Line: '{lines[0]}'")
90 self.assertIn("not a mapping", lines[0], f"Line: '{lines[0]}'")
92 lines = self._readlines(err)
93 self.assertEqual(len(lines), 13)
94 self.assertTrue(lines[0].startswith("Analyzing"), f"Line: '{lines[0]}'")
96 self.assertEqual(len(okay), 10)
97 self.assertEqual(len(failed), 3)
99 def test_translate_header_traceback(self):
100 """Translate some header files that fail and trigger traceback"""
101 with io.StringIO() as out:
102 with io.StringIO() as err:
103 okay, failed = process_files(
104 [TESTDATA], r"^.*yaml$", 0, True, outstream=out, errstream=err, output_mode="none"
105 )
107 lines = self._readlines(out)
108 self.assertGreaterEqual(len(lines), 22, "\n".join(lines))
109 self.assertTrue(lines[0].startswith("Traceback"), f"Line '{lines[0]}'")
111 lines = self._readlines(err)
112 self.assertGreaterEqual(len(lines), 13, "\n".join(lines))
113 self.assertTrue(lines[0].startswith("Analyzing"), f"Line: '{lines[0]}'")
115 self.assertEqual(len(okay), 10)
116 self.assertEqual(len(failed), 3)
118 def test_translate_header_dump(self):
119 """Check that a header is dumped"""
120 with io.StringIO() as out:
121 with io.StringIO() as err:
122 okay, failed = process_files(
123 [os.path.join(TESTDATA, "fitsheader-decam.yaml")],
124 r"^fitsheader.*yaml$",
125 0,
126 False,
127 outstream=out,
128 errstream=err,
129 output_mode="yaml",
130 )
132 lines = self._readlines(out)
133 # Look for a DECam header in the output
134 header = "\n".join(lines)
135 self.assertIn("DTINSTRU", header)
137 lines = self._readlines(err)
138 self.assertEqual(len(lines), 1)
139 self.assertTrue(lines[0], "Analyzing tests/data/fitsheader-decam.yaml...")
141 self.assertEqual(len(okay), 1)
142 self.assertEqual(len(failed), 0)
144 def test_translate_header_loud(self):
145 """Check that ObservationInfo content is displayed"""
146 with io.StringIO() as out:
147 with io.StringIO() as err:
148 okay, failed = process_files(
149 [os.path.join(TESTDATA, "fitsheader-decam.yaml")],
150 r"^fitsheader.*yaml$",
151 0,
152 False,
153 outstream=out,
154 errstream=err,
155 output_mode="verbose",
156 )
158 lines = self._readlines(out)
159 # Look for the translated DECam header in the output
160 self.assertEqual(lines[2], "datetime_begin: 2013-09-01T06:02:55.754")
162 lines = self._readlines(err)
163 self.assertEqual(len(lines), 1)
164 self.assertTrue(lines[0], "Analyzing tests/data/fitsheader-decam.yaml...")
166 self.assertEqual(len(okay), 1)
167 self.assertEqual(len(failed), 0)
170if __name__ == "__main__": 170 ↛ 171line 170 didn't jump to line 171, because the condition on line 170 was never true
171 unittest.main()