# paperdoorknob: Print glowfic
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, version 3.
import unittest
import threading
from http.server import BaseHTTPRequestHandler, HTTPServer
import requests
import requests_cache
import paperdoorknob
TIMEOUT = 8
class FakeGlowficHTTPRequestHandler(BaseHTTPRequestHandler):
def _notify_test(self) -> None:
raise NotImplementedError()
def _response_code(self) -> int:
if self.path == "/not_found":
return 404
if self.path == "/server_error":
return 500
return 200
def do_GET(self) -> None:
body = b'''
We don't want edit boxes
This is glowfic
We don't want edit boxes
You sure?
Pretty sure.
'''
self.send_response(self._response_code())
self.send_header("Content-type", "text/html")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
self._notify_test()
class TestFetch(unittest.TestCase):
def _port(self) -> int:
port = self._web_server.socket.getsockname()[1]
assert isinstance(port, int)
return port
def _count_request(self) -> None:
self._request_counter += 1
def setUp(self) -> None:
self._request_counter = 0
handler = type("Handler", (FakeGlowficHTTPRequestHandler,), {
'_notify_test': lambda _: self._count_request()})
self._web_server = HTTPServer(('', 0), handler)
self._thread = threading.Thread(target=self._web_server.serve_forever)
self._thread.start()
def tearDown(self) -> None:
self._web_server.shutdown()
self._thread.join()
self._web_server.server_close()
def testFetch(self) -> None:
with requests.session() as s:
paperdoorknob.fetch(f"http://localhost:{self._port()}", s, TIMEOUT)
self.assertEqual(self._request_counter, 1)
paperdoorknob.fetch(f"http://localhost:{self._port()}", s, TIMEOUT)
self.assertEqual(self._request_counter, 2)
def testFetchCaching(self) -> None:
with requests_cache.CachedSession() as s:
paperdoorknob.fetch(f"http://localhost:{self._port()}", s, TIMEOUT)
self.assertEqual(self._request_counter, 1)
paperdoorknob.fetch(f"http://localhost:{self._port()}", s, TIMEOUT)
self.assertEqual(self._request_counter, 1)
def testFetchPersistentCaching(self) -> None:
with requests_cache.CachedSession() as s:
paperdoorknob.fetch(f"http://localhost:{self._port()}", s, TIMEOUT)
self.assertEqual(self._request_counter, 1)
with requests_cache.CachedSession() as s:
paperdoorknob.fetch(f"http://localhost:{self._port()}", s, TIMEOUT)
self.assertEqual(self._request_counter, 1)
def testProcess(self) -> None:
with requests.session() as s:
replies = paperdoorknob.process(
f"http://localhost:{self._port()}", s, TIMEOUT)
self.assertEqual([r.text.strip() for r in replies],
["This is glowfic", "You sure?", "Pretty sure."])
def testFetchErrors(self) -> None:
with requests.session() as s:
with self.assertRaises(requests.HTTPError):
paperdoorknob.fetch(
f"http://localhost:{self._port()}/not_found", s, TIMEOUT)
with self.assertRaises(requests.HTTPError):
paperdoorknob.fetch(
f"http://localhost:{self._port()}/server_error", s, TIMEOUT)
if __name__ == '__main__':
unittest.main()