flask test client post does not create object in database -
the following test code not pass though manually submitting form on web interface work.
import os flask.ext.testing import testcase flask import url_for config import _basedir app import app, db app.users.models import user class testuser(testcase): def create_app(self): """ required method. implement app returned context. """ app.config['testing'] = true app.config['sqlalchemy_database_uri'] = 'sqlite:///' + os.path.join(_basedir, 'test.db') app.config['wtf_csrf_enabled'] = false # must disabled post succeed during tests self.client = app.test_client() ctx = app.app_context() ctx.push() return app def setup(self): db.create_all() #pass @app.teardown_appcontext def teardown(self): db.session.remove() db.drop_all() #pass def test_admin_home(self): # url admin home page url = url_for('admin.index') resp = self.client.get(url) self.asserttrue(resp.status_code == 200) def test_admin_registration(self): url = url_for('admin.register_view') data = {'username': 'admin', 'email': 'admin@example.com', 'password': 'admin'} resp = self.client.post(url, data) self.asserttrue(resp.status_code == 200) u = user.query.filter_by(username=u'admin').first() self.asserttrue(u.username == 'admin') # <----- fails. why?
after test client has post register_view
url , returns 200 ok response, fail retrieve 'admin' user test database. why so?
here's view code (this flask admin view)
from flask import request flask.ext.admin import expose, adminindexview, helpers app.auth.forms import loginform, registrationform app.users.models import user app import db class myadminindexview(adminindexview): @expose('/', methods=('get', 'post')) def index(self): # handle user login form = loginform(request.form) self._template_args['form'] = form return super(myadminindexview, self).index() @expose('/register/', methods=('get', 'post')) def register_view(self): # handle user registration form = registrationform(request.form) if helpers.validate_form_on_submit(form): user = user() form.populate_obj(user) db.session.add(user) db.session.commit() self._template_args['form'] = form return super(myadminindexview, self).index()
dumbest mistake ever.
the offending line in test code is
resp = self.client.post(url, data)
it should be
resp = self.client.post(url, data=data)
i managed track down painstakingly walking through logic , inserting ipdb.set_trace()
step step until found bad post request made client.
Comments
Post a Comment