mirror of https://github.com/pallets/flask.git
				
				
				
			
		
			
	
	
		
			152 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
|  | # -*- coding: utf-8 -*- | ||
|  | """
 | ||
|  |     MiniTwit Tests | ||
|  |     ~~~~~~~~~~~~~~ | ||
|  | 
 | ||
|  |     Tests the MiniTwit application. | ||
|  | 
 | ||
|  |     :copyright: (c) 2014 by Armin Ronacher. | ||
|  |     :license: BSD, see LICENSE for more details. | ||
|  | """
 | ||
|  | import os | ||
|  | import minitwit | ||
|  | import tempfile | ||
|  | import pytest | ||
|  | 
 | ||
|  | 
 | ||
|  | @pytest.fixture | ||
|  | def client(request): | ||
|  |     db_fd, minitwit.app.config['DATABASE'] = tempfile.mkstemp() | ||
|  |     client = minitwit.app.test_client() | ||
|  |     with minitwit.app.app_context(): | ||
|  |         minitwit.init_db() | ||
|  | 
 | ||
|  |     def teardown(): | ||
|  |         """Get rid of the database again after each test.""" | ||
|  |         os.close(db_fd) | ||
|  |         os.unlink(minitwit.app.config['DATABASE']) | ||
|  |     request.addfinalizer(teardown) | ||
|  |     return client | ||
|  | 
 | ||
|  | 
 | ||
|  | def register(client, username, password, password2=None, email=None): | ||
|  |     """Helper function to register a user""" | ||
|  |     if password2 is None: | ||
|  |         password2 = password | ||
|  |     if email is None: | ||
|  |         email = username + '@example.com' | ||
|  |     return client.post('/register', data={ | ||
|  |         'username':     username, | ||
|  |         'password':     password, | ||
|  |         'password2':    password2, | ||
|  |         'email':        email, | ||
|  |     }, follow_redirects=True) | ||
|  | 
 | ||
|  | 
 | ||
|  | def login(client, username, password): | ||
|  |     """Helper function to login""" | ||
|  |     return client.post('/login', data={ | ||
|  |         'username': username, | ||
|  |         'password': password | ||
|  |     }, follow_redirects=True) | ||
|  | 
 | ||
|  | 
 | ||
|  | def register_and_login(client, username, password): | ||
|  |     """Registers and logs in in one go""" | ||
|  |     register(client, username, password) | ||
|  |     return login(client, username, password) | ||
|  | 
 | ||
|  | 
 | ||
|  | def logout(client): | ||
|  |     """Helper function to logout""" | ||
|  |     return client.get('/logout', follow_redirects=True) | ||
|  | 
 | ||
|  | 
 | ||
|  | def add_message(client, text): | ||
|  |     """Records a message""" | ||
|  |     rv = client.post('/add_message', data={'text': text}, | ||
|  |                      follow_redirects=True) | ||
|  |     if text: | ||
|  |         assert b'Your message was recorded' in rv.data | ||
|  |     return rv | ||
|  | 
 | ||
|  | 
 | ||
|  | def test_register(client): | ||
|  |     """Make sure registering works""" | ||
|  |     rv = register(client, 'user1', 'default') | ||
|  |     assert b'You were successfully registered ' \ | ||
|  |            b'and can login now' in rv.data | ||
|  |     rv = register(client, 'user1', 'default') | ||
|  |     assert b'The username is already taken' in rv.data | ||
|  |     rv = register(client, '', 'default') | ||
|  |     assert b'You have to enter a username' in rv.data | ||
|  |     rv = register(client, 'meh', '') | ||
|  |     assert b'You have to enter a password' in rv.data | ||
|  |     rv = register(client, 'meh', 'x', 'y') | ||
|  |     assert b'The two passwords do not match' in rv.data | ||
|  |     rv = register(client, 'meh', 'foo', email='broken') | ||
|  |     assert b'You have to enter a valid email address' in rv.data | ||
|  | 
 | ||
|  | 
 | ||
|  | def test_login_logout(client): | ||
|  |     """Make sure logging in and logging out works""" | ||
|  |     rv = register_and_login(client, 'user1', 'default') | ||
|  |     assert b'You were logged in' in rv.data | ||
|  |     rv = logout(client) | ||
|  |     assert b'You were logged out' in rv.data | ||
|  |     rv = login(client, 'user1', 'wrongpassword') | ||
|  |     assert b'Invalid password' in rv.data | ||
|  |     rv = login(client, 'user2', 'wrongpassword') | ||
|  |     assert b'Invalid username' in rv.data | ||
|  | 
 | ||
|  | 
 | ||
|  | def test_message_recording(client): | ||
|  |     """Check if adding messages works""" | ||
|  |     register_and_login(client, 'foo', 'default') | ||
|  |     add_message(client, 'test message 1') | ||
|  |     add_message(client, '<test message 2>') | ||
|  |     rv = client.get('/') | ||
|  |     assert b'test message 1' in rv.data | ||
|  |     assert b'<test message 2>' in rv.data | ||
|  | 
 | ||
|  | 
 | ||
|  | def test_timelines(client): | ||
|  |     """Make sure that timelines work""" | ||
|  |     register_and_login(client, 'foo', 'default') | ||
|  |     add_message(client, 'the message by foo') | ||
|  |     logout(client) | ||
|  |     register_and_login(client, 'bar', 'default') | ||
|  |     add_message(client, 'the message by bar') | ||
|  |     rv = client.get('/public') | ||
|  |     assert b'the message by foo' in rv.data | ||
|  |     assert b'the message by bar' in rv.data | ||
|  | 
 | ||
|  |     # bar's timeline should just show bar's message | ||
|  |     rv = client.get('/') | ||
|  |     assert b'the message by foo' not in rv.data | ||
|  |     assert b'the message by bar' in rv.data | ||
|  | 
 | ||
|  |     # now let's follow foo | ||
|  |     rv = client.get('/foo/follow', follow_redirects=True) | ||
|  |     assert b'You are now following "foo"' in rv.data | ||
|  | 
 | ||
|  |     # we should now see foo's message | ||
|  |     rv = client.get('/') | ||
|  |     assert b'the message by foo' 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 | ||
|  |     rv = client.get('/bar') | ||
|  |     assert b'the message by foo' not in rv.data | ||
|  |     assert b'the message by bar' in rv.data | ||
|  |     rv = client.get('/foo') | ||
|  |     assert b'the message by foo' in rv.data | ||
|  |     assert b'the message by bar' not in rv.data | ||
|  | 
 | ||
|  |     # now unfollow and check if that worked | ||
|  |     rv = client.get('/foo/unfollow', follow_redirects=True) | ||
|  |     assert b'You are no longer following "foo"' in rv.data | ||
|  |     rv = client.get('/') | ||
|  |     assert b'the message by foo' not in rv.data | ||
|  |     assert b'the message by bar' in rv.data |