Commit 20ce56f2 authored by Serge S. Koval's avatar Serge S. Koval

More unit tests.

parent 235b6d9b
......@@ -621,5 +621,10 @@ class ModelView(BaseModelView):
`model`
Model to delete
"""
self.session.delete(model)
self.session.commit()
try:
self.session.delete(model)
self.session.commit()
return True
except Exception, ex:
flash('Failed to delete model. ' + str(ex), 'error')
return False
......@@ -3,4 +3,3 @@ detailed-errors=1
with-coverage=0
debug=nose.loader
tests=tests/test_base.py
from flask.ext.adminex import base
class MockView(base.BaseView):
# Various properties
allow_call = True
allow_access = True
@base.expose('/')
def index(self):
return 'Success!'
@base.expose('/test/')
def test(self):
return self.render('mock.html')
def _handle_view(self, name, **kwargs):
if self.allow_call:
return super(MockView, self)._handle_view(name, **kwargs)
else:
return 'Failure!'
def is_accessible(self):
if self.allow_access:
return super(MockView, self).is_accessible()
else:
return False
......@@ -3,7 +3,31 @@ from nose.tools import ok_, eq_, raises
from flask import Flask
from flask.ext.adminex import base
from .mock import MockView
class MockView(base.BaseView):
# Various properties
allow_call = True
allow_access = True
@base.expose('/')
def index(self):
return 'Success!'
@base.expose('/test/')
def test(self):
return self.render('mock.html')
def _handle_view(self, name, **kwargs):
if self.allow_call:
return super(MockView, self)._handle_view(name, **kwargs)
else:
return 'Failure!'
def is_accessible(self):
if self.allow_access:
return super(MockView, self).is_accessible()
else:
return False
def test_baseview_defaults():
......
from nose.tools import eq_, ok_
from flask import Flask
from flask.helpers import get_flashed_messages
from flask.ext.adminex import Admin
from flask.ext.adminex.model import base, filters
......@@ -7,7 +10,7 @@ from flask.ext import wtf
class Model(object):
def __init__(self, id=None, c1=None, c2=None, c3=None):
def __init__(self, id=None, c1=1, c2=2, c3=3):
self.id = id
self.col1 = c1
self.col2 = c2
......@@ -21,54 +24,89 @@ class Form(wtf.Form):
class MockModelView(base.BaseModelView):
def __init__(self, model, name=None, category=None, endpoint=None, url=None):
def __init__(self, model, name=None, category=None, endpoint=None, url=None,
**kwargs):
# Allow to set any attributes from parameters
for k, v in kwargs.iteritems():
setattr(self, k, v)
super(MockModelView, self).__init__(model, name, category, endpoint, url)
self.created_models = []
self.updated_models = []
self.deleted_models = []
self.search_arguments = []
self.all_models = {1: Model(1),
2: Model(2)}
self.last_id = 3
# Scaffolding
def scaffold_pk(self):
return 'id'
def scaffold_list_columns(self):
return ['col1', 'col2', 'col3']
columns = ['col1', 'col2', 'col3']
if self.excluded_list_columns:
return filter(lambda x: x not in self.excluded_list_columns, columns)
return columns
def init_search(self):
return True
return bool(self.searchable_columns)
def scaffold_filters(self):
return None
def scaffold_sortable_columns(self):
return ['col1', 'col2', 'col3']
def scaffold_form(self):
return Form
# Data
def get_list(self, page, sort_field, sort_desc, search, filters):
return [Model(1,2,3,4), Model(2,3,4,5)]
self.search_arguments.append((page, sort_field, sort_desc, search, filters))
return len(self.all_models), self.all_models.itervalues()
def get_one(self, id):
return Model(1,2,3,4)
return self.all_models.get(id)
def create_model(self, form):
model = Model()
model = Model(self.last_id)
self.last_id += 1
form.populate_obj(model)
self.created_models.append(model)
self.all_models[model.id] = model
return True
def update_model(self, form, model):
form.populate_obj(model)
self.updated_models.append(model)
return True
def delete_model(self, model):
self.deleted_models.append(model)
return True
def test_mockview():
def setup():
app = Flask(__name__)
admin = Admin()
app.config['CSRF_ENABLED'] = False
app.secret_key = '1'
admin = Admin(app)
return app, admin
view = MockView(Model)
def test_mockview():
app, admin = setup()
view = MockModelView(Model)
admin.add_view(view)
eq_(view.model, Model)
......@@ -81,20 +119,144 @@ def test_mockview():
eq_(view._sortable_columns, ['col1', 'col2', 'col3'])
eq_(view._create_form_class, Form)
eq_(view._edit_form_class, Form)
eq_(view._search_supported, True)
eq_(view._search_supported, False)
eq_(view._filters, None)
# Make some test requests
client = app.test_client()
# Make model view requests
rv = client.get('/admin/modelview/')
eq_(rv.status_code, 200)
ok_('/admin/modelview/delete/1/' in rv.data)
# Test model creation view
rv = client.get('/admin/modelview/new/')
eq_(rv.status_code, 200)
rv = client.get('/admin/modelview/edit/0/')
eq_(rv.status_code, 200)
rv = client.post('/admin/modelview/new/',
data=dict(col1='test1', col2='test2', col3='test3'))
eq_(rv.status_code, 302)
eq_(len(view.created_models), 1)
rv = client.post('/admin/modelview/delete/0/')
model = view.created_models.pop()
eq_(model.id, 3)
eq_(model.col1, 'test1')
eq_(model.col2, 'test2')
eq_(model.col3, 'test3')
# Try model edit view
rv = client.get('/admin/modelview/edit/3/')
eq_(rv.status_code, 200)
ok_('test1' in rv.data)
rv = client.post('/admin/modelview/edit/3/',
data=dict(col1='test!', col2='test@', col3='test#'))
eq_(rv.status_code, 302)
eq_(len(view.updated_models), 1)
model = view.updated_models.pop()
eq_(model.col1, 'test!')
eq_(model.col2, 'test@')
eq_(model.col3, 'test#')
rv = client.get('/admin/modelview/edit/4/')
eq_(rv.status_code, 302)
# Attempt to delete model
rv = client.post('/admin/modelview/delete/3/')
eq_(rv.status_code, 302)
eq_(rv.headers['location'], 'http://localhost/admin/modelview/')
def test_permissions():
app, admin = setup()
view = MockModelView(Model)
admin.add_view(view)
client = app.test_client()
view.can_create = False
rv = client.get('/admin/modelview/new/')
eq_(rv.status_code, 302)
view.can_edit = False
rv = client.get('/admin/modelview/edit/1/')
eq_(rv.status_code, 302)
view.can_delete = False
rv = client.post('/admin/modelview/delete/1/')
eq_(rv.status_code, 302)
def test_templates():
app, admin = setup()
view = MockModelView(Model)
admin.add_view(view)
client = app.test_client()
view.list_template = 'mock.html'
view.create_template = 'mock.html'
view.edit_template = 'mock.html'
rv = client.get('/admin/modelview/')
eq_(rv.data, 'Success!')
rv = client.get('/admin/modelview/new/')
eq_(rv.data, 'Success!')
rv = client.get('/admin/modelview/edit/1/')
eq_(rv.data, 'Success!')
def test_list_columns():
app, admin = setup()
view = MockModelView(Model,
list_columns=['col1', 'col3'],
rename_columns=dict(col1='Column1'))
admin.add_view(view)
eq_(len(view._list_columns), 2)
eq_(view._list_columns, [('col1', 'Column1'), ('col3', 'Col3')])
client = app.test_client()
rv = client.get('/admin/modelview/')
ok_('Column1' in rv.data)
ok_('Col2' not in rv.data)
def test_exclude_columns():
app, admin = setup()
view = MockModelView(Model, excluded_list_columns=['col2'])
admin.add_view(view)
eq_(view._list_columns, [('col1', 'Col1'), ('col3', 'Col3')])
client = app.test_client()
rv = client.get('/admin/modelview/')
ok_('Col1' in rv.data)
ok_('Col2' not in rv.data)
def test_sortable_columns():
app, admin = setup()
view = MockModelView(Model, sortable_columns=['col1', ('col2', 'test1')])
admin.add_view(view)
eq_(view._sortable_columns, dict(col1='col1', col2='test1'))
def test_searchable_columns():
app, admin = setup()
view = MockModelView(Model, searchable_columns=['col1', 'col2'])
admin.add_view(view)
eq_(view._search_supported, True)
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