Skip to content

Commit 2320002

Browse files
committed
Improve tests
Add tests for all python files.
1 parent f155abc commit 2320002

5 files changed

Lines changed: 188 additions & 1 deletion

File tree

pydeepskylog/logging_config.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
import logging
33

44
def configure_logging(level: int = logging.INFO) -> None:
5+
if not isinstance(level, int):
6+
raise ValueError("Log level must be an integer from the logging module.")
57
logging.basicConfig(
68
level=level,
79
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
8-
datefmt="%Y-%m-%d %H:%M:%S"
10+
datefmt="%Y-%m-%d %H:%M:%S",
11+
force=True
912
)

pydeepskylog/tests/test_config.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import unittest
2+
from pydeepskylog.config import ContrastReserveConfig
3+
4+
class TestContrastReserveConfig(unittest.TestCase):
5+
def test_angle_type_and_length(self):
6+
self.assertIsInstance(ContrastReserveConfig.ANGLE, list)
7+
self.assertEqual(len(ContrastReserveConfig.ANGLE), ContrastReserveConfig.ANGLE_SIZE)
8+
for val in ContrastReserveConfig.ANGLE:
9+
self.assertIsInstance(val, float)
10+
11+
def test_ltc_type_and_shape(self):
12+
self.assertIsInstance(ContrastReserveConfig.LTC, list)
13+
self.assertEqual(len(ContrastReserveConfig.LTC), ContrastReserveConfig.LTC_SIZE)
14+
for row in ContrastReserveConfig.LTC:
15+
self.assertIsInstance(row, list)
16+
self.assertEqual(len(row), len(ContrastReserveConfig.ANGLE) + 1)
17+
self.assertIsInstance(row[0], int)
18+
for val in row[1:]:
19+
self.assertIsInstance(val, float)
20+
21+
def test_ltc_edge_values(self):
22+
# Check first and last row/column values
23+
self.assertEqual(ContrastReserveConfig.LTC[0][0], 4)
24+
self.assertEqual(ContrastReserveConfig.LTC[-1][0], 27)
25+
self.assertIsInstance(ContrastReserveConfig.LTC[0][-1], float)
26+
self.assertIsInstance(ContrastReserveConfig.LTC[-1][-1], float)
27+
28+
def test_angle_out_of_bounds(self):
29+
with self.assertRaises(IndexError):
30+
_ = ContrastReserveConfig.ANGLE[ContrastReserveConfig.ANGLE_SIZE]
31+
with self.assertRaises(IndexError):
32+
_ = ContrastReserveConfig.LTC[ContrastReserveConfig.LTC_SIZE]
33+
34+
def test_ltc_row_length(self):
35+
for row in ContrastReserveConfig.LTC:
36+
self.assertEqual(len(row), len(ContrastReserveConfig.ANGLE) + 1)
37+
38+
if __name__ == "__main__":
39+
unittest.main()
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import unittest
2+
from pydeepskylog.exceptions import (
3+
PyDeepSkyLogError,
4+
APIConnectionError,
5+
APITimeoutError,
6+
APIAuthenticationError,
7+
APIResponseError,
8+
InvalidParameterError,
9+
)
10+
11+
class TestExceptions(unittest.TestCase):
12+
def test_pydeepskylogerror_inheritance(self):
13+
with self.assertRaises(PyDeepSkyLogError):
14+
raise PyDeepSkyLogError("Base error")
15+
16+
def test_api_connection_error(self):
17+
with self.assertRaises(APIConnectionError):
18+
raise APIConnectionError("Connection failed")
19+
20+
def test_api_timeout_error(self):
21+
with self.assertRaises(APITimeoutError):
22+
raise APITimeoutError("Timeout")
23+
24+
def test_api_authentication_error(self):
25+
with self.assertRaises(APIAuthenticationError):
26+
raise APIAuthenticationError("Auth failed")
27+
28+
def test_api_response_error(self):
29+
with self.assertRaises(APIResponseError):
30+
raise APIResponseError("Bad response")
31+
32+
def test_invalid_parameter_error(self):
33+
with self.assertRaises(InvalidParameterError):
34+
raise InvalidParameterError("Invalid parameter")
35+
36+
def test_inheritance_chain(self):
37+
# All custom exceptions should inherit from PyDeepSkyLogError and Exception
38+
for exc in [
39+
APIConnectionError,
40+
APITimeoutError,
41+
APIAuthenticationError,
42+
APIResponseError,
43+
InvalidParameterError,
44+
]:
45+
self.assertTrue(issubclass(exc, PyDeepSkyLogError))
46+
self.assertTrue(issubclass(exc, Exception))
47+
48+
if __name__ == "__main__":
49+
unittest.main()

pydeepskylog/tests/test_logging.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import unittest
2+
import logging
3+
from pydeepskylog import logging_config
4+
5+
class TestLoggingConfig(unittest.TestCase):
6+
def setUp(self):
7+
# Remove all handlers before each test
8+
for handler in logging.root.handlers[:]:
9+
logging.root.removeHandler(handler)
10+
logging.root.setLevel(logging.NOTSET)
11+
12+
def test_configure_logging_default(self):
13+
# Should not raise
14+
logging_config.configure_logging()
15+
16+
def test_configure_logging_custom_level(self):
17+
# Should not raise for valid custom level
18+
logging_config.configure_logging(logging.DEBUG)
19+
self.assertEqual(logging.getLogger().getEffectiveLevel(), logging.DEBUG)
20+
21+
def test_configure_logging_multiple_calls(self):
22+
# Should not raise if called multiple times
23+
logging_config.configure_logging(logging.WARNING)
24+
logging_config.configure_logging(logging.ERROR)
25+
self.assertEqual(logging.getLogger().getEffectiveLevel(), logging.ERROR)
26+
27+
def test_configure_logging_invalid_level(self):
28+
# Should raise ValueError for invalid log level
29+
with self.assertRaises(ValueError):
30+
logging_config.configure_logging("not_a_level")
31+
32+
if __name__ == "__main__":
33+
unittest.main()
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import unittest
2+
from pydeepskylog.validation import (
3+
validate_number, validate_positive, validate_in_range, validate_sequence
4+
)
5+
from pydeepskylog.exceptions import InvalidParameterError
6+
7+
class TestValidation(unittest.TestCase):
8+
def test_validate_number_valid(self):
9+
validate_number(1, "test")
10+
validate_number(1.5, "test")
11+
validate_number(None, "test", allow_none=True)
12+
13+
def test_validate_number_invalid(self):
14+
with self.assertRaises(InvalidParameterError):
15+
validate_number("a", "test")
16+
with self.assertRaises(InvalidParameterError):
17+
validate_number(None, "test", allow_none=False)
18+
19+
def test_validate_positive_valid(self):
20+
validate_positive(1, "test")
21+
validate_positive(1.5, "test")
22+
validate_positive(0.1, "test")
23+
validate_positive(None, "test", allow_none=True)
24+
25+
def test_validate_positive_invalid(self):
26+
with self.assertRaises(InvalidParameterError):
27+
validate_positive(-1, "test")
28+
with self.assertRaises(InvalidParameterError):
29+
validate_positive(0, "test")
30+
with self.assertRaises(InvalidParameterError):
31+
validate_positive("a", "test")
32+
with self.assertRaises(InvalidParameterError):
33+
validate_positive(None, "test", allow_none=False)
34+
35+
def test_validate_in_range_valid(self):
36+
validate_in_range(5, "test", 0, 10)
37+
validate_in_range(0, "test", 0, 10)
38+
validate_in_range(10, "test", 0, 10)
39+
40+
def test_validate_in_range_invalid(self):
41+
with self.assertRaises(InvalidParameterError):
42+
validate_in_range(-1, "test", 0, 10)
43+
with self.assertRaises(InvalidParameterError):
44+
validate_in_range(11, "test", 0, 10)
45+
with self.assertRaises(InvalidParameterError):
46+
validate_in_range("a", "test", 0, 10)
47+
48+
def test_validate_sequence_valid(self):
49+
validate_sequence([1.0, 2.0, 3.0], "test")
50+
validate_sequence((1.0, 2.0), "test")
51+
validate_sequence([], "test")
52+
validate_sequence([1, 2], "test", item_type=int)
53+
54+
def test_validate_sequence_invalid(self):
55+
with self.assertRaises(InvalidParameterError):
56+
validate_sequence("not a sequence", "test")
57+
with self.assertRaises(InvalidParameterError):
58+
validate_sequence([1, "a"], "test")
59+
with self.assertRaises(InvalidParameterError):
60+
validate_sequence([1.0, 2], "test", item_type=int)
61+
62+
if __name__ == "__main__":
63+
unittest.main()

0 commit comments

Comments
 (0)