"""Test the kernels service API.""" import asyncio import json import os from tempfile import TemporaryDirectory import pytest import tornado from jupyterlab_server.tests.utils import expected_http_error @pytest.fixture def build_api_tester(jp_serverapp, labapp, fetch_long): return BuildAPITester(labapp, fetch_long) class BuildAPITester(): """Wrapper for build REST API requests""" url = 'lab/api/build' def __init__(self, labapp, fetch_long): self.labapp = labapp self.fetch = fetch_long async def _req(self, verb, path, body=None): return await self.fetch(self.url + path, method=verb, body=body ) async def getStatus(self): return await self._req('GET', '') async def build(self): return await self._req('POST', '', json.dumps({})) async def clear(self): return await self._req('DELETE', '') @pytest.mark.slow class TestBuildAPI: def tempdir(self): td = TemporaryDirectory() self.tempdirs.append(td) return td.name def setUp(self): # Any TemporaryDirectory objects appended to this list will be cleaned # up at the end of the test run. self.tempdirs = [] # TODO(@echarles) Move the cleanup in the fixture. @self.addCleanup def cleanup_tempdirs(): for d in self.tempdirs: d.cleanup() # @pytest.mark.timeout(timeout=30) # @pytest.mark.gen_test(timeout=30) async def test_get_status(self, build_api_tester): """Make sure there are no kernels running at the start""" r = await build_api_tester.getStatus() res = r.body.decode() resp = json.loads(res) assert 'status' in resp assert 'message' in resp # @pytest.mark.gen_test(timeout=30) # FIXME @pytest.mark.skipif(os.name == 'nt', reason="Currently failing on windows") async def test_build(self, build_api_tester): r = await build_api_tester.build() assert r.code == 200 # @pytest.mark.gen_test(timeout=30) # FIXME @pytest.mark.skipif(os.name == 'nt', reason="Currently failing on windows") async def test_clear(self, build_api_tester): with pytest.raises(tornado.httpclient.HTTPClientError) as e: r = await build_api_tester.clear() res = r.body.decode() assert expected_http_error(e, 500) loop = asyncio.get_event_loop() asyncio.ensure_future(build_api_tester.build(), loop=loop) while True: r = await build_api_tester.getStatus() res = r.body.decode() print(res) resp = json.loads(res) if resp['status'] == 'building': break r = await build_api_tester.clear() assert r.code == 204