##// END OF EJS Templates
don't use jsonapi in test_notebook_api
MinRK -
Show More
@@ -1,297 +1,295 b''
1 # coding: utf-8
1 # coding: utf-8
2 """Test the notebooks webservice API."""
2 """Test the notebooks webservice API."""
3
3
4 import io
4 import io
5 import json
5 import json
6 import os
6 import os
7 import shutil
7 import shutil
8 from unicodedata import normalize
8 from unicodedata import normalize
9
9
10 from zmq.utils import jsonapi
11
12 pjoin = os.path.join
10 pjoin = os.path.join
13
11
14 import requests
12 import requests
15
13
16 from IPython.html.utils import url_path_join, url_escape
14 from IPython.html.utils import url_path_join, url_escape
17 from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
15 from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
18 from IPython.nbformat.current import (new_notebook, write, read, new_worksheet,
16 from IPython.nbformat.current import (new_notebook, write, read, new_worksheet,
19 new_heading_cell, to_notebook_json)
17 new_heading_cell, to_notebook_json)
20 from IPython.utils import py3compat
18 from IPython.utils import py3compat
21 from IPython.utils.data import uniq_stable
19 from IPython.utils.data import uniq_stable
22
20
23
21
24 class NBAPI(object):
22 class NBAPI(object):
25 """Wrapper for notebook API calls."""
23 """Wrapper for notebook API calls."""
26 def __init__(self, base_url):
24 def __init__(self, base_url):
27 self.base_url = base_url
25 self.base_url = base_url
28
26
29 def _req(self, verb, path, body=None):
27 def _req(self, verb, path, body=None):
30 response = requests.request(verb,
28 response = requests.request(verb,
31 url_path_join(self.base_url, 'api/notebooks', path),
29 url_path_join(self.base_url, 'api/notebooks', path),
32 data=body,
30 data=body,
33 )
31 )
34 response.raise_for_status()
32 response.raise_for_status()
35 return response
33 return response
36
34
37 def list(self, path='/'):
35 def list(self, path='/'):
38 return self._req('GET', path)
36 return self._req('GET', path)
39
37
40 def read(self, name, path='/'):
38 def read(self, name, path='/'):
41 return self._req('GET', url_path_join(path, name))
39 return self._req('GET', url_path_join(path, name))
42
40
43 def create_untitled(self, path='/'):
41 def create_untitled(self, path='/'):
44 return self._req('POST', path)
42 return self._req('POST', path)
45
43
46 def upload_untitled(self, body, path='/'):
44 def upload_untitled(self, body, path='/'):
47 return self._req('POST', path, body)
45 return self._req('POST', path, body)
48
46
49 def copy_untitled(self, copy_from, path='/'):
47 def copy_untitled(self, copy_from, path='/'):
50 body = json.dumps({'copy_from':copy_from})
48 body = json.dumps({'copy_from':copy_from})
51 return self._req('POST', path, body)
49 return self._req('POST', path, body)
52
50
53 def create(self, name, path='/'):
51 def create(self, name, path='/'):
54 return self._req('PUT', url_path_join(path, name))
52 return self._req('PUT', url_path_join(path, name))
55
53
56 def upload(self, name, body, path='/'):
54 def upload(self, name, body, path='/'):
57 return self._req('PUT', url_path_join(path, name), body)
55 return self._req('PUT', url_path_join(path, name), body)
58
56
59 def copy(self, copy_from, copy_to, path='/'):
57 def copy(self, copy_from, copy_to, path='/'):
60 body = json.dumps({'copy_from':copy_from})
58 body = json.dumps({'copy_from':copy_from})
61 return self._req('PUT', url_path_join(path, copy_to), body)
59 return self._req('PUT', url_path_join(path, copy_to), body)
62
60
63 def save(self, name, body, path='/'):
61 def save(self, name, body, path='/'):
64 return self._req('PUT', url_path_join(path, name), body)
62 return self._req('PUT', url_path_join(path, name), body)
65
63
66 def delete(self, name, path='/'):
64 def delete(self, name, path='/'):
67 return self._req('DELETE', url_path_join(path, name))
65 return self._req('DELETE', url_path_join(path, name))
68
66
69 def rename(self, name, path, new_name):
67 def rename(self, name, path, new_name):
70 body = jsonapi.dumps({'name': new_name})
68 body = json.dumps({'name': new_name})
71 return self._req('PATCH', url_path_join(path, name), body)
69 return self._req('PATCH', url_path_join(path, name), body)
72
70
73 def get_checkpoints(self, name, path):
71 def get_checkpoints(self, name, path):
74 return self._req('GET', url_path_join(path, name, 'checkpoints'))
72 return self._req('GET', url_path_join(path, name, 'checkpoints'))
75
73
76 def new_checkpoint(self, name, path):
74 def new_checkpoint(self, name, path):
77 return self._req('POST', url_path_join(path, name, 'checkpoints'))
75 return self._req('POST', url_path_join(path, name, 'checkpoints'))
78
76
79 def restore_checkpoint(self, name, path, checkpoint_id):
77 def restore_checkpoint(self, name, path, checkpoint_id):
80 return self._req('POST', url_path_join(path, name, 'checkpoints', checkpoint_id))
78 return self._req('POST', url_path_join(path, name, 'checkpoints', checkpoint_id))
81
79
82 def delete_checkpoint(self, name, path, checkpoint_id):
80 def delete_checkpoint(self, name, path, checkpoint_id):
83 return self._req('DELETE', url_path_join(path, name, 'checkpoints', checkpoint_id))
81 return self._req('DELETE', url_path_join(path, name, 'checkpoints', checkpoint_id))
84
82
85 class APITest(NotebookTestBase):
83 class APITest(NotebookTestBase):
86 """Test the kernels web service API"""
84 """Test the kernels web service API"""
87 dirs_nbs = [('', 'inroot'),
85 dirs_nbs = [('', 'inroot'),
88 ('Directory with spaces in', 'inspace'),
86 ('Directory with spaces in', 'inspace'),
89 (u'unicodΓ©', 'innonascii'),
87 (u'unicodΓ©', 'innonascii'),
90 ('foo', 'a'),
88 ('foo', 'a'),
91 ('foo', 'b'),
89 ('foo', 'b'),
92 ('foo', 'name with spaces'),
90 ('foo', 'name with spaces'),
93 ('foo', u'unicodΓ©'),
91 ('foo', u'unicodΓ©'),
94 ('foo/bar', 'baz'),
92 ('foo/bar', 'baz'),
95 (u'Γ₯ b', u'Γ§ d')
93 (u'Γ₯ b', u'Γ§ d')
96 ]
94 ]
97
95
98 dirs = uniq_stable([d for (d,n) in dirs_nbs])
96 dirs = uniq_stable([d for (d,n) in dirs_nbs])
99 del dirs[0] # remove ''
97 del dirs[0] # remove ''
100
98
101 def setUp(self):
99 def setUp(self):
102 nbdir = self.notebook_dir.name
100 nbdir = self.notebook_dir.name
103
101
104 for d in self.dirs:
102 for d in self.dirs:
105 if not os.path.isdir(pjoin(nbdir, d)):
103 if not os.path.isdir(pjoin(nbdir, d)):
106 os.mkdir(pjoin(nbdir, d))
104 os.mkdir(pjoin(nbdir, d))
107
105
108 for d, name in self.dirs_nbs:
106 for d, name in self.dirs_nbs:
109 with io.open(pjoin(nbdir, d, '%s.ipynb' % name), 'w') as f:
107 with io.open(pjoin(nbdir, d, '%s.ipynb' % name), 'w') as f:
110 nb = new_notebook(name=name)
108 nb = new_notebook(name=name)
111 write(nb, f, format='ipynb')
109 write(nb, f, format='ipynb')
112
110
113 self.nb_api = NBAPI(self.base_url())
111 self.nb_api = NBAPI(self.base_url())
114
112
115 def tearDown(self):
113 def tearDown(self):
116 nbdir = self.notebook_dir.name
114 nbdir = self.notebook_dir.name
117
115
118 for dname in ['foo', 'Directory with spaces in', u'unicodΓ©', u'Γ₯ b']:
116 for dname in ['foo', 'Directory with spaces in', u'unicodΓ©', u'Γ₯ b']:
119 shutil.rmtree(pjoin(nbdir, dname), ignore_errors=True)
117 shutil.rmtree(pjoin(nbdir, dname), ignore_errors=True)
120
118
121 if os.path.isfile(pjoin(nbdir, 'inroot.ipynb')):
119 if os.path.isfile(pjoin(nbdir, 'inroot.ipynb')):
122 os.unlink(pjoin(nbdir, 'inroot.ipynb'))
120 os.unlink(pjoin(nbdir, 'inroot.ipynb'))
123
121
124 def test_list_notebooks(self):
122 def test_list_notebooks(self):
125 nbs = self.nb_api.list().json()
123 nbs = self.nb_api.list().json()
126 self.assertEqual(len(nbs), 1)
124 self.assertEqual(len(nbs), 1)
127 self.assertEqual(nbs[0]['name'], 'inroot.ipynb')
125 self.assertEqual(nbs[0]['name'], 'inroot.ipynb')
128
126
129 nbs = self.nb_api.list('/Directory with spaces in/').json()
127 nbs = self.nb_api.list('/Directory with spaces in/').json()
130 self.assertEqual(len(nbs), 1)
128 self.assertEqual(len(nbs), 1)
131 self.assertEqual(nbs[0]['name'], 'inspace.ipynb')
129 self.assertEqual(nbs[0]['name'], 'inspace.ipynb')
132
130
133 nbs = self.nb_api.list(u'/unicodΓ©/').json()
131 nbs = self.nb_api.list(u'/unicodΓ©/').json()
134 self.assertEqual(len(nbs), 1)
132 self.assertEqual(len(nbs), 1)
135 self.assertEqual(nbs[0]['name'], 'innonascii.ipynb')
133 self.assertEqual(nbs[0]['name'], 'innonascii.ipynb')
136 self.assertEqual(nbs[0]['path'], u'unicodΓ©')
134 self.assertEqual(nbs[0]['path'], u'unicodΓ©')
137
135
138 nbs = self.nb_api.list('/foo/bar/').json()
136 nbs = self.nb_api.list('/foo/bar/').json()
139 self.assertEqual(len(nbs), 1)
137 self.assertEqual(len(nbs), 1)
140 self.assertEqual(nbs[0]['name'], 'baz.ipynb')
138 self.assertEqual(nbs[0]['name'], 'baz.ipynb')
141 self.assertEqual(nbs[0]['path'], 'foo/bar')
139 self.assertEqual(nbs[0]['path'], 'foo/bar')
142
140
143 nbs = self.nb_api.list('foo').json()
141 nbs = self.nb_api.list('foo').json()
144 self.assertEqual(len(nbs), 4)
142 self.assertEqual(len(nbs), 4)
145 nbnames = { normalize('NFC', n['name']) for n in nbs }
143 nbnames = { normalize('NFC', n['name']) for n in nbs }
146 expected = [ u'a.ipynb', u'b.ipynb', u'name with spaces.ipynb', u'unicodΓ©.ipynb']
144 expected = [ u'a.ipynb', u'b.ipynb', u'name with spaces.ipynb', u'unicodΓ©.ipynb']
147 expected = { normalize('NFC', name) for name in expected }
145 expected = { normalize('NFC', name) for name in expected }
148 self.assertEqual(nbnames, expected)
146 self.assertEqual(nbnames, expected)
149
147
150 def test_list_nonexistant_dir(self):
148 def test_list_nonexistant_dir(self):
151 with assert_http_error(404):
149 with assert_http_error(404):
152 self.nb_api.list('nonexistant')
150 self.nb_api.list('nonexistant')
153
151
154 def test_get_contents(self):
152 def test_get_contents(self):
155 for d, name in self.dirs_nbs:
153 for d, name in self.dirs_nbs:
156 nb = self.nb_api.read('%s.ipynb' % name, d+'/').json()
154 nb = self.nb_api.read('%s.ipynb' % name, d+'/').json()
157 self.assertEqual(nb['name'], u'%s.ipynb' % name)
155 self.assertEqual(nb['name'], u'%s.ipynb' % name)
158 self.assertIn('content', nb)
156 self.assertIn('content', nb)
159 self.assertIn('metadata', nb['content'])
157 self.assertIn('metadata', nb['content'])
160 self.assertIsInstance(nb['content']['metadata'], dict)
158 self.assertIsInstance(nb['content']['metadata'], dict)
161
159
162 # Name that doesn't exist - should be a 404
160 # Name that doesn't exist - should be a 404
163 with assert_http_error(404):
161 with assert_http_error(404):
164 self.nb_api.read('q.ipynb', 'foo')
162 self.nb_api.read('q.ipynb', 'foo')
165
163
166 def _check_nb_created(self, resp, name, path):
164 def _check_nb_created(self, resp, name, path):
167 self.assertEqual(resp.status_code, 201)
165 self.assertEqual(resp.status_code, 201)
168 location_header = py3compat.str_to_unicode(resp.headers['Location'])
166 location_header = py3compat.str_to_unicode(resp.headers['Location'])
169 self.assertEqual(location_header, url_escape(url_path_join(u'/api/notebooks', path, name)))
167 self.assertEqual(location_header, url_escape(url_path_join(u'/api/notebooks', path, name)))
170 self.assertEqual(resp.json()['name'], name)
168 self.assertEqual(resp.json()['name'], name)
171 assert os.path.isfile(pjoin(self.notebook_dir.name, path, name))
169 assert os.path.isfile(pjoin(self.notebook_dir.name, path, name))
172
170
173 def test_create_untitled(self):
171 def test_create_untitled(self):
174 resp = self.nb_api.create_untitled(path=u'Γ₯ b')
172 resp = self.nb_api.create_untitled(path=u'Γ₯ b')
175 self._check_nb_created(resp, 'Untitled0.ipynb', u'Γ₯ b')
173 self._check_nb_created(resp, 'Untitled0.ipynb', u'Γ₯ b')
176
174
177 # Second time
175 # Second time
178 resp = self.nb_api.create_untitled(path=u'Γ₯ b')
176 resp = self.nb_api.create_untitled(path=u'Γ₯ b')
179 self._check_nb_created(resp, 'Untitled1.ipynb', u'Γ₯ b')
177 self._check_nb_created(resp, 'Untitled1.ipynb', u'Γ₯ b')
180
178
181 # And two directories down
179 # And two directories down
182 resp = self.nb_api.create_untitled(path='foo/bar')
180 resp = self.nb_api.create_untitled(path='foo/bar')
183 self._check_nb_created(resp, 'Untitled0.ipynb', pjoin('foo', 'bar'))
181 self._check_nb_created(resp, 'Untitled0.ipynb', pjoin('foo', 'bar'))
184
182
185 def test_upload_untitled(self):
183 def test_upload_untitled(self):
186 nb = new_notebook(name='Upload test')
184 nb = new_notebook(name='Upload test')
187 nbmodel = {'content': nb}
185 nbmodel = {'content': nb}
188 resp = self.nb_api.upload_untitled(path=u'Γ₯ b',
186 resp = self.nb_api.upload_untitled(path=u'Γ₯ b',
189 body=jsonapi.dumps(nbmodel))
187 body=json.dumps(nbmodel))
190 self._check_nb_created(resp, 'Untitled0.ipynb', u'Γ₯ b')
188 self._check_nb_created(resp, 'Untitled0.ipynb', u'Γ₯ b')
191
189
192 def test_upload(self):
190 def test_upload(self):
193 nb = new_notebook(name=u'ignored')
191 nb = new_notebook(name=u'ignored')
194 nbmodel = {'content': nb}
192 nbmodel = {'content': nb}
195 resp = self.nb_api.upload(u'Upload tΓ©st.ipynb', path=u'Γ₯ b',
193 resp = self.nb_api.upload(u'Upload tΓ©st.ipynb', path=u'Γ₯ b',
196 body=jsonapi.dumps(nbmodel))
194 body=json.dumps(nbmodel))
197 self._check_nb_created(resp, u'Upload tΓ©st.ipynb', u'Γ₯ b')
195 self._check_nb_created(resp, u'Upload tΓ©st.ipynb', u'Γ₯ b')
198
196
199 def test_copy_untitled(self):
197 def test_copy_untitled(self):
200 resp = self.nb_api.copy_untitled(u'Γ§ d.ipynb', path=u'Γ₯ b')
198 resp = self.nb_api.copy_untitled(u'Γ§ d.ipynb', path=u'Γ₯ b')
201 self._check_nb_created(resp, u'Γ§ d-Copy0.ipynb', u'Γ₯ b')
199 self._check_nb_created(resp, u'Γ§ d-Copy0.ipynb', u'Γ₯ b')
202
200
203 def test_copy(self):
201 def test_copy(self):
204 resp = self.nb_api.copy(u'Γ§ d.ipynb', u'cΓΈpy.ipynb', path=u'Γ₯ b')
202 resp = self.nb_api.copy(u'Γ§ d.ipynb', u'cΓΈpy.ipynb', path=u'Γ₯ b')
205 self._check_nb_created(resp, u'cΓΈpy.ipynb', u'Γ₯ b')
203 self._check_nb_created(resp, u'cΓΈpy.ipynb', u'Γ₯ b')
206
204
207 def test_delete(self):
205 def test_delete(self):
208 for d, name in self.dirs_nbs:
206 for d, name in self.dirs_nbs:
209 resp = self.nb_api.delete('%s.ipynb' % name, d)
207 resp = self.nb_api.delete('%s.ipynb' % name, d)
210 self.assertEqual(resp.status_code, 204)
208 self.assertEqual(resp.status_code, 204)
211
209
212 for d in self.dirs + ['/']:
210 for d in self.dirs + ['/']:
213 nbs = self.nb_api.list(d).json()
211 nbs = self.nb_api.list(d).json()
214 self.assertEqual(len(nbs), 0)
212 self.assertEqual(len(nbs), 0)
215
213
216 def test_rename(self):
214 def test_rename(self):
217 resp = self.nb_api.rename('a.ipynb', 'foo', 'z.ipynb')
215 resp = self.nb_api.rename('a.ipynb', 'foo', 'z.ipynb')
218 self.assertEqual(resp.headers['Location'].split('/')[-1], 'z.ipynb')
216 self.assertEqual(resp.headers['Location'].split('/')[-1], 'z.ipynb')
219 self.assertEqual(resp.json()['name'], 'z.ipynb')
217 self.assertEqual(resp.json()['name'], 'z.ipynb')
220 assert os.path.isfile(pjoin(self.notebook_dir.name, 'foo', 'z.ipynb'))
218 assert os.path.isfile(pjoin(self.notebook_dir.name, 'foo', 'z.ipynb'))
221
219
222 nbs = self.nb_api.list('foo').json()
220 nbs = self.nb_api.list('foo').json()
223 nbnames = set(n['name'] for n in nbs)
221 nbnames = set(n['name'] for n in nbs)
224 self.assertIn('z.ipynb', nbnames)
222 self.assertIn('z.ipynb', nbnames)
225 self.assertNotIn('a.ipynb', nbnames)
223 self.assertNotIn('a.ipynb', nbnames)
226
224
227 def test_save(self):
225 def test_save(self):
228 resp = self.nb_api.read('a.ipynb', 'foo')
226 resp = self.nb_api.read('a.ipynb', 'foo')
229 nbcontent = jsonapi.loads(resp.text)['content']
227 nbcontent = json.loads(resp.text)['content']
230 nb = to_notebook_json(nbcontent)
228 nb = to_notebook_json(nbcontent)
231 ws = new_worksheet()
229 ws = new_worksheet()
232 nb.worksheets = [ws]
230 nb.worksheets = [ws]
233 ws.cells.append(new_heading_cell(u'Created by test Β³'))
231 ws.cells.append(new_heading_cell(u'Created by test Β³'))
234
232
235 nbmodel= {'name': 'a.ipynb', 'path':'foo', 'content': nb}
233 nbmodel= {'name': 'a.ipynb', 'path':'foo', 'content': nb}
236 resp = self.nb_api.save('a.ipynb', path='foo', body=jsonapi.dumps(nbmodel))
234 resp = self.nb_api.save('a.ipynb', path='foo', body=json.dumps(nbmodel))
237
235
238 nbfile = pjoin(self.notebook_dir.name, 'foo', 'a.ipynb')
236 nbfile = pjoin(self.notebook_dir.name, 'foo', 'a.ipynb')
239 with io.open(nbfile, 'r', encoding='utf-8') as f:
237 with io.open(nbfile, 'r', encoding='utf-8') as f:
240 newnb = read(f, format='ipynb')
238 newnb = read(f, format='ipynb')
241 self.assertEqual(newnb.worksheets[0].cells[0].source,
239 self.assertEqual(newnb.worksheets[0].cells[0].source,
242 u'Created by test Β³')
240 u'Created by test Β³')
243 nbcontent = self.nb_api.read('a.ipynb', 'foo').json()['content']
241 nbcontent = self.nb_api.read('a.ipynb', 'foo').json()['content']
244 newnb = to_notebook_json(nbcontent)
242 newnb = to_notebook_json(nbcontent)
245 self.assertEqual(newnb.worksheets[0].cells[0].source,
243 self.assertEqual(newnb.worksheets[0].cells[0].source,
246 u'Created by test Β³')
244 u'Created by test Β³')
247
245
248 # Save and rename
246 # Save and rename
249 nbmodel= {'name': 'a2.ipynb', 'path':'foo/bar', 'content': nb}
247 nbmodel= {'name': 'a2.ipynb', 'path':'foo/bar', 'content': nb}
250 resp = self.nb_api.save('a.ipynb', path='foo', body=jsonapi.dumps(nbmodel))
248 resp = self.nb_api.save('a.ipynb', path='foo', body=json.dumps(nbmodel))
251 saved = resp.json()
249 saved = resp.json()
252 self.assertEqual(saved['name'], 'a2.ipynb')
250 self.assertEqual(saved['name'], 'a2.ipynb')
253 self.assertEqual(saved['path'], 'foo/bar')
251 self.assertEqual(saved['path'], 'foo/bar')
254 assert os.path.isfile(pjoin(self.notebook_dir.name,'foo','bar','a2.ipynb'))
252 assert os.path.isfile(pjoin(self.notebook_dir.name,'foo','bar','a2.ipynb'))
255 assert not os.path.isfile(pjoin(self.notebook_dir.name, 'foo', 'a.ipynb'))
253 assert not os.path.isfile(pjoin(self.notebook_dir.name, 'foo', 'a.ipynb'))
256 with assert_http_error(404):
254 with assert_http_error(404):
257 self.nb_api.read('a.ipynb', 'foo')
255 self.nb_api.read('a.ipynb', 'foo')
258
256
259 def test_checkpoints(self):
257 def test_checkpoints(self):
260 resp = self.nb_api.read('a.ipynb', 'foo')
258 resp = self.nb_api.read('a.ipynb', 'foo')
261 r = self.nb_api.new_checkpoint('a.ipynb', 'foo')
259 r = self.nb_api.new_checkpoint('a.ipynb', 'foo')
262 self.assertEqual(r.status_code, 201)
260 self.assertEqual(r.status_code, 201)
263 cp1 = r.json()
261 cp1 = r.json()
264 self.assertEqual(set(cp1), {'id', 'last_modified'})
262 self.assertEqual(set(cp1), {'id', 'last_modified'})
265 self.assertEqual(r.headers['Location'].split('/')[-1], cp1['id'])
263 self.assertEqual(r.headers['Location'].split('/')[-1], cp1['id'])
266
264
267 # Modify it
265 # Modify it
268 nbcontent = jsonapi.loads(resp.text)['content']
266 nbcontent = json.loads(resp.text)['content']
269 nb = to_notebook_json(nbcontent)
267 nb = to_notebook_json(nbcontent)
270 ws = new_worksheet()
268 ws = new_worksheet()
271 nb.worksheets = [ws]
269 nb.worksheets = [ws]
272 hcell = new_heading_cell('Created by test')
270 hcell = new_heading_cell('Created by test')
273 ws.cells.append(hcell)
271 ws.cells.append(hcell)
274 # Save
272 # Save
275 nbmodel= {'name': 'a.ipynb', 'path':'foo', 'content': nb}
273 nbmodel= {'name': 'a.ipynb', 'path':'foo', 'content': nb}
276 resp = self.nb_api.save('a.ipynb', path='foo', body=jsonapi.dumps(nbmodel))
274 resp = self.nb_api.save('a.ipynb', path='foo', body=json.dumps(nbmodel))
277
275
278 # List checkpoints
276 # List checkpoints
279 cps = self.nb_api.get_checkpoints('a.ipynb', 'foo').json()
277 cps = self.nb_api.get_checkpoints('a.ipynb', 'foo').json()
280 self.assertEqual(cps, [cp1])
278 self.assertEqual(cps, [cp1])
281
279
282 nbcontent = self.nb_api.read('a.ipynb', 'foo').json()['content']
280 nbcontent = self.nb_api.read('a.ipynb', 'foo').json()['content']
283 nb = to_notebook_json(nbcontent)
281 nb = to_notebook_json(nbcontent)
284 self.assertEqual(nb.worksheets[0].cells[0].source, 'Created by test')
282 self.assertEqual(nb.worksheets[0].cells[0].source, 'Created by test')
285
283
286 # Restore cp1
284 # Restore cp1
287 r = self.nb_api.restore_checkpoint('a.ipynb', 'foo', cp1['id'])
285 r = self.nb_api.restore_checkpoint('a.ipynb', 'foo', cp1['id'])
288 self.assertEqual(r.status_code, 204)
286 self.assertEqual(r.status_code, 204)
289 nbcontent = self.nb_api.read('a.ipynb', 'foo').json()['content']
287 nbcontent = self.nb_api.read('a.ipynb', 'foo').json()['content']
290 nb = to_notebook_json(nbcontent)
288 nb = to_notebook_json(nbcontent)
291 self.assertEqual(nb.worksheets, [])
289 self.assertEqual(nb.worksheets, [])
292
290
293 # Delete cp1
291 # Delete cp1
294 r = self.nb_api.delete_checkpoint('a.ipynb', 'foo', cp1['id'])
292 r = self.nb_api.delete_checkpoint('a.ipynb', 'foo', cp1['id'])
295 self.assertEqual(r.status_code, 204)
293 self.assertEqual(r.status_code, 204)
296 cps = self.nb_api.get_checkpoints('a.ipynb', 'foo').json()
294 cps = self.nb_api.get_checkpoints('a.ipynb', 'foo').json()
297 self.assertEqual(cps, [])
295 self.assertEqual(cps, [])
General Comments 0
You need to be logged in to leave comments. Login now