114 lines
3.9 KiB
Python
114 lines
3.9 KiB
Python
|
from unittest import TestCase
|
||
|
from ipython_genutils.tempdir import TemporaryDirectory
|
||
|
from ..largefilemanager import LargeFileManager
|
||
|
import os
|
||
|
from tornado import web
|
||
|
|
||
|
|
||
|
def _make_dir(contents_manager, api_path):
|
||
|
"""
|
||
|
Make a directory.
|
||
|
"""
|
||
|
os_path = contents_manager._get_os_path(api_path)
|
||
|
try:
|
||
|
os.makedirs(os_path)
|
||
|
except OSError:
|
||
|
print("Directory already exists: %r" % os_path)
|
||
|
|
||
|
|
||
|
class TestLargeFileManager(TestCase):
|
||
|
|
||
|
def setUp(self):
|
||
|
self._temp_dir = TemporaryDirectory()
|
||
|
self.td = self._temp_dir.name
|
||
|
self.contents_manager = LargeFileManager(root_dir=self.td)
|
||
|
|
||
|
def make_dir(self, api_path):
|
||
|
"""make a subdirectory at api_path
|
||
|
|
||
|
override in subclasses if contents are not on the filesystem.
|
||
|
"""
|
||
|
_make_dir(self.contents_manager, api_path)
|
||
|
|
||
|
def test_save(self):
|
||
|
|
||
|
cm = self.contents_manager
|
||
|
# Create a notebook
|
||
|
model = cm.new_untitled(type='notebook')
|
||
|
name = model['name']
|
||
|
path = model['path']
|
||
|
|
||
|
# Get the model with 'content'
|
||
|
full_model = cm.get(path)
|
||
|
# Save the notebook
|
||
|
model = cm.save(full_model, path)
|
||
|
assert isinstance(model, dict)
|
||
|
self.assertIn('name', model)
|
||
|
self.assertIn('path', model)
|
||
|
self.assertEqual(model['name'], name)
|
||
|
self.assertEqual(model['path'], path)
|
||
|
|
||
|
try:
|
||
|
model = {'name': 'test', 'path': 'test', 'chunk': 1}
|
||
|
cm.save(model, model['path'])
|
||
|
except web.HTTPError as e:
|
||
|
self.assertEqual('HTTP 400: Bad Request (No file type provided)', str(e))
|
||
|
|
||
|
try:
|
||
|
model = {'name': 'test', 'path': 'test', 'chunk': 1, 'type': 'notebook'}
|
||
|
cm.save(model, model['path'])
|
||
|
except web.HTTPError as e:
|
||
|
self.assertEqual('HTTP 400: Bad Request (File type "notebook" is not supported for large file transfer)', str(e))
|
||
|
|
||
|
try:
|
||
|
model = {'name': 'test', 'path': 'test', 'chunk': 1, 'type': 'file'}
|
||
|
cm.save(model, model['path'])
|
||
|
except web.HTTPError as e:
|
||
|
self.assertEqual('HTTP 400: Bad Request (No file content provided)', str(e))
|
||
|
|
||
|
try:
|
||
|
model = {'name': 'test', 'path': 'test', 'chunk': 2, 'type': 'file',
|
||
|
'content': u'test', 'format': 'json'}
|
||
|
cm.save(model, model['path'])
|
||
|
except web.HTTPError as e:
|
||
|
self.assertEqual("HTTP 400: Bad Request (Must specify format of file contents as 'text' or 'base64')",
|
||
|
str(e))
|
||
|
|
||
|
# Save model for different chunks
|
||
|
model = {'name': 'test', 'path': 'test', 'type': 'file',
|
||
|
'content': u'test==', 'format': 'text'}
|
||
|
name = model['name']
|
||
|
path = model['path']
|
||
|
cm.save(model, path)
|
||
|
|
||
|
for chunk in (1, 2, -1):
|
||
|
for fm in ('text', 'base64'):
|
||
|
full_model = cm.get(path)
|
||
|
full_model['chunk'] = chunk
|
||
|
full_model['format'] = fm
|
||
|
model_res = cm.save(full_model, path)
|
||
|
assert isinstance(model_res, dict)
|
||
|
|
||
|
self.assertIn('name', model_res)
|
||
|
self.assertIn('path', model_res)
|
||
|
self.assertNotIn('chunk', model_res)
|
||
|
self.assertEqual(model_res['name'], name)
|
||
|
self.assertEqual(model_res['path'], path)
|
||
|
|
||
|
# Test in sub-directory
|
||
|
# Create a directory and notebook in that directory
|
||
|
sub_dir = '/foo/'
|
||
|
self.make_dir('foo')
|
||
|
model = cm.new_untitled(path=sub_dir, type='notebook')
|
||
|
name = model['name']
|
||
|
path = model['path']
|
||
|
model = cm.get(path)
|
||
|
|
||
|
# Change the name in the model for rename
|
||
|
model = cm.save(model, path)
|
||
|
assert isinstance(model, dict)
|
||
|
self.assertIn('name', model)
|
||
|
self.assertIn('path', model)
|
||
|
self.assertEqual(model['name'], 'Untitled.ipynb')
|
||
|
self.assertEqual(model['path'], 'foo/Untitled.ipynb')
|