I'm looking over http://packages.python.org/web2py_utils/test_runner.html .
I'm trying to test my controller function "upload". It uses an SQLFORM().
The below code results in:
test_upload (web2py_utils.test_runner.TestDefaultController) ... please
fill out the form
The problem seems to occur during this line:
if self.formname != self.request_vars._formname:
status = False
in accepts() in gluon/html.py . I.e., the form is not "accepted".
However, it seems impossible via the test driver to properly set the
formname in gluon/sqlhtml.py (I pasted the code segment in question below).
Is there a way to accomplish what I would like to?
------------ controller function ---------------
@auth.requires_login()
def upload():
form = SQLFORM(db.mydb)
if form.process().accepted:
response.flash = 'form accepted'
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill out the form'
return dict(form=form)
---------------- test driver -----------------
import unittest
from gluon.storage import Storage
from gluon.tools import Auth
class TestDefaultController(unittest.TestCase):
def setUp(self):
# recipe
from http://packages.python.org/web2py_utils/test_runner.html
self.env = new_env(app='myapp', controller='default')
self.db = copy_db(self.env, db_name='db', db_link='sqlite:memory')
# copied from the models/db.py
global auth
auth = Auth(self.db, hmac_key=Auth.get_or_create_key())
def test_upload(self):
# copied
from http://packages.python.org/web2py_utils/test_runner.html
set_vars(self.env, id=1, file="/tmp/foo",
title="test"+str(os.getpid()),
_formname="myapp/upload")
exec '\n'.join("%s=self.env['%s']" % (i, i) for i in self.env)
# auth.user trick to get past authentication issues
auth.user = Storage(dict(id=1))
upload()
print response.flash
----------------- sqlhtml.py ----------------
if self.record:
if keyed:
formname_id = '.'.join(str(self.record[k])
for k in self.table._primarykey
if hasattr(self.record,k))
record_id = dict((k, request_vars.get(k,None)) \
for k in self.table._primarykey)
else:
(formname_id, record_id) = (self.record[self.id_field_name],
request_vars.get('id', None))
keepvalues = True
else:
if keyed:
formname_id = 'create'
record_id = dict([(k, None) for k in
self.table._primarykey])
else:
(formname_id, record_id) = ('create', None)
if formname:
formname = formname % dict(tablename = self.table._tablename,
record_id = formname_id)