##// END OF EJS Templates
Refactor tests for kernels REST API
Thomas Kluyver -
Show More
@@ -8,93 +8,106 b' import json'
8 8 import requests
9 9
10 10 from IPython.html.utils import url_path_join
11 from IPython.html.tests.launchnotebook import NotebookTestBase
11 from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
12 12
13 class KernelAPI(object):
14 """Wrapper for kernel REST API requests"""
15 def __init__(self, base_url):
16 self.base_url = base_url
17
18 def _req(self, verb, path, body=None):
19 response = requests.request(verb,
20 url_path_join(self.base_url, 'api/kernels', path), data=body)
21
22 if 400 <= response.status_code < 600:
23 try:
24 response.reason = response.json()['message']
25 except:
26 pass
27 response.raise_for_status()
28
29 return response
30
31 def list(self):
32 return self._req('GET', '')
33
34 def get(self, id):
35 return self._req('GET', id)
36
37 def start(self):
38 return self._req('POST', '')
39
40 def shutdown(self, id):
41 return self._req('DELETE', id)
42
43 def interrupt(self, id):
44 return self._req('POST', url_path_join(id, 'interrupt'))
45
46 def restart(self, id):
47 return self._req('POST', url_path_join(id, 'restart'))
13 48
14 49 class KernelAPITest(NotebookTestBase):
15 50 """Test the kernels web service API"""
51 def setUp(self):
52 self.kern_api = KernelAPI(self.base_url())
16 53
17 def base_url(self):
18 return url_path_join(super(KernelAPITest,self).base_url(), 'api/kernels')
19
20 def mkkernel(self):
21 r = requests.post(self.base_url())
22 return r.json()
54 def tearDown(self):
55 for k in self.kern_api.list().json():
56 self.kern_api.shutdown(k['id'])
23 57
24 58 def test__no_kernels(self):
25 59 """Make sure there are no kernels running at the start"""
26 url = self.base_url()
27 r = requests.get(url)
28 self.assertEqual(r.json(), [])
60 kernels = self.kern_api.list().json()
61 self.assertEqual(kernels, [])
29 62
30 63 def test_main_kernel_handler(self):
31 64 # POST request
32 r = requests.post(self.base_url())
33 data = r.json()
34 status = r.status_code
35 header = r.headers
36 self.assertIn('location', header)
37 self.assertEquals(header['location'], '/api/kernels/' + data['id'])
38 self.assertEquals(status, 201)
39 assert isinstance(data, dict)
65 r = self.kern_api.start()
66 kern1 = r.json()
67 self.assertEquals(r.headers['location'], '/api/kernels/' + kern1['id'])
68 self.assertEquals(r.status_code, 201)
69 self.assertIsInstance(kern1, dict)
40 70
41 71 # GET request
42 r = requests.get(self.base_url())
43 status = r.status_code
44 self.assertEquals(status, 200)
72 r = self.kern_api.list()
73 self.assertEquals(r.status_code, 200)
45 74 assert isinstance(r.json(), list)
46 self.assertEqual(r.json()[0]['id'], data['id'])
47
48 # create another kernel and check that they both are added to the
75 self.assertEqual(r.json()[0]['id'], kern1['id'])
76
77 # create another kernel and check that they both are added to the
49 78 # list of kernels from a GET request
50 data2 = self.mkkernel()
51 assert isinstance(data2, dict)
52 r = requests.get(self.base_url())
79 kern2 = self.kern_api.start().json()
80 assert isinstance(kern2, dict)
81 r = self.kern_api.list()
53 82 kernels = r.json()
54 status = r.status_code
55 self.assertEquals(status, 200)
83 self.assertEquals(r.status_code, 200)
56 84 assert isinstance(kernels, list)
57 85 self.assertEquals(len(kernels), 2)
58 86
59 87 def test_kernel_handler(self):
60 88 # GET kernel with given id
61 data = self.mkkernel()
62 url = self.base_url() +'/' + data['id']
63 r = requests.get(url)
64 data1 = r.json()
65 status = r.status_code
66 self.assertEquals(status, 200)
67 assert isinstance(data1, dict)
68 self.assertIn('id', data1)
69 self.assertIn('ws_url', data1)
70 self.assertEqual(data1['id'], data['id'])
71
89 kid = self.kern_api.start().json()['id']
90 r = self.kern_api.get(kid)
91 kern1 = r.json()
92 self.assertEquals(r.status_code, 200)
93 assert isinstance(kern1, dict)
94 self.assertIn('id', kern1)
95 self.assertIn('ws_url', kern1)
96 self.assertEqual(kern1['id'], kid)
97
72 98 # Request a bad kernel id and check that a JSON
73 99 # message is returned!
74 100 bad_id = '111-111-111-111-111'
75 bad_url = self.base_url() + '/' + bad_id
76 r = requests.get(bad_url)
77 status = r.status_code
78 message = r.json()
79 self.assertEquals(status, 404)
80 assert isinstance(message, dict)
81 self.assertIn('message', message)
82 self.assertEquals(message['message'], 'Kernel does not exist: ' + bad_id)
83
101 with assert_http_error(404, 'Kernel does not exist: ' + bad_id):
102 self.kern_api.get(bad_id)
103
84 104 # DELETE kernel with id
85 r = requests.delete(url)
105 r = self.kern_api.shutdown(kid)
86 106 self.assertEqual(r.status_code, 204)
87 r = requests.get(self.base_url())
88 self.assertEqual(r.json(), [])
89
107 kernels = self.kern_api.list().json()
108 self.assertEqual(kernels, [])
109
90 110 # Request to delete a non-existent kernel id
91 111 bad_id = '111-111-111-111-111'
92 bad_url = self.base_url() + '/' + bad_id
93 r = requests.delete(bad_url)
94 status = r.status_code
95 message = r.json()
96 self.assertEquals(status, 404)
97 assert isinstance(message, dict)
98 self.assertIn('message', message)
99 self.assertEquals(message['message'], 'Kernel does not exist: ' + bad_id)
100 No newline at end of file
112 with assert_http_error(404, 'Kernel does not exist: ' + bad_id):
113 self.kern_api.shutdown(bad_id)
@@ -70,12 +70,14 b' class NotebookTestBase(TestCase):'
70 70
71 71
72 72 @contextmanager
73 def assert_http_error(status):
73 def assert_http_error(status, msg=None):
74 74 try:
75 75 yield
76 76 except requests.HTTPError as e:
77 77 real_status = e.response.status_code
78 78 assert real_status == status, \
79 79 "Expected status %d, got %d" % (real_status, status)
80 if msg:
81 assert msg in str(e), e
80 82 else:
81 83 assert False, "Expected HTTP error status" No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now