Browse Source

fix minitwit/flaskr test errors, improve docs about file open mode

app.open_resource needs to get called with the correct mode param (python3
will read bytes [not str] if the wrong mode is used), add mode param docs.

rv.data is bytes, fix the data type we compare it with to be also bytes
pull/742/head
Thomas Waldmann 12 years ago
parent
commit
8bb972e5ae
  1. 2
      docs/patterns/sqlite3.rst
  2. 2
      docs/tutorial/dbinit.rst
  3. 2
      examples/flaskr/flaskr.py
  4. 16
      examples/flaskr/flaskr_tests.py
  5. 2
      examples/minitwit/minitwit.py
  6. 56
      examples/minitwit/minitwit_tests.py
  7. 1
      flask/app.py
  8. 1
      flask/helpers.py

2
docs/patterns/sqlite3.rst

@ -124,7 +124,7 @@ can do that for you::
def init_db(): def init_db():
with app.app_context(): with app.app_context():
db = get_db() db = get_db()
with app.open_resource('schema.sql') as f: with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read()) db.cursor().executescript(f.read())
db.commit() db.commit()

2
docs/tutorial/dbinit.rst

@ -33,7 +33,7 @@ earlier. Just add that function below the `connect_db` function in
def init_db(): def init_db():
with closing(connect_db()) as db: with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f: with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read()) db.cursor().executescript(f.read())
db.commit() db.commit()

2
examples/flaskr/flaskr.py

@ -31,7 +31,7 @@ def init_db():
"""Creates the database tables.""" """Creates the database tables."""
with app.app_context(): with app.app_context():
db = get_db() db = get_db()
with app.open_resource('schema.sql') as f: with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read()) db.cursor().executescript(f.read())
db.commit() db.commit()

16
examples/flaskr/flaskr_tests.py

@ -42,21 +42,21 @@ class FlaskrTestCase(unittest.TestCase):
def test_empty_db(self): def test_empty_db(self):
"""Start with a blank database.""" """Start with a blank database."""
rv = self.app.get('/') rv = self.app.get('/')
assert 'No entries here so far' in rv.data assert b'No entries here so far' in rv.data
def test_login_logout(self): def test_login_logout(self):
"""Make sure login and logout works""" """Make sure login and logout works"""
rv = self.login(flaskr.app.config['USERNAME'], rv = self.login(flaskr.app.config['USERNAME'],
flaskr.app.config['PASSWORD']) flaskr.app.config['PASSWORD'])
assert 'You were logged in' in rv.data assert b'You were logged in' in rv.data
rv = self.logout() rv = self.logout()
assert 'You were logged out' in rv.data assert b'You were logged out' in rv.data
rv = self.login(flaskr.app.config['USERNAME'] + 'x', rv = self.login(flaskr.app.config['USERNAME'] + 'x',
flaskr.app.config['PASSWORD']) flaskr.app.config['PASSWORD'])
assert 'Invalid username' in rv.data assert b'Invalid username' in rv.data
rv = self.login(flaskr.app.config['USERNAME'], rv = self.login(flaskr.app.config['USERNAME'],
flaskr.app.config['PASSWORD'] + 'x') flaskr.app.config['PASSWORD'] + 'x')
assert 'Invalid password' in rv.data assert b'Invalid password' in rv.data
def test_messages(self): def test_messages(self):
"""Test that messages work""" """Test that messages work"""
@ -66,9 +66,9 @@ class FlaskrTestCase(unittest.TestCase):
title='<Hello>', title='<Hello>',
text='<strong>HTML</strong> allowed here' text='<strong>HTML</strong> allowed here'
), follow_redirects=True) ), follow_redirects=True)
assert 'No entries here so far' not in rv.data assert b'No entries here so far' not in rv.data
assert '&lt;Hello&gt;' in rv.data assert b'&lt;Hello&gt;' in rv.data
assert '<strong>HTML</strong> allowed here' in rv.data assert b'<strong>HTML</strong> allowed here' in rv.data
if __name__ == '__main__': if __name__ == '__main__':

2
examples/minitwit/minitwit.py

@ -53,7 +53,7 @@ def init_db():
"""Creates the database tables.""" """Creates the database tables."""
with app.app_context(): with app.app_context():
db = get_db() db = get_db()
with app.open_resource('schema.sql') as f: with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read()) db.cursor().executescript(f.read())
db.commit() db.commit()

56
examples/minitwit/minitwit_tests.py

@ -63,7 +63,7 @@ class MiniTwitTestCase(unittest.TestCase):
rv = self.app.post('/add_message', data={'text': text}, rv = self.app.post('/add_message', data={'text': text},
follow_redirects=True) follow_redirects=True)
if text: if text:
assert 'Your message was recorded' in rv.data assert b'Your message was recorded' in rv.data
return rv return rv
# testing functions # testing functions
@ -71,29 +71,29 @@ class MiniTwitTestCase(unittest.TestCase):
def test_register(self): def test_register(self):
"""Make sure registering works""" """Make sure registering works"""
rv = self.register('user1', 'default') rv = self.register('user1', 'default')
assert 'You were successfully registered ' \ assert b'You were successfully registered ' \
'and can login now' in rv.data b'and can login now' in rv.data
rv = self.register('user1', 'default') rv = self.register('user1', 'default')
assert 'The username is already taken' in rv.data assert b'The username is already taken' in rv.data
rv = self.register('', 'default') rv = self.register('', 'default')
assert 'You have to enter a username' in rv.data assert b'You have to enter a username' in rv.data
rv = self.register('meh', '') rv = self.register('meh', '')
assert 'You have to enter a password' in rv.data assert b'You have to enter a password' in rv.data
rv = self.register('meh', 'x', 'y') rv = self.register('meh', 'x', 'y')
assert 'The two passwords do not match' in rv.data assert b'The two passwords do not match' in rv.data
rv = self.register('meh', 'foo', email='broken') rv = self.register('meh', 'foo', email='broken')
assert 'You have to enter a valid email address' in rv.data assert b'You have to enter a valid email address' in rv.data
def test_login_logout(self): def test_login_logout(self):
"""Make sure logging in and logging out works""" """Make sure logging in and logging out works"""
rv = self.register_and_login('user1', 'default') rv = self.register_and_login('user1', 'default')
assert 'You were logged in' in rv.data assert b'You were logged in' in rv.data
rv = self.logout() rv = self.logout()
assert 'You were logged out' in rv.data assert b'You were logged out' in rv.data
rv = self.login('user1', 'wrongpassword') rv = self.login('user1', 'wrongpassword')
assert 'Invalid password' in rv.data assert b'Invalid password' in rv.data
rv = self.login('user2', 'wrongpassword') rv = self.login('user2', 'wrongpassword')
assert 'Invalid username' in rv.data assert b'Invalid username' in rv.data
def test_message_recording(self): def test_message_recording(self):
"""Check if adding messages works""" """Check if adding messages works"""
@ -101,8 +101,8 @@ class MiniTwitTestCase(unittest.TestCase):
self.add_message('test message 1') self.add_message('test message 1')
self.add_message('<test message 2>') self.add_message('<test message 2>')
rv = self.app.get('/') rv = self.app.get('/')
assert 'test message 1' in rv.data assert b'test message 1' in rv.data
assert '&lt;test message 2&gt;' in rv.data assert b'&lt;test message 2&gt;' in rv.data
def test_timelines(self): def test_timelines(self):
"""Make sure that timelines work""" """Make sure that timelines work"""
@ -112,37 +112,37 @@ class MiniTwitTestCase(unittest.TestCase):
self.register_and_login('bar', 'default') self.register_and_login('bar', 'default')
self.add_message('the message by bar') self.add_message('the message by bar')
rv = self.app.get('/public') rv = self.app.get('/public')
assert 'the message by foo' in rv.data assert b'the message by foo' in rv.data
assert 'the message by bar' in rv.data assert b'the message by bar' in rv.data
# bar's timeline should just show bar's message # bar's timeline should just show bar's message
rv = self.app.get('/') rv = self.app.get('/')
assert 'the message by foo' not in rv.data assert b'the message by foo' not in rv.data
assert 'the message by bar' in rv.data assert b'the message by bar' in rv.data
# now let's follow foo # now let's follow foo
rv = self.app.get('/foo/follow', follow_redirects=True) rv = self.app.get('/foo/follow', follow_redirects=True)
assert 'You are now following &#34;foo&#34;' in rv.data assert b'You are now following &#34;foo&#34;' in rv.data
# we should now see foo's message # we should now see foo's message
rv = self.app.get('/') rv = self.app.get('/')
assert 'the message by foo' in rv.data assert b'the message by foo' in rv.data
assert 'the message by bar' in rv.data assert b'the message by bar' in rv.data
# but on the user's page we only want the user's message # but on the user's page we only want the user's message
rv = self.app.get('/bar') rv = self.app.get('/bar')
assert 'the message by foo' not in rv.data assert b'the message by foo' not in rv.data
assert 'the message by bar' in rv.data assert b'the message by bar' in rv.data
rv = self.app.get('/foo') rv = self.app.get('/foo')
assert 'the message by foo' in rv.data assert b'the message by foo' in rv.data
assert 'the message by bar' not in rv.data assert b'the message by bar' not in rv.data
# now unfollow and check if that worked # now unfollow and check if that worked
rv = self.app.get('/foo/unfollow', follow_redirects=True) rv = self.app.get('/foo/unfollow', follow_redirects=True)
assert 'You are no longer following &#34;foo&#34;' in rv.data assert b'You are no longer following &#34;foo&#34;' in rv.data
rv = self.app.get('/') rv = self.app.get('/')
assert 'the message by foo' not in rv.data assert b'the message by foo' not in rv.data
assert 'the message by bar' in rv.data assert b'the message by bar' in rv.data
if __name__ == '__main__': if __name__ == '__main__':

1
flask/app.py

@ -630,6 +630,7 @@ class Flask(_PackageBoundObject):
:param resource: the name of the resource. To access resources within :param resource: the name of the resource. To access resources within
subfolders use forward slashes as separator. subfolders use forward slashes as separator.
:param mode: resource file opening mode, default is 'rb'.
""" """
return open(os.path.join(self.instance_path, resource), mode) return open(os.path.join(self.instance_path, resource), mode)

1
flask/helpers.py

@ -838,6 +838,7 @@ class _PackageBoundObject(object):
:param resource: the name of the resource. To access resources within :param resource: the name of the resource. To access resources within
subfolders use forward slashes as separator. subfolders use forward slashes as separator.
:param mode: resource file opening mode, default is 'rb'.
""" """
if mode not in ('r', 'rb'): if mode not in ('r', 'rb'):
raise ValueError('Resources can only be opened for reading') raise ValueError('Resources can only be opened for reading')

Loading…
Cancel
Save