how to measure sleep duration: tests and solution

tests

Here is the code in tests/test_sleep_duration.py

import datetime
import random
import sleep_duration
import unittest

def random_number(start, end, digits=2):
    return f'{random.randint(start, end):0{digits}}'

def get_random_timestamp():
    return (
        f'{random_number(0,9999,4)}/'
        f'{random_number(1,12)}/'
        f'{random_number(1,31)} '
        f'{random_number(0,23)}:'
        f'{random_number(0,59)}'
    )


def random_timestamp():
    result = get_random_timestamp()
    try:
        sleep_duration.get_datetime(result)
    except ValueError:
        return random_timestamp()
    else:
        return result


class TestSleepDuration(unittest.TestCase):

    def assertWakeTimeEarlier(
        self, wake_time=None, sleep_time=None
    ):
        with self.assertRaisesRegex(
            ValueError,
            f'wake_time: "{wake_time}"'
            ' is earlier than '
            f'sleep_time: "{sleep_time}"'
        ):
            sleep_duration.duration(
                sleep_time=sleep_time,
                wake_time=wake_time
            )

    def test_get_datetime(self):
        timestamp = random_timestamp()
        self.assertEqual(
            sleep_duration.get_datetime(
                timestamp
            ),
            datetime.datetime.strptime(
                timestamp,
                '%Y/%m/%d %H:%M'
            )
        )

    def test_duration(self):
        sleep_time = random_timestamp()
        wake_time = random_timestamp()

        while wake_time < sleep_time:
            self.assertWakeTimeEarlier(
                wake_time=wake_time,
                sleep_time=sleep_time
            )
            wake_time = random_timestamp()
        else:
            self.assertEqual(
                sleep_duration.duration(
                    sleep_time=sleep_time,
                    wake_time=wake_time
                ),
                str(
                    sleep_duration.get_datetime(
                        wake_time
                    )
                  - sleep_duration.get_datetime(
                        sleep_time
                    )
                )
            )


# Exceptions Encountered
# AssertionError
# TypeError
# NameError
# AttributeError
# ValueError

solution

Here is the solution in sleep_duration.py

import datetime


def get_datetime(timestamp):
    return datetime.datetime.strptime(
        timestamp, "%Y/%m/%d %H:%M"
    )


def duration(wake_time=None, sleep_time=None):
    if wake_time < sleep_time:
        raise ValueError(
            f'wake_time: "{wake_time}"'
            " is earlier than "
            f'sleep_time: "{sleep_time}"'
        )
    else:
        return str(
            get_datetime(wake_time)
          - get_datetime(sleep_time)
        )