how to measure sleep duration: tests and solution

tests

the code in sleep_duration/tests/test_sleep_duration.py from how to measure sleep duration

 1import datetime
 2import random
 3import src.sleep_duration
 4import unittest
 5
 6def random_number(start, end, digits=2):
 7    return f'{random.randint(start, end):0{digits}}'
 8
 9def get_random_timestamp():
10    return (
11        f'{random_number(0,9999,4)}/'
12        f'{random_number(1,12)}/'
13        f'{random_number(1,31)} '
14        f'{random_number(0,23)}:'
15        f'{random_number(0,59)}'
16    )
17
18
19def random_timestamp():
20    result = get_random_timestamp()
21    try:
22        src.sleep_duration.get_datetime(result)
23    except ValueError:
24        return random_timestamp()
25    else:
26        return result
27
28
29class TestSleepDuration(unittest.TestCase):
30
31    def assertWakeTimeEarlier(
32        self, wake_time=None, sleep_time=None
33    ):
34        with self.assertRaisesRegex(
35            ValueError,
36            f'wake_time: "{wake_time}"'
37            ' is earlier than '
38            f'sleep_time: "{sleep_time}"'
39        ):
40            src.sleep_duration.duration(
41                sleep_time=sleep_time,
42                wake_time=wake_time
43            )
44
45    def test_get_datetime(self):
46        timestamp = random_timestamp()
47        self.assertEqual(
48            src.sleep_duration.get_datetime(
49                timestamp
50            ),
51            datetime.datetime.strptime(
52                timestamp,
53                '%Y/%m/%d %H:%M'
54            )
55        )
56
57    def test_duration(self):
58        sleep_time = random_timestamp()
59        wake_time = random_timestamp()
60
61        while wake_time < sleep_time:
62            self.assertWakeTimeEarlier(
63                wake_time=wake_time,
64                sleep_time=sleep_time
65            )
66            wake_time = random_timestamp()
67        else:
68            self.assertEqual(
69                src.sleep_duration.duration(
70                    sleep_time=sleep_time,
71                    wake_time=wake_time
72                ),
73                str(
74                    src.sleep_duration.get_datetime(
75                        wake_time
76                    )
77                  - src.sleep_duration.get_datetime(
78                        sleep_time
79                    )
80                )
81            )
82
83
84# Exceptions Encountered
85# AssertionError
86# TypeError
87# NameError
88# AttributeError
89# ValueError

solution

the solution in sleep_duration/src/sleep_duration.py from how to measure sleep duration

 1import datetime
 2
 3
 4def get_datetime(timestamp):
 5    return datetime.datetime.strptime(
 6        timestamp, "%Y/%m/%d %H:%M"
 7    )
 8
 9
10def duration(wake_time=None, sleep_time=None):
11    if wake_time < sleep_time:
12        raise ValueError(
13            f'wake_time: "{wake_time}"'
14            " is earlier than "
15            f'sleep_time: "{sleep_time}"'
16        )
17    else:
18        return str(
19            get_datetime(wake_time)
20          - get_datetime(sleep_time)
21        )