Flask-Login using pytest

Viewed 846

I am trying to make a test suite that logs into to my flask app, but it always returns an anonymous user. Here is my code:

conftest.py:

import pytest
from wahoo_connect import init_app, db
from wahoo_connect.models import User

from dotenv import load_dotenv
load_dotenv('.flaskenv')

@pytest.fixture(scope='module')
def app():
    app = init_app()
    with app.app_context():
        db.create_all()
        user = User(username='testuser', email='test@gmail.com', forename='Test', surname='User', confirmed=True)
        user.set_password('testing')
        db.session.add(user)
        db.session.commit()
        yield app

@pytest.fixture(scope='module')
def client(app):
    return app.test_client()

The test:

def test_index_page__logged_in(client):
    with client:
        client.post('/auth/login', data=dict(username='testuser', password='testing'), follow_redirects=True)
        assert current_user.username == 'testuser'

and my login route:

@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    # Login route logic goes here
    if current_user.is_authenticated:
        return redirect(url_for('home_bp.index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password', 'warning')
            return redirect(url_for('auth_bp.login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('home_bp.index')
        return redirect(next_page)
    return render_template('auth/login.html', title='Sign In', form=form)

The test suite is harder to write than the code!

1 Answers

You could write a function to login

def login(client):
    """Login helper function"""
    return client.post(
        "auth/login",
        data=dict(username='testuser', password='testing'), 
        follow_redirects=True
    )
Related