##// END OF EJS Templates
update notebook api tests...
MinRK -
Show More
@@ -16,16 +16,21 b' from IPython.html.utils import url_path_join'
16 from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
16 from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
17 from IPython.nbformat.current import (new_notebook, write, read, new_worksheet,
17 from IPython.nbformat.current import (new_notebook, write, read, new_worksheet,
18 new_heading_cell, to_notebook_json)
18 new_heading_cell, to_notebook_json)
19 from IPython.utils import py3compat
19 from IPython.utils.data import uniq_stable
20 from IPython.utils.data import uniq_stable
20
21
22
21 class NBAPI(object):
23 class NBAPI(object):
22 """Wrapper for notebook API calls."""
24 """Wrapper for notebook API calls."""
23 def __init__(self, base_url):
25 def __init__(self, base_url):
24 self.base_url = base_url
26 self.base_url = base_url
25
27
26 def _req(self, verb, path, body=None):
28 def _req(self, verb, path, body=None, params=None):
27 response = requests.request(verb,
29 response = requests.request(verb,
28 url_path_join(self.base_url, 'api/notebooks', path), data=body)
30 url_path_join(self.base_url, 'api/notebooks', path),
31 data=body,
32 params=params,
33 )
29 response.raise_for_status()
34 response.raise_for_status()
30 return response
35 return response
31
36
@@ -38,11 +43,20 b' class NBAPI(object):'
38 def create_untitled(self, path='/'):
43 def create_untitled(self, path='/'):
39 return self._req('POST', path)
44 return self._req('POST', path)
40
45
46 def upload_untitled(self, body, path='/'):
47 return self._req('POST', path, body)
48
49 def copy_untitled(self, copy_from, path='/'):
50 return self._req('POST', path, params={'copy':copy_from})
51
52 def create(self, name, path='/'):
53 return self._req('PUT', url_path_join(path, name))
54
41 def upload(self, name, body, path='/'):
55 def upload(self, name, body, path='/'):
42 return self._req('POST', url_path_join(path, name), body)
56 return self._req('PUT', url_path_join(path, name), body)
43
57
44 def copy(self, name, path='/'):
58 def copy(self, copy_from, copy_to, path='/'):
45 return self._req('POST', url_path_join(path, name, 'copy'))
59 return self._req('PUT', url_path_join(path, copy_to), params={'copy':copy_from})
46
60
47 def save(self, name, body, path='/'):
61 def save(self, name, body, path='/'):
48 return self._req('PUT', url_path_join(path, name), body)
62 return self._req('PUT', url_path_join(path, name), body)
@@ -76,6 +90,7 b' class APITest(NotebookTestBase):'
76 ('foo', 'name with spaces'),
90 ('foo', 'name with spaces'),
77 ('foo', u'unicodé'),
91 ('foo', u'unicodé'),
78 ('foo/bar', 'baz'),
92 ('foo/bar', 'baz'),
93 (u'å b', u'ç d')
79 ]
94 ]
80
95
81 dirs = uniq_stable([d for (d,n) in dirs_nbs])
96 dirs = uniq_stable([d for (d,n) in dirs_nbs])
@@ -85,7 +100,8 b' class APITest(NotebookTestBase):'
85 nbdir = self.notebook_dir.name
100 nbdir = self.notebook_dir.name
86
101
87 for d in self.dirs:
102 for d in self.dirs:
88 os.mkdir(pjoin(nbdir, d))
103 if not os.path.isdir(pjoin(nbdir, d)):
104 os.mkdir(pjoin(nbdir, d))
89
105
90 for d, name in self.dirs_nbs:
106 for d, name in self.dirs_nbs:
91 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:
@@ -97,7 +113,7 b' class APITest(NotebookTestBase):'
97 def tearDown(self):
113 def tearDown(self):
98 nbdir = self.notebook_dir.name
114 nbdir = self.notebook_dir.name
99
115
100 for dname in ['foo', 'Directory with spaces in', u'unicodé']:
116 for dname in ['foo', 'Directory with spaces in', u'unicodé', u'å b']:
101 shutil.rmtree(pjoin(nbdir, dname), ignore_errors=True)
117 shutil.rmtree(pjoin(nbdir, dname), ignore_errors=True)
102
118
103 if os.path.isfile(pjoin(nbdir, 'inroot.ipynb')):
119 if os.path.isfile(pjoin(nbdir, 'inroot.ipynb')):
@@ -115,10 +131,12 b' class APITest(NotebookTestBase):'
115 nbs = self.nb_api.list(u'/unicodé/').json()
131 nbs = self.nb_api.list(u'/unicodé/').json()
116 self.assertEqual(len(nbs), 1)
132 self.assertEqual(len(nbs), 1)
117 self.assertEqual(nbs[0]['name'], 'innonascii.ipynb')
133 self.assertEqual(nbs[0]['name'], 'innonascii.ipynb')
134 self.assertEqual(nbs[0]['path'], u'unicodé')
118
135
119 nbs = self.nb_api.list('/foo/bar/').json()
136 nbs = self.nb_api.list('/foo/bar/').json()
120 self.assertEqual(len(nbs), 1)
137 self.assertEqual(len(nbs), 1)
121 self.assertEqual(nbs[0]['name'], 'baz.ipynb')
138 self.assertEqual(nbs[0]['name'], 'baz.ipynb')
139 self.assertEqual(nbs[0]['path'], 'foo/bar')
122
140
123 nbs = self.nb_api.list('foo').json()
141 nbs = self.nb_api.list('foo').json()
124 self.assertEqual(len(nbs), 4)
142 self.assertEqual(len(nbs), 4)
@@ -134,7 +152,7 b' class APITest(NotebookTestBase):'
134 def test_get_contents(self):
152 def test_get_contents(self):
135 for d, name in self.dirs_nbs:
153 for d, name in self.dirs_nbs:
136 nb = self.nb_api.read('%s.ipynb' % name, d+'/').json()
154 nb = self.nb_api.read('%s.ipynb' % name, d+'/').json()
137 self.assertEqual(nb['name'], '%s.ipynb' % name)
155 self.assertEqual(nb['name'], u'%s.ipynb' % name)
138 self.assertIn('content', nb)
156 self.assertIn('content', nb)
139 self.assertIn('metadata', nb['content'])
157 self.assertIn('metadata', nb['content'])
140 self.assertIsInstance(nb['content']['metadata'], dict)
158 self.assertIsInstance(nb['content']['metadata'], dict)
@@ -145,32 +163,44 b' class APITest(NotebookTestBase):'
145
163
146 def _check_nb_created(self, resp, name, path):
164 def _check_nb_created(self, resp, name, path):
147 self.assertEqual(resp.status_code, 201)
165 self.assertEqual(resp.status_code, 201)
148 self.assertEqual(resp.headers['Location'].split('/')[-1], name)
166 location_header = py3compat.str_to_unicode(resp.headers['Location'])
167 self.assertEqual(location_header.split('/')[-1], name)
149 self.assertEqual(resp.json()['name'], name)
168 self.assertEqual(resp.json()['name'], name)
150 assert os.path.isfile(pjoin(self.notebook_dir.name, path, name))
169 assert os.path.isfile(pjoin(self.notebook_dir.name, path, name))
151
170
152 def test_create_untitled(self):
171 def test_create_untitled(self):
153 resp = self.nb_api.create_untitled(path='foo')
172 resp = self.nb_api.create_untitled(path=u'å b')
154 self._check_nb_created(resp, 'Untitled0.ipynb', 'foo')
173 self._check_nb_created(resp, 'Untitled0.ipynb', u'å b')
155
174
156 # Second time
175 # Second time
157 resp = self.nb_api.create_untitled(path='foo')
176 resp = self.nb_api.create_untitled(path=u'å b')
158 self._check_nb_created(resp, 'Untitled1.ipynb', 'foo')
177 self._check_nb_created(resp, 'Untitled1.ipynb', u'å b')
159
178
160 # And two directories down
179 # And two directories down
161 resp = self.nb_api.create_untitled(path='foo/bar')
180 resp = self.nb_api.create_untitled(path='foo/bar')
162 self._check_nb_created(resp, 'Untitled0.ipynb', pjoin('foo', 'bar'))
181 self._check_nb_created(resp, 'Untitled0.ipynb', pjoin('foo', 'bar'))
163
182
164 def test_upload(self):
183 def test_upload_untitled(self):
165 nb = new_notebook(name='Upload test')
184 nb = new_notebook(name='Upload test')
166 nbmodel = {'content': nb}
185 nbmodel = {'content': nb}
167 resp = self.nb_api.upload('Upload test.ipynb', path='foo',
186 resp = self.nb_api.upload_untitled(path=u'å b',
168 body=jsonapi.dumps(nbmodel))
187 body=jsonapi.dumps(nbmodel))
169 self._check_nb_created(resp, 'Upload test.ipynb', 'foo')
188 self._check_nb_created(resp, 'Untitled0.ipynb', 'å b')
189
190 def test_upload(self):
191 nb = new_notebook(name=u'ignored')
192 nbmodel = {'content': nb}
193 resp = self.nb_api.upload(u'Upload tést.ipynb', path=u'å b',
194 body=jsonapi.dumps(nbmodel))
195 self._check_nb_created(resp, u'Upload tést.ipynb', u'å b')
196
197 def test_copy_untitled(self):
198 resp = self.nb_api.copy_untitled(u'ç d.ipynb', path=u'å b')
199 self._check_nb_created(resp, u'ç d-Copy0.ipynb', u'å b')
170
200
171 def test_copy(self):
201 def test_copy(self):
172 resp = self.nb_api.copy('a.ipynb', path='foo')
202 resp = self.nb_api.copy(u'ç d.ipynb', u'cøpy.ipynb', path=u'å b')
173 self._check_nb_created(resp, 'a-Copy0.ipynb', 'foo')
203 self._check_nb_created(resp, u'cøpy.ipynb', u'å b')
174
204
175 def test_delete(self):
205 def test_delete(self):
176 for d, name in self.dirs_nbs:
206 for d, name in self.dirs_nbs:
General Comments 0
You need to be logged in to leave comments. Login now