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:
import peewee
import wtfpeewee
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
......@@ -340,8 +340,7 @@ class ModelView(BaseModelView):
:returns:
``True`` for ``String``, ``Unicode``, ``Text``, ``UnicodeText``
"""
return (name == 'String' or name == 'Unicode' or
name == 'Text' or name == 'UnicodeText')
return name in ('String', 'Unicode', 'Text', 'UnicodeText')
def scaffold_filters(self, name):
"""
......@@ -590,6 +589,7 @@ class ModelView(BaseModelView):
return True
except Exception, ex:
flash(gettext('Failed to create model. %(error)s', error=str(ex)), 'error')
self.session.rollback()
return False
def update_model(self, form, model):
......@@ -609,6 +609,7 @@ class ModelView(BaseModelView):
return True
except Exception, ex:
flash(gettext('Failed to update model. %(error)s', error=str(ex)), 'error')
self.session.rollback()
return False
def delete_model(self, model):
......@@ -626,6 +627,7 @@ class ModelView(BaseModelView):
return True
except Exception, ex:
flash(gettext('Failed to delete model. %(error)s', error=str(ex)), 'error')
self.session.rollback()
return False
# 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 flask import Flask
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 . import setup
class CustomModelView(ModelView):
def __init__(self, model, session,
......@@ -20,7 +16,6 @@ class CustomModelView(ModelView):
name, category,
endpoint, url)
def create_models(db):
class Model1(db.Model):
def __init__(self, test1=None, test2=None, test3=None, test4=None):
......@@ -45,18 +40,6 @@ def create_models(db):
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():
app, db, admin = setup()
Model1, Model2 = create_models(db)
......@@ -392,3 +375,19 @@ def test_on_model_change_delete():
client.post(url)
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 @@
detailed-errors=1
with-coverage=0
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