import unittest

from inspect import getmembers, isfunction
from functools import partial

import pronotepy
from pronotepy import ent
import logging
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed


class TestENT(unittest.TestCase):
    functions: list

    @classmethod
    def setUpClass(cls) -> None:
        cls.functions = getmembers(
            ent,
            lambda x: isfunction(x) or isinstance(x, partial),
        )

    def test_functions(self) -> None:
        with ThreadPoolExecutor(max_workers=10) as executor:
            futures = {
                executor.submit(func[1], "username", "password"): func[0]
                for func in self.functions
            }
            for func in as_completed(futures):
                with self.subTest(futures[func]):
                    self.assertRaises(
                        (pronotepy.ENTLoginError, requests.exceptions.ConnectionError),
                        func.result,
                    )


if __name__ == "__main__":
    logging.debug("Testing")
    unittest.main()
