Commit 4ceb004c authored by Serge S. Koval's avatar Serge S. Koval

Merge pull request #92 from plaes/inlineform-tests

Add basic tests for SQLAlchemy inlineform implementation
parents 0a1dcfbb 42146456
...@@ -2,6 +2,6 @@ try: ...@@ -2,6 +2,6 @@ try:
import peewee import peewee
import wtfpeewee import wtfpeewee
except ImportError: except ImportError:
raise Exception('Please install peewee and wtfpeewee packages in order to use peewee integration') raise Exception('Please install peewee and wtf-peewee packages in order to use peewee integration')
from .view import ModelView from .view import ModelView
...@@ -340,8 +340,7 @@ class ModelView(BaseModelView): ...@@ -340,8 +340,7 @@ class ModelView(BaseModelView):
:returns: :returns:
``True`` for ``String``, ``Unicode``, ``Text``, ``UnicodeText`` ``True`` for ``String``, ``Unicode``, ``Text``, ``UnicodeText``
""" """
return (name == 'String' or name == 'Unicode' or return name in ('String', 'Unicode', 'Text', 'UnicodeText')
name == 'Text' or name == 'UnicodeText')
def scaffold_filters(self, name): def scaffold_filters(self, name):
""" """
...@@ -590,6 +589,7 @@ class ModelView(BaseModelView): ...@@ -590,6 +589,7 @@ class ModelView(BaseModelView):
return True return True
except Exception, ex: except Exception, ex:
flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error')
self.session.rollback()
return False return False
def update_model(self, form, model): def update_model(self, form, model):
...@@ -609,6 +609,7 @@ class ModelView(BaseModelView): ...@@ -609,6 +609,7 @@ class ModelView(BaseModelView):
return True return True
except Exception, ex: except Exception, ex:
flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error')
self.session.rollback()
return False return False
def delete_model(self, model): def delete_model(self, model):
...@@ -626,6 +627,7 @@ class ModelView(BaseModelView): ...@@ -626,6 +627,7 @@ class ModelView(BaseModelView):
return True return True
except Exception, ex: except Exception, ex:
flash(gettext('Failed to delete model. %(error)s', error=str(ex)), 'error') flash(gettext('Failed to delete model. %(error)s', error=str(ex)), 'error')
self.session.rollback()
return False return False
# Default model actions # Default model actions
......
from flask import Flask
from flask.ext.admin import Admin
from flask.ext.sqlalchemy import SQLAlchemy
def setup():
app = Flask(__name__)
app.config['SECRET_KEY'] = '1'
app.config['CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'
db = SQLAlchemy(app)
admin = Admin(app)
return app, db, admin
from nose.tools import eq_, ok_, raises from nose.tools import eq_, ok_, raises
from flask import Flask
from flask.ext import wtf from flask.ext import wtf
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.admin import Admin
from flask.ext.admin.contrib.sqlamodel import ModelView from flask.ext.admin.contrib.sqlamodel import ModelView
from . import setup
class CustomModelView(ModelView): class CustomModelView(ModelView):
def __init__(self, model, session, def __init__(self, model, session,
...@@ -20,7 +16,6 @@ class CustomModelView(ModelView): ...@@ -20,7 +16,6 @@ class CustomModelView(ModelView):
name, category, name, category,
endpoint, url) endpoint, url)
def create_models(db): def create_models(db):
class Model1(db.Model): class Model1(db.Model):
def __init__(self, test1=None, test2=None, test3=None, test4=None): def __init__(self, test1=None, test2=None, test3=None, test4=None):
...@@ -45,18 +40,6 @@ def create_models(db): ...@@ -45,18 +40,6 @@ def create_models(db):
return Model1, Model2 return Model1, Model2
def setup():
app = Flask(__name__)
app.config['SECRET_KEY'] = '1'
app.config['CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'
db = SQLAlchemy(app)
admin = Admin(app)
return app, db, admin
def test_model(): def test_model():
app, db, admin = setup() app, db, admin = setup()
Model1, Model2 = create_models(db) Model1, Model2 = create_models(db)
...@@ -392,3 +375,19 @@ def test_on_model_change_delete(): ...@@ -392,3 +375,19 @@ def test_on_model_change_delete():
client.post(url) client.post(url)
ok_(view.deleted) ok_(view.deleted)
def test_multiple_delete():
app, db, admin = setup()
M1, _ = create_models(db)
db.session.add_all([M1('a'), M1('b'), M1('c')])
db.session.commit()
eq_(M1.query.count(), 3)
view = ModelView(M1, db.session)
admin.add_view(view)
client = app.test_client()
rv = client.post('/admin/model1view/action/', data=dict(action='delete', rowid=[1,2,3]))
eq_(rv.status_code, 302)
eq_(M1.query.count(), 0)
# -*- coding: utf-8 -*-
from nose.tools import eq_, ok_, raises
from flask.ext import wtf
from flask.ext.admin.contrib.sqlamodel import ModelView, fields
from . import setup
def test_inline_form():
app, db, admin = setup()
client = app.test_client()
# Set up models and database
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True)
def __init__(self, name=None):
self.name = name
class UserInfo(db.Model):
__tablename__ = 'user_info'
id = db.Column(db.Integer, primary_key=True)
key = db.Column(db.String, nullable=False)
val = db.Column(db.String)
user_id = db.Column(db.Integer, db.ForeignKey(User.id))
user = db.relationship(User, backref=db.backref('info', cascade="all, delete-orphan", single_parent=True))
db.create_all()
# Set up Admin
class UserModelView(ModelView):
inline_models = (UserInfo,)
view = UserModelView(User, db.session)
admin.add_view(view)
# Basic tests
ok_(view._create_form_class is not None)
ok_(view._edit_form_class is not None)
eq_(view.endpoint, 'userview')
# Verify form
eq_(view._create_form_class.name.field_class, wtf.TextField)
eq_(view._create_form_class.info.field_class, fields.InlineModelFormList)
rv = client.get('/admin/userview/')
eq_(rv.status_code, 200)
rv = client.get('/admin/userview/new/')
eq_(rv.status_code, 200)
# Create
rv = client.post('/admin/userview/new/', data=dict(name=u'äõüxyz'))
eq_(rv.status_code, 302)
eq_(User.query.count(), 1)
eq_(UserInfo.query.count(), 0)
rv = client.post('/admin/userview/new/', data={'name': u'fbar', \
'info-0-key': 'foo', 'info-0-val' : 'bar'})
eq_(rv.status_code, 302)
eq_(User.query.count(), 2)
eq_(UserInfo.query.count(), 1)
# Edit
rv = client.get('/admin/userview/edit/?id=2')
eq_(rv.status_code, 200)
# Edit - update
rv = client.post('/admin/userview/edit/?id=2', data={'name': u'barfoo', \
'info-0-id': 1, 'info-0-key': u'xxx', 'info-0-val':u'yyy'})
eq_(UserInfo.query.count(), 1)
eq_(UserInfo.query.one().key, u'xxx')
# Edit - add & delete
rv = client.post('/admin/userview/edit/?id=2', data={'name': u'barf', \
'del-info-0': 'on', 'info-0-id': '1', 'info-0-key': 'yyy', 'info-0-val': 'xxx',
'info-1-id': None, 'info-1-key': u'bar', 'info-1-val' : u'foo'})
eq_(rv.status_code, 302)
eq_(User.query.count(), 2)
eq_(User.query.get(2).name, u'barf')
eq_(UserInfo.query.count(), 1)
eq_(UserInfo.query.one().key, u'bar')
# Delete
rv = client.post('/admin/userview/delete/?id=2')
eq_(rv.status_code, 302)
eq_(User.query.count(), 1)
rv = client.post('/admin/userview/delete/?id=1')
eq_(rv.status_code, 302)
eq_(User.query.count(), 0)
eq_(UserInfo.query.count(), 0)
...@@ -2,4 +2,3 @@ ...@@ -2,4 +2,3 @@
detailed-errors=1 detailed-errors=1
with-coverage=0 with-coverage=0
debug=nose.loader debug=nose.loader
tests=flask_admin/tests/test_base.py
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