244 lines
8.8 KiB
Python
244 lines
8.8 KiB
Python
import os
|
|
import os.path as op
|
|
import unittest
|
|
|
|
from flask_admin.contrib import fileadmin
|
|
from flask_admin import Admin
|
|
from flask import Flask
|
|
|
|
from . import setup
|
|
|
|
try:
|
|
from StringIO import StringIO
|
|
except ImportError:
|
|
from io import StringIO
|
|
|
|
|
|
class Base:
|
|
class FileAdminTests(unittest.TestCase):
|
|
_test_files_root = op.join(op.dirname(__file__), 'files')
|
|
|
|
def fileadmin_class(self):
|
|
raise NotImplementedError
|
|
|
|
def fileadmin_args(self):
|
|
raise NotImplementedError
|
|
|
|
def test_file_admin(self):
|
|
fileadmin_class = self.fileadmin_class()
|
|
fileadmin_args, fileadmin_kwargs = self.fileadmin_args()
|
|
|
|
app, admin = setup()
|
|
|
|
class MyFileAdmin(fileadmin_class):
|
|
editable_extensions = ('txt',)
|
|
|
|
view_kwargs = dict(fileadmin_kwargs)
|
|
view_kwargs.setdefault('name', 'Files')
|
|
view = MyFileAdmin(*fileadmin_args, **view_kwargs)
|
|
|
|
admin.add_view(view)
|
|
|
|
client = app.test_client()
|
|
|
|
# index
|
|
rv = client.get('/admin/myfileadmin/')
|
|
assert rv.status_code == 200
|
|
assert 'path=dummy.txt' in rv.data.decode('utf-8')
|
|
|
|
# edit
|
|
rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
|
|
assert rv.status_code == 200
|
|
assert 'dummy.txt' in rv.data.decode('utf-8')
|
|
|
|
rv = client.post('/admin/myfileadmin/edit/?path=dummy.txt',
|
|
data=dict(content='new_string'))
|
|
assert rv.status_code == 302
|
|
|
|
rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt')
|
|
assert rv.status_code == 200
|
|
assert 'dummy.txt' in rv.data.decode('utf-8')
|
|
assert 'new_string' in rv.data.decode('utf-8')
|
|
|
|
# rename
|
|
rv = client.get('/admin/myfileadmin/rename/?path=dummy.txt')
|
|
assert rv.status_code == 200
|
|
assert 'dummy.txt' in rv.data.decode('utf-8')
|
|
|
|
rv = client.post('/admin/myfileadmin/rename/?path=dummy.txt',
|
|
data=dict(name='dummy_renamed.txt',
|
|
path='dummy.txt'))
|
|
assert rv.status_code == 302
|
|
|
|
rv = client.get('/admin/myfileadmin/')
|
|
assert rv.status_code == 200
|
|
assert 'path=dummy_renamed.txt' in rv.data.decode('utf-8')
|
|
assert 'path=dummy.txt' not in rv.data.decode('utf-8')
|
|
|
|
# upload
|
|
rv = client.get('/admin/myfileadmin/upload/')
|
|
assert rv.status_code == 200
|
|
|
|
rv = client.post('/admin/myfileadmin/upload/',
|
|
data=dict(upload=(StringIO(""), 'dummy.txt')))
|
|
assert rv.status_code == 302
|
|
|
|
rv = client.get('/admin/myfileadmin/')
|
|
assert rv.status_code == 200
|
|
assert 'path=dummy.txt' in rv.data.decode('utf-8')
|
|
assert 'path=dummy_renamed.txt' in rv.data.decode('utf-8')
|
|
|
|
# delete
|
|
rv = client.post('/admin/myfileadmin/delete/',
|
|
data=dict(path='dummy_renamed.txt'))
|
|
assert rv.status_code == 302
|
|
|
|
rv = client.get('/admin/myfileadmin/')
|
|
assert rv.status_code == 200
|
|
assert 'path=dummy_renamed.txt' not in rv.data.decode('utf-8')
|
|
assert 'path=dummy.txt' in rv.data.decode('utf-8')
|
|
|
|
# mkdir
|
|
rv = client.get('/admin/myfileadmin/mkdir/')
|
|
assert rv.status_code == 200
|
|
|
|
rv = client.post('/admin/myfileadmin/mkdir/',
|
|
data=dict(name='dummy_dir'))
|
|
assert rv.status_code == 302
|
|
|
|
rv = client.get('/admin/myfileadmin/')
|
|
assert rv.status_code == 200
|
|
assert 'path=dummy.txt' in rv.data.decode('utf-8')
|
|
assert 'path=dummy_dir' in rv.data.decode('utf-8')
|
|
|
|
# rename - directory
|
|
rv = client.get('/admin/myfileadmin/rename/?path=dummy_dir')
|
|
assert rv.status_code == 200
|
|
assert 'dummy_dir' in rv.data.decode('utf-8')
|
|
|
|
rv = client.post('/admin/myfileadmin/rename/?path=dummy_dir',
|
|
data=dict(name='dummy_renamed_dir',
|
|
path='dummy_dir'))
|
|
assert rv.status_code == 302
|
|
|
|
rv = client.get('/admin/myfileadmin/')
|
|
assert rv.status_code == 200
|
|
assert 'path=dummy_renamed_dir' in rv.data.decode('utf-8')
|
|
assert 'path=dummy_dir' not in rv.data.decode('utf-8')
|
|
|
|
# delete - directory
|
|
rv = client.post('/admin/myfileadmin/delete/',
|
|
data=dict(path='dummy_renamed_dir'))
|
|
assert rv.status_code == 302
|
|
|
|
rv = client.get('/admin/myfileadmin/')
|
|
assert rv.status_code == 200
|
|
assert 'path=dummy_renamed_dir' not in rv.data.decode('utf-8')
|
|
assert 'path=dummy.txt' in rv.data.decode('utf-8')
|
|
|
|
def test_modal_edit(self):
|
|
# bootstrap 2 - test edit_modal
|
|
app_bs2 = Flask(__name__)
|
|
admin_bs2 = Admin(app_bs2, template_mode="bootstrap2")
|
|
|
|
fileadmin_class = self.fileadmin_class()
|
|
fileadmin_args, fileadmin_kwargs = self.fileadmin_args()
|
|
|
|
class EditModalOn(fileadmin_class):
|
|
edit_modal = True
|
|
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/')
|
|
assert rv.status_code == 200
|
|
data = rv.data.decode('utf-8')
|
|
assert 'fa_modal_window' in data
|
|
|
|
# bootstrap 2 - test edit modal disabled
|
|
rv = client_bs2.get('/admin/edit_modal_off/')
|
|
assert rv.status_code == 200
|
|
data = rv.data.decode('utf-8')
|
|
assert '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/')
|
|
assert rv.status_code == 200
|
|
data = rv.data.decode('utf-8')
|
|
assert 'fa_modal_window' in data
|
|
|
|
# bootstrap 3 - test modal disabled
|
|
rv = client_bs3.get('/admin/edit_modal_off/')
|
|
assert rv.status_code == 200
|
|
data = rv.data.decode('utf-8')
|
|
assert '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'), {}
|
|
|
|
def test_fileadmin_sort_bogus_url_param(self):
|
|
fileadmin_class = self.fileadmin_class()
|
|
fileadmin_args, fileadmin_kwargs = self.fileadmin_args()
|
|
app, admin = setup()
|
|
|
|
class MyFileAdmin(fileadmin_class):
|
|
editable_extensions = ('txt',)
|
|
|
|
view_kwargs = dict(fileadmin_kwargs)
|
|
view_kwargs.setdefault('name', 'Files')
|
|
view = MyFileAdmin(*fileadmin_args, **view_kwargs)
|
|
|
|
admin.add_view(view)
|
|
|
|
client = app.test_client()
|
|
with open(op.join(self._test_files_root, 'dummy2.txt'), 'w') as fp:
|
|
# make sure that 'files/dummy2.txt' exists, is newest and has bigger size
|
|
fp.write('test')
|
|
|
|
rv = client.get('/admin/myfileadmin/?sort=bogus')
|
|
assert rv.status_code == 200
|
|
assert rv.data.decode('utf-8').find('path=dummy2.txt') < \
|
|
rv.data.decode('utf-8').find('path=dummy.txt')
|
|
|
|
rv = client.get('/admin/myfileadmin/?sort=name')
|
|
assert rv.status_code == 200
|
|
assert rv.data.decode('utf-8').find('path=dummy.txt') < \
|
|
rv.data.decode('utf-8').find('path=dummy2.txt')
|
|
try:
|
|
# clean up
|
|
os.remove(op.join(self._test_files_root, 'dummy2.txt'))
|
|
except (IOError, OSError):
|
|
pass
|