test_build_api.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. """Test the kernels service API."""
  2. from tempfile import TemporaryDirectory
  3. import threading
  4. import pytest
  5. import json
  6. import tornado
  7. import urllib.parse
  8. from tornado.escape import url_escape
  9. from jupyterlab.labapp import LabApp
  10. from jupyterlab_server.tests.utils import expected_http_error
  11. from jupyter_server.utils import url_path_join
  12. class BuildAPITester():
  13. """Wrapper for build REST API requests"""
  14. url = 'lab/api/build'
  15. def __init__(self, labapp, fetch):
  16. self.fetch = fetch
  17. self.labapp = labapp
  18. async def _req(self, verb, path, body=None):
  19. return await self.fetch(self.url + path,
  20. method=verb,
  21. body=body
  22. )
  23. async def getStatus(self):
  24. return await self._req('GET', '')
  25. async def build(self):
  26. return await self._req('POST', '', json.dumps({}))
  27. async def clear(self):
  28. return await self._req('DELETE', '')
  29. @pytest.fixture
  30. def labapp(serverapp, make_lab_extension_app):
  31. app = make_lab_extension_app()
  32. app.initialize(serverapp)
  33. return app
  34. @pytest.fixture
  35. def build_api_tester(serverapp, labapp, fetch_long):
  36. return BuildAPITester(labapp, fetch_long)
  37. @pytest.fixture
  38. def fetch_long(http_server_client, auth_header, base_url):
  39. """fetch fixture that handles auth, base_url, and path"""
  40. def client_fetch(*parts, headers={}, params={}, **kwargs):
  41. # Handle URL strings
  42. path_url = url_escape(url_path_join(base_url, *parts), plus=False)
  43. params_url = urllib.parse.urlencode(params)
  44. url = path_url + "?" + params_url
  45. # Add auth keys to header
  46. headers.update(auth_header)
  47. # Make request.
  48. return http_server_client.fetch(
  49. url, headers=headers, request_timeout=30, **kwargs
  50. )
  51. return client_fetch
  52. @pytest.mark.slow
  53. class TestBuildAPI:
  54. def tempdir(self):
  55. td = TemporaryDirectory()
  56. self.tempdirs.append(td)
  57. return td.name
  58. def setUp(self):
  59. # Any TemporaryDirectory objects appended to this list will be cleaned
  60. # up at the end of the test run.
  61. self.tempdirs = []
  62. # TODO(@echarles) Move the cleanup in the fixture.
  63. @self.addCleanup
  64. def cleanup_tempdirs():
  65. for d in self.tempdirs:
  66. d.cleanup()
  67. # @pytest.mark.timeout(timeout=30)
  68. # @pytest.mark.gen_test(timeout=30)
  69. async def test_get_status(self, build_api_tester):
  70. """Make sure there are no kernels running at the start"""
  71. r = await build_api_tester.getStatus()
  72. res = r.body.decode()
  73. resp = json.loads(res)
  74. assert 'status' in resp
  75. assert 'message' in resp
  76. # @pytest.mark.gen_test(timeout=30)
  77. async def test_build(self, build_api_tester):
  78. r = await build_api_tester.build()
  79. assert r.code == 200
  80. # @pytest.mark.gen_test(timeout=30)
  81. async def test_clear(self, build_api_tester):
  82. with pytest.raises(tornado.httpclient.HTTPClientError) as e:
  83. r = await build_api_tester.clear()
  84. res = r.body.decode()
  85. assert expected_http_error(e, 500)
  86. async def build_thread():
  87. with pytest.raises(tornado.httpclient.HTTPClientError) as e:
  88. r = await build_api_tester.build()
  89. res = r.body.decode()
  90. assert expected_http_error(e, 500)
  91. t1 = threading.Thread(target=build_thread)
  92. t1.start()
  93. """
  94. TODO(@echarles) FIX ME
  95. while 1:
  96. r = await build_api_tester.getStatus()
  97. res = r.body.decode()
  98. resp = json.loads(res)
  99. if resp['status'] == 'building':
  100. break
  101. r = await build_api_tester.clear()
  102. res = r.body.decode()
  103. resp = json.loads(res)
  104. assert resp.code == 204
  105. """