Blame tests/test_pagure_flask_ui_login.py

Pierre-Yves Chibon 0b1c13
# -*- coding: utf-8 -*-
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
"""
Pierre-Yves Chibon 0b1c13
 (c) 2016 - Copyright Red Hat Inc
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
 Authors:
Pierre-Yves Chibon 0b1c13
   Pierre-Yves Chibon <pingou@pingoured.fr>
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
"""
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
__requires__ = ['SQLAlchemy >= 0.8']
Pierre-Yves Chibon 0b1c13
import pkg_resources
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
import datetime
Pierre-Yves Chibon 0b1c13
import json
Pierre-Yves Chibon 0b1c13
import unittest
Pierre-Yves Chibon 0b1c13
import shutil
Pierre-Yves Chibon 0b1c13
import sys
Pierre-Yves Chibon 0b1c13
import tempfile
Pierre-Yves Chibon 0b1c13
import os
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
import pygit2
Pierre-Yves Chibon 0b1c13
from mock import patch
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
sys.path.insert(0, os.path.join(os.path.dirname(
Pierre-Yves Chibon 0b1c13
    os.path.abspath(__file__)), '..'))
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 6d8b89
Pierre-Yves Chibon 0b1c13
import pagure.lib
Pierre-Yves Chibon 0b1c13
import tests
Pierre-Yves Chibon 0b1c13
from pagure.lib.repo import PagureRepo
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon b94671
import pagure.ui.login
Pierre-Yves Chibon b94671
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
class PagureFlaskLogintests(tests.Modeltests):
Pierre-Yves Chibon 0b1c13
    """ Tests for flask app controller of pagure """
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
    def setUp(self):
Pierre-Yves Chibon 0b1c13
        """ Set up the environnment, ran before every tests. """
Pierre-Yves Chibon 0b1c13
        super(PagureFlaskLogintests, self).setUp()
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
        pagure.APP.config['TESTING'] = True
Pierre-Yves Chibon 0b1c13
        pagure.APP.config['EMAIL_SEND'] = True
Pierre-Yves Chibon 250169
        pagure.APP.config['PAGURE_AUTH'] = 'local'
Pierre-Yves Chibon 0b1c13
        pagure.SESSION = self.session
Pierre-Yves Chibon 0b1c13
        pagure.ui.SESSION = self.session
Pierre-Yves Chibon 0b1c13
        pagure.ui.login.SESSION = self.session
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
        self.app = pagure.APP.test_client()
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon b94671
    def test_new_user(self):
Pierre-Yves Chibon b94671
        """ Test the new_user endpoint. """
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        # Check before:
Pierre-Yves Chibon b94671
        items = pagure.lib.search_user(self.session)
Pierre-Yves Chibon b94671
        self.assertEqual(2, len(items))
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        # First access the new user page
Pierre-Yves Chibon b94671
        output = self.app.get('/user/new')
Pierre-Yves Chibon b94671
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon b94671
        self.assertIn('<title>New user - Pagure</title>', output.data)
Pierre-Yves Chibon b94671
        self.assertIn(
Pierre-Yves Chibon b94671
            '<form action="/user/new" method="post">', output.data)
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        # Create the form to send there
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        # This has all the data needed
Pierre-Yves Chibon b94671
        data = {
Pierre-Yves Chibon b94671
            'user': 'foo',
Pierre-Yves Chibon b94671
            'fullname': 'user foo',
Pierre-Yves Chibon 5f96cd
            'email_address': 'foo@bar.com',
Pierre-Yves Chibon b94671
            'password': 'barpass',
Pierre-Yves Chibon b94671
            'confirm_password': 'barpass',
Pierre-Yves Chibon b94671
        }
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        # Submit this form  -  Doesn't work since there is no csrf token
Pierre-Yves Chibon b94671
        output = self.app.post('/user/new', data=data)
Pierre-Yves Chibon b94671
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon b94671
        self.assertIn('<title>New user - Pagure</title>', output.data)
Pierre-Yves Chibon b94671
        self.assertIn(
Pierre-Yves Chibon b94671
            '<form action="/user/new" method="post">', output.data)
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        csrf_token = output.data.split(
Pierre-Yves Chibon b94671
                'name="csrf_token" type="hidden" value="')[1].split('">')[0]
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        # Submit the form with the csrf token
Pierre-Yves Chibon b94671
        data['csrf_token'] = csrf_token
Pierre-Yves Chibon b94671
        output = self.app.post('/user/new', data=data, follow_redirects=True)
Pierre-Yves Chibon b94671
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon b94671
        self.assertIn('<title>New user - Pagure</title>', output.data)
Pierre-Yves Chibon b94671
        self.assertIn(
Pierre-Yves Chibon b94671
            '<form action="/user/new" method="post">', output.data)
Pierre-Yves Chibon b94671
        self.assertIn('Username already taken.', output.data)
Pierre-Yves Chibon b94671
Pierre-Yves Chibon 5f96cd
        # Submit the form with another username
Pierre-Yves Chibon b94671
        data['user'] = 'foouser'
Pierre-Yves Chibon b94671
        output = self.app.post('/user/new', data=data, follow_redirects=True)
Pierre-Yves Chibon b94671
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon 5f96cd
        self.assertIn('<title>New user - Pagure</title>', output.data)
Pierre-Yves Chibon 5f96cd
        self.assertIn('Email address already taken.', output.data)
Pierre-Yves Chibon 5f96cd
Pierre-Yves Chibon 5f96cd
        # Submit the form with proper data
Pierre-Yves Chibon 5f96cd
        data['email_address'] = 'foo@example.com'
Pierre-Yves Chibon 5f96cd
        output = self.app.post('/user/new', data=data, follow_redirects=True)
Pierre-Yves Chibon 5f96cd
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon b94671
        self.assertIn('<title>Login - Pagure</title>', output.data)
Pierre-Yves Chibon b94671
        self.assertIn(
Pierre-Yves Chibon b94671
            'User created, please check your email to activate the account',
Pierre-Yves Chibon b94671
            output.data)
Pierre-Yves Chibon b94671
Pierre-Yves Chibon b94671
        # Check after:
Pierre-Yves Chibon b94671
        items = pagure.lib.search_user(self.session)
Pierre-Yves Chibon b94671
        self.assertEqual(3, len(items))
Pierre-Yves Chibon b94671
Pierre-Yves Chibon a4c666
    def test_do_login(self):
Pierre-Yves Chibon a4c666
        """ Test the do_login endpoint. """
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon a4c666
        output = self.app.get('/login/')
Pierre-Yves Chibon a4c666
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon a4c666
        self.assertIn('<title>Login - Pagure</title>', output.data)
Pierre-Yves Chibon a4c666
        self.assertIn(
Pierre-Yves Chibon a4c666
            '<form action="/dologin" method="post">', output.data)
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon a4c666
        # This has all the data needed
Pierre-Yves Chibon a4c666
        data = {
Pierre-Yves Chibon a4c666
            'username': 'foouser',
Pierre-Yves Chibon a4c666
            'password': 'barpass',
Pierre-Yves Chibon a4c666
        }
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon a4c666
        # Submit this form  -  Doesn't work since there is no csrf token
Pierre-Yves Chibon a4c666
        output = self.app.post('/dologin', data=data, follow_redirects=True)
Pierre-Yves Chibon a4c666
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon a4c666
        self.assertIn('<title>Login - Pagure</title>', output.data)
Pierre-Yves Chibon a4c666
        self.assertIn(
Pierre-Yves Chibon a4c666
            '<form action="/dologin" method="post">', output.data)
Pierre-Yves Chibon a4c666
        self.assertIn('Insufficient information provided', output.data)
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon a4c666
        csrf_token = output.data.split(
Pierre-Yves Chibon a4c666
                'name="csrf_token" type="hidden" value="')[1].split('">')[0]
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon a4c666
        # Submit the form with the csrf token  -  but invalid user
Pierre-Yves Chibon a4c666
        data['csrf_token'] = csrf_token
Pierre-Yves Chibon a4c666
        output = self.app.post('/dologin', data=data, follow_redirects=True)
Pierre-Yves Chibon a4c666
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon a4c666
        self.assertIn('<title>Login - Pagure</title>', output.data)
Pierre-Yves Chibon a4c666
        self.assertIn(
Pierre-Yves Chibon a4c666
            '<form action="/dologin" method="post">', output.data)
Pierre-Yves Chibon a4c666
        self.assertIn('Username or password invalid.', output.data)
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon a4c666
        # Create a local user
Pierre-Yves Chibon a4c666
        self.test_new_user()
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon a4c666
        items = pagure.lib.search_user(self.session)
Pierre-Yves Chibon a4c666
        self.assertEqual(3, len(items))
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon 3deace
        # Submit the form with the csrf token  -  but user not confirmed
Pierre-Yves Chibon a4c666
        data['csrf_token'] = csrf_token
Pierre-Yves Chibon a4c666
        output = self.app.post('/dologin', data=data, follow_redirects=True)
Pierre-Yves Chibon a4c666
        self.assertEqual(output.status_code, 200)
Pierre-Yves Chibon a4c666
        self.assertIn('<title>Login - Pagure</title>', output.data)
Pierre-Yves Chibon a4c666
        self.assertIn(
Pierre-Yves Chibon a4c666
            '<form action="/dologin" method="post">', output.data)
Pierre-Yves Chibon a4c666
        self.assertIn(
Pierre-Yves Chibon a4c666
            'Invalid user, did you confirm the creation with the url '
Pierre-Yves Chibon a4c666
            'provided by email?', output.data)
Pierre-Yves Chibon a4c666
Pierre-Yves Chibon 3deace
        # User in the DB, csrf provided  -  but wrong password submitted
farhaanbukhsh fa9239
        data['password'] = 'password'
farhaanbukhsh fa9239
        output = self.app.post('/dologin', data=data, follow_redirects=True)
farhaanbukhsh fa9239
        self.assertEqual(output.status_code, 200)
farhaanbukhsh fa9239
        self.assertIn('<title>Login - Pagure</title>', output.data)
farhaanbukhsh fa9239
        self.assertIn(
farhaanbukhsh fa9239
            '<form action="/dologin" method="post">', output.data)
farhaanbukhsh fa9239
        self.assertIn('Username or password invalid.', output.data)
farhaanbukhsh fa9239
farhaanbukhsh 66f5d8
        # When account is not confirmed i.e user_obj != None
farhaanbukhsh 66f5d8
        data['password'] = 'barpass'
farhaanbukhsh 66f5d8
        output = self.app.post('/dologin', data=data, follow_redirects=True)
farhaanbukhsh 66f5d8
        self.assertEqual(output.status_code, 200)
farhaanbukhsh 66f5d8
        self.assertIn('<title>Login - Pagure</title>', output.data)
farhaanbukhsh 66f5d8
        self.assertIn(
farhaanbukhsh 66f5d8
            '<form action="/dologin" method="post">', output.data)
farhaanbukhsh 66f5d8
        self.assertIn(
farhaanbukhsh 66f5d8
            'Invalid user, did you confirm the creation with the url '
farhaanbukhsh 66f5d8
            'provided by email?', output.data)
farhaanbukhsh fa9239
farhaanbukhsh e8867b
        # Wrong password submitted
farhaanbukhsh e8867b
        data['password'] = 'password'
farhaanbukhsh e8867b
        output = self.app.post('/dologin', data=data, follow_redirects=True)
farhaanbukhsh e8867b
        self.assertEqual(output.status_code, 200)
farhaanbukhsh e8867b
        self.assertIn('<title>Login - Pagure</title>', output.data)
farhaanbukhsh e8867b
        self.assertIn(
farhaanbukhsh e8867b
            '<form action="/dologin" method="post">', output.data)
farhaanbukhsh e8867b
        self.assertIn('Username or password invalid.', output.data)
farhaanbukhsh e8867b
farhaanbukhsh bbbe44
        # When account is not confirmed i.e user_obj != None
farhaanbukhsh bbbe44
        data['password'] = 'barpass'
farhaanbukhsh bbbe44
        output = self.app.post('/dologin', data=data, follow_redirects=True)
farhaanbukhsh bbbe44
        self.assertEqual(output.status_code, 200)
farhaanbukhsh bbbe44
        self.assertIn('<title>Login - Pagure</title>', output.data)
farhaanbukhsh bbbe44
        self.assertIn(
farhaanbukhsh bbbe44
            '<form action="/dologin" method="post">', output.data)
farhaanbukhsh bbbe44
        self.assertIn(
farhaanbukhsh bbbe44
            'Invalid user, did you confirm the creation with the url '
farhaanbukhsh bbbe44
            'provided by email?', output.data)
farhaanbukhsh e8867b
Pierre-Yves Chibon 0b1c13
Pierre-Yves Chibon 0b1c13
if __name__ == '__main__':
Pierre-Yves Chibon 0b1c13
    SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskLogintests)
Pierre-Yves Chibon 0b1c13
    unittest.TextTestRunner(verbosity=2).run(SUITE)