Commit 2bfb6b9c authored by Clemens Wolff's avatar Clemens Wolff

Make file-admin test easier to extend

Currently the unit tests for file-admin are tied to the local
implementation. However, all other implementations of the file-admin
(e..g S3) should maintain the same invariants as the local one. As such,
this change makes it easier to copy the local file-admin tests for other
storage backends.
parent 6f570e33
import os.path as op import os.path as op
import unittest
from nose.tools import eq_, ok_ from nose.tools import eq_, ok_
...@@ -14,178 +15,196 @@ except ImportError: ...@@ -14,178 +15,196 @@ except ImportError:
from io import StringIO from io import StringIO
def create_view(): class Base:
app, admin = setup() class FileAdminTests(unittest.TestCase):
_test_files_root = op.join(op.dirname(__file__), 'files')
class MyFileAdmin(fileadmin.FileAdmin):
editable_extensions = ('txt',)
path = op.join(op.dirname(__file__), 'files')
view = MyFileAdmin(path, '/files/', name='Files')
admin.add_view(view)
return app, admin, view
def test_file_admin():
app, admin, view = create_view()
client = app.test_client()
# index
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200)
ok_('path=dummy.txt' in rv.data.decode('utf-8'))
# edit
rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
eq_(rv.status_code, 200)
ok_('dummy.txt' in rv.data.decode('utf-8'))
rv = client.post('/admin/myfileadmin/edit/?path=dummy.txt', data=dict(
content='new_string'
))
eq_(rv.status_code, 302)
rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
eq_(rv.status_code, 200)
ok_('dummy.txt' in rv.data.decode('utf-8'))
ok_('new_string' in rv.data.decode('utf-8'))
# rename
rv = client.get('/admin/myfileadmin/rename/?path=dummy.txt')
eq_(rv.status_code, 200)
ok_('dummy.txt' in rv.data.decode('utf-8'))
rv = client.post('/admin/myfileadmin/rename/?path=dummy.txt', data=dict( def fileadmin_class(self):
name='dummy_renamed.txt', raise NotImplementedError
path='dummy.txt'
))
eq_(rv.status_code, 302)
rv = client.get('/admin/myfileadmin/') def fileadmin_args(self):
eq_(rv.status_code, 200) raise NotImplementedError
ok_('path=dummy_renamed.txt' in rv.data.decode('utf-8'))
ok_('path=dummy.txt' not in rv.data.decode('utf-8')) def test_file_admin(self):
fileadmin_class = self.fileadmin_class()
# upload fileadmin_args, fileadmin_kwargs = self.fileadmin_args()
rv = client.get('/admin/myfileadmin/upload/')
eq_(rv.status_code, 200) app, admin = setup()
rv = client.post('/admin/myfileadmin/upload/', data=dict( class MyFileAdmin(fileadmin_class):
upload=(StringIO(""), 'dummy.txt'), editable_extensions = ('txt',)
))
eq_(rv.status_code, 302) view_kwargs = dict(fileadmin_kwargs)
view_kwargs.setdefault('name', 'Files')
rv = client.get('/admin/myfileadmin/') view = MyFileAdmin(*fileadmin_args, **view_kwargs)
eq_(rv.status_code, 200)
ok_('path=dummy.txt' in rv.data.decode('utf-8')) admin.add_view(view)
ok_('path=dummy_renamed.txt' in rv.data.decode('utf-8'))
client = app.test_client()
# delete
rv = client.post('/admin/myfileadmin/delete/', data=dict( # index
path='dummy_renamed.txt' rv = client.get('/admin/myfileadmin/')
)) eq_(rv.status_code, 200)
eq_(rv.status_code, 302) ok_('path=dummy.txt' in rv.data.decode('utf-8'))
rv = client.get('/admin/myfileadmin/') # edit
eq_(rv.status_code, 200) rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
ok_('path=dummy_renamed.txt' not in rv.data.decode('utf-8')) eq_(rv.status_code, 200)
ok_('path=dummy.txt' in rv.data.decode('utf-8')) ok_('dummy.txt' in rv.data.decode('utf-8'))
# mkdir rv = client.post('/admin/myfileadmin/edit/?path=dummy.txt',
rv = client.get('/admin/myfileadmin/mkdir/') data=dict(content='new_string'))
eq_(rv.status_code, 200) eq_(rv.status_code, 302)
rv = client.post('/admin/myfileadmin/mkdir/', data=dict( rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
name='dummy_dir' eq_(rv.status_code, 200)
)) ok_('dummy.txt' in rv.data.decode('utf-8'))
eq_(rv.status_code, 302) ok_('new_string' in rv.data.decode('utf-8'))
rv = client.get('/admin/myfileadmin/') # rename
eq_(rv.status_code, 200) rv = client.get('/admin/myfileadmin/rename/?path=dummy.txt')
ok_('path=dummy.txt' in rv.data.decode('utf-8')) eq_(rv.status_code, 200)
ok_('path=dummy_dir' in rv.data.decode('utf-8')) ok_('dummy.txt' in rv.data.decode('utf-8'))
# rename - directory rv = client.post('/admin/myfileadmin/rename/?path=dummy.txt',
rv = client.get('/admin/myfileadmin/rename/?path=dummy_dir') data=dict(name='dummy_renamed.txt',
eq_(rv.status_code, 200) path='dummy.txt'))
ok_('dummy_dir' in rv.data.decode('utf-8')) eq_(rv.status_code, 302)
rv = client.post('/admin/myfileadmin/rename/?path=dummy_dir', data=dict( rv = client.get('/admin/myfileadmin/')
name='dummy_renamed_dir', eq_(rv.status_code, 200)
path='dummy_dir' ok_('path=dummy_renamed.txt' in rv.data.decode('utf-8'))
)) ok_('path=dummy.txt' not in rv.data.decode('utf-8'))
eq_(rv.status_code, 302)
# upload
rv = client.get('/admin/myfileadmin/') rv = client.get('/admin/myfileadmin/upload/')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
ok_('path=dummy_renamed_dir' in rv.data.decode('utf-8'))
ok_('path=dummy_dir' not in rv.data.decode('utf-8')) rv = client.post('/admin/myfileadmin/upload/',
data=dict(upload=(StringIO(""), 'dummy.txt')))
# delete - directory eq_(rv.status_code, 302)
rv = client.post('/admin/myfileadmin/delete/', data=dict(
path='dummy_renamed_dir' rv = client.get('/admin/myfileadmin/')
)) eq_(rv.status_code, 200)
eq_(rv.status_code, 302) ok_('path=dummy.txt' in rv.data.decode('utf-8'))
ok_('path=dummy_renamed.txt' in rv.data.decode('utf-8'))
rv = client.get('/admin/myfileadmin/')
eq_(rv.status_code, 200) # delete
ok_('path=dummy_renamed_dir' not in rv.data.decode('utf-8')) rv = client.post('/admin/myfileadmin/delete/',
ok_('path=dummy.txt' in rv.data.decode('utf-8')) data=dict(path='dummy_renamed.txt'))
eq_(rv.status_code, 302)
def test_modal_edit(): rv = client.get('/admin/myfileadmin/')
# bootstrap 2 - test edit_modal eq_(rv.status_code, 200)
app_bs2 = Flask(__name__) ok_('path=dummy_renamed.txt' not in rv.data.decode('utf-8'))
admin_bs2 = Admin(app_bs2, template_mode="bootstrap2") ok_('path=dummy.txt' in rv.data.decode('utf-8'))
class EditModalOn(fileadmin.FileAdmin): # mkdir
edit_modal = True rv = client.get('/admin/myfileadmin/mkdir/')
editable_extensions = ('txt',) eq_(rv.status_code, 200)
class EditModalOff(fileadmin.FileAdmin): rv = client.post('/admin/myfileadmin/mkdir/',
edit_modal = False data=dict(name='dummy_dir'))
editable_extensions = ('txt',) eq_(rv.status_code, 302)
path = op.join(op.dirname(__file__), 'files') rv = client.get('/admin/myfileadmin/')
edit_modal_on = EditModalOn(path, '/files/', endpoint='edit_modal_on') eq_(rv.status_code, 200)
edit_modal_off = EditModalOff(path, '/files/', endpoint='edit_modal_off') ok_('path=dummy.txt' in rv.data.decode('utf-8'))
ok_('path=dummy_dir' in rv.data.decode('utf-8'))
admin_bs2.add_view(edit_modal_on)
admin_bs2.add_view(edit_modal_off) # rename - directory
rv = client.get('/admin/myfileadmin/rename/?path=dummy_dir')
client_bs2 = app_bs2.test_client() eq_(rv.status_code, 200)
ok_('dummy_dir' in rv.data.decode('utf-8'))
# bootstrap 2 - ensure modal window is added when edit_modal is enabled
rv = client_bs2.get('/admin/edit_modal_on/') rv = client.post('/admin/myfileadmin/rename/?path=dummy_dir',
eq_(rv.status_code, 200) data=dict(name='dummy_renamed_dir',
data = rv.data.decode('utf-8') path='dummy_dir'))
ok_('fa_modal_window' in data) eq_(rv.status_code, 302)
# bootstrap 2 - test edit modal disabled rv = client.get('/admin/myfileadmin/')
rv = client_bs2.get('/admin/edit_modal_off/') eq_(rv.status_code, 200)
eq_(rv.status_code, 200) ok_('path=dummy_renamed_dir' in rv.data.decode('utf-8'))
data = rv.data.decode('utf-8') ok_('path=dummy_dir' not in rv.data.decode('utf-8'))
ok_('fa_modal_window' not in data)
# delete - directory
# bootstrap 3 rv = client.post('/admin/myfileadmin/delete/',
app_bs3 = Flask(__name__) data=dict(path='dummy_renamed_dir'))
admin_bs3 = Admin(app_bs3, template_mode="bootstrap3") eq_(rv.status_code, 302)
admin_bs3.add_view(edit_modal_on) rv = client.get('/admin/myfileadmin/')
admin_bs3.add_view(edit_modal_off) eq_(rv.status_code, 200)
ok_('path=dummy_renamed_dir' not in rv.data.decode('utf-8'))
client_bs3 = app_bs3.test_client() ok_('path=dummy.txt' in rv.data.decode('utf-8'))
# bootstrap 3 - ensure modal window is added when edit_modal is enabled def test_modal_edit(self):
rv = client_bs3.get('/admin/edit_modal_on/') # bootstrap 2 - test edit_modal
eq_(rv.status_code, 200) app_bs2 = Flask(__name__)
data = rv.data.decode('utf-8') admin_bs2 = Admin(app_bs2, template_mode="bootstrap2")
ok_('fa_modal_window' in data)
fileadmin_class = self.fileadmin_class()
# bootstrap 3 - test modal disabled fileadmin_args, fileadmin_kwargs = self.fileadmin_args()
rv = client_bs3.get('/admin/edit_modal_off/')
eq_(rv.status_code, 200) class EditModalOn(fileadmin_class):
data = rv.data.decode('utf-8') edit_modal = True
ok_('fa_modal_window' not in data) editable_extensions = ('txt',)
class EditModalOff(fileadmin_class):
edit_modal = False
editable_extensions = ('txt',)
on_view_kwargs = dict(fileadmin_kwargs)
on_view_kwargs.setdefault('endpoint', 'edit_modal_on')
edit_modal_on = EditModalOn(*fileadmin_args, **on_view_kwargs)
off_view_kwargs = dict(fileadmin_kwargs)
off_view_kwargs.setdefault('endpoint', 'edit_modal_off')
edit_modal_off = EditModalOff(*fileadmin_args, **off_view_kwargs)
admin_bs2.add_view(edit_modal_on)
admin_bs2.add_view(edit_modal_off)
client_bs2 = app_bs2.test_client()
# bootstrap 2 - ensure modal window is added when edit_modal is
# enabled
rv = client_bs2.get('/admin/edit_modal_on/')
eq_(rv.status_code, 200)
data = rv.data.decode('utf-8')
ok_('fa_modal_window' in data)
# bootstrap 2 - test edit modal disabled
rv = client_bs2.get('/admin/edit_modal_off/')
eq_(rv.status_code, 200)
data = rv.data.decode('utf-8')
ok_('fa_modal_window' not in data)
# bootstrap 3
app_bs3 = Flask(__name__)
admin_bs3 = Admin(app_bs3, template_mode="bootstrap3")
admin_bs3.add_view(edit_modal_on)
admin_bs3.add_view(edit_modal_off)
client_bs3 = app_bs3.test_client()
# bootstrap 3 - ensure modal window is added when edit_modal is
# enabled
rv = client_bs3.get('/admin/edit_modal_on/')
eq_(rv.status_code, 200)
data = rv.data.decode('utf-8')
ok_('fa_modal_window' in data)
# bootstrap 3 - test modal disabled
rv = client_bs3.get('/admin/edit_modal_off/')
eq_(rv.status_code, 200)
data = rv.data.decode('utf-8')
ok_('fa_modal_window' not in data)
class LocalFileAdminTests(Base.FileAdminTests):
def fileadmin_class(self):
return fileadmin.FileAdmin
def fileadmin_args(self):
return (self._test_files_root, '/files'), {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment