Search code examples
pythonflaskflask-migrateflask-testing

how can test u=g.user in Flask


Lets say I have flask Application Now I want to test u=g.user.be_friend(user) which make a user friend with eachother if they werene't friend befor But I don't know how I can test g.user and most importantly g.user.be_friend would you please help thanx ?

view.py:

    user = Users.query.filter_by(name = name).first()
    if user is None:
        flash('User %s not found.' % name)
        return redirect(url_for('layout.user'))
    if user == g.user:
        flash('You can\'t Friend yourself!')
        return redirect(url_for('layout.user',page=1, sortby='normal'))
    u = g.user.be_friend(user)

mytest_app.py:

def test_friend_main(self):
        e1 = Users(name='admine1', email='[email protected]', age=25)
        e2 = Users(name='teste2', email='[email protected]', age=27)
        db.session.add_all([e1, e2])
        db.session.commit()
        with self.client:
            self.assertTrue(g.user =='admine1')

        e1.be_friend(e2)
        response=self.client.get('/friend/admine1', follow_redirects=True)
        self.assertTrue('You are now Friend with !',response.data)

Solution

  • You need flask-login module.

    from flask.ext.login import current_user
    
    @lm.user_loader   # you should have same function
    def load_user(user_id):
       return User.get_user(user_id)
    
    @flask_app.before_request
    def before_request():
        g.user = current_user # save current user in request context.
    

    Sadly, but I didn't find any easy way to get current g value in test code. Only hard way with test_request_context. Anyway, you can test current_user, if it passed to template:

    def test_something(self)
         self.assertEqual(self.get_context_variable('current_user').name, name_should_be)
    

    But at first, you should login:

    response = self.client.post('/login', data=dict(name='admine1', email='[email protected]'))
    

    User model can be improved: class User(UserMixin, db.Model):

    Also, in test you shouldn't execute e1.be_friend(e2) directly. You should execute it from your production code.