class TimezoneTest(unittest.TestCase): def setUp(self): self.port = 8000 self.url = 'localhost' self.server = WSGIServer((self.url, self.port), WSGIRequestHandler) self.server.set_app(timezones_app) self.t = threading.Thread(target=self.server.serve_forever) self.t.start() def test_api(self): tz_list = ('GMT', 'Europe/Moscow', 'EST') for tz in tz_list: response = requests.get(f'http://localhost:{self.port}/{tz}') dt = datetime.now(timezone(tz)) self.assertEqual(response.status_code, 200) self.assertEqual(response.content.decode('utf-8'), dt.strftime('%m.%d.%Y %H:%M:%S')) payload = { "first_date": "12.20.2021 22:21:05", "first_tz": "GMT", "second_date": "12.20.2021 22:21:05", "second_tz": "Europe/Moscow" } response = requests.post( f'http://localhost:{self.port}/api/v1/datediff', json=payload) self.assertEqual(response.status_code, 200) self.assertEqual(response.content.decode('utf-8'), '9000.0') payload = { "date": "12.20.2021 22:21:05", "tz": "Europe/Moscow", "target_tz": "Asia/Tomsk" } response = requests.post( f'http://localhost:{self.port}/api/v1/convert', json=payload) input_dt = datetime.strptime(payload['date'], '%m.%d.%Y %H:%M:%S') input_dt_tz = input_dt.replace(tzinfo=timezone(payload['tz'])) output_dt = input_dt_tz.astimezone(timezone(payload['target_tz'])) self.assertEqual(response.status_code, 200) self.assertEqual(response.content.decode('utf-8'), output_dt.strftime('%m.%d.%Y %H:%M:%S')) def tearDown(self): self.server.shutdown() self.t.join()
class GaeTestServer(object): def __init__(self): self.sdk_path = resolve_sdk_path() print 'python sdk found', self.sdk_path sys.path.insert(0, self.sdk_path) import dev_appserver dev_appserver.fix_sys_path() sys.path.insert(0, 'src') self.testbed = None self.httpd = None def boot_gae(self): from google.appengine.api import memcache from google.appengine.ext import ndb from google.appengine.ext import testbed from google.appengine.datastore import datastore_stub_util self.testbed = testbed.Testbed() self.testbed.activate() self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=0) self.testbed.init_datastore_v3_stub(consistency_policy=self.policy) self.testbed.init_memcache_stub() def boot_web(self, port, app): self.port = port self.httpd = WSGIServer(('localhost', port), WSGIRequestHandler) self.httpd.set_app(app) def server_forever_background(self): self.thread = threading.Thread(target=self.httpd.serve_forever) self.thread.start() def server_forever(self): self.httpd.serve_forever() def shutdown(self): if self.testbed: self.testbed.deactivate() if self.httpd: self.httpd.shutdown() self.httpd = None
class _HTTPServer(bottle.ServerAdapter): """ Reimplement bottle's WSGIRefServer. Override the request handler class and add a stop() method for cleanly shutting down the server. """ srv = None app = None def run(self, handler): # Handle the TIME_WAIT state for quick server restarts WSGIServer.allow_reuse_address = 1 # Create the server and start it self.srv = WSGIServer((self.host, self.port), _HTTPRequestHandler) self.srv.set_app(self.app) try: self.srv.serve_forever() finally: self.srv.server_close() def stop(self): if self.srv: self.srv.shutdown()
def shutdown(self): self.application.shutdown() WSGIServer.shutdown(self)