|
@ -0,0 +1,77 @@ |
|
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
|
# Copyright 2017 LasLabs Inc. |
|
|
|
|
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) |
|
|
|
|
|
|
|
|
|
|
|
from datetime import datetime |
|
|
|
|
|
from mock import patch |
|
|
|
|
|
from openerp.fields import Datetime |
|
|
|
|
|
from openerp.tests.common import TransactionCase |
|
|
|
|
|
from ..controllers.main import AuthTotpPasswordSecurity |
|
|
|
|
|
|
|
|
|
|
|
CONTROLLER_PATH = 'openerp.addons.auth_totp_password_security.controllers.main' |
|
|
|
|
|
MODEL_PATH = 'openerp.addons.password_security.models.res_users.ResUsers' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@patch(CONTROLLER_PATH + '.AuthTotp.mfa_login_post') |
|
|
|
|
|
class TestAuthTotpPasswordSecurity(TransactionCase): |
|
|
|
|
|
|
|
|
|
|
|
def setUp(self): |
|
|
|
|
|
super(TestAuthTotpPasswordSecurity, self).setUp() |
|
|
|
|
|
|
|
|
|
|
|
self.test_controller = AuthTotpPasswordSecurity() |
|
|
|
|
|
|
|
|
|
|
|
self.test_user = self.env.ref('base.user_root') |
|
|
|
|
|
self.test_user.company_id.password_expiration = 1 |
|
|
|
|
|
pass_date = datetime(year=2016, month=1, day=1) |
|
|
|
|
|
self.test_user.password_write_date = Datetime.to_string(pass_date) |
|
|
|
|
|
|
|
|
|
|
|
request_patcher = patch(CONTROLLER_PATH + '.request') |
|
|
|
|
|
self.addCleanup(request_patcher.stop) |
|
|
|
|
|
self.request_mock = request_patcher.start() |
|
|
|
|
|
self.request_mock.params = {'login_success': True} |
|
|
|
|
|
self.request_mock.uid = self.test_user.id |
|
|
|
|
|
self.request_mock.env = self.env |
|
|
|
|
|
|
|
|
|
|
|
# Needed when tests are run with no prior requests |
|
|
|
|
|
base_request_patcher = patch('openerp.http.request') |
|
|
|
|
|
self.addCleanup(base_request_patcher.stop) |
|
|
|
|
|
base_request_patcher.start() |
|
|
|
|
|
|
|
|
|
|
|
def test_mfa_login_post_no_mfa_login(self, super_mock): |
|
|
|
|
|
"""Should return result of super if MFA login not complete""" |
|
|
|
|
|
test_response = 'Test Response' |
|
|
|
|
|
super_mock.return_value = test_response |
|
|
|
|
|
self.request_mock.params = {} |
|
|
|
|
|
result = self.test_controller.mfa_login_post().get_data() |
|
|
|
|
|
|
|
|
|
|
|
self.assertEqual(result, test_response) |
|
|
|
|
|
|
|
|
|
|
|
def test_mfa_login_post_pass_not_expired(self, super_mock): |
|
|
|
|
|
"""Should return result of super if user's password not expired""" |
|
|
|
|
|
test_response = 'Test Response' |
|
|
|
|
|
super_mock.return_value = test_response |
|
|
|
|
|
self.test_user.password_write_date = Datetime.to_string(datetime.now()) |
|
|
|
|
|
result = self.test_controller.mfa_login_post().get_data() |
|
|
|
|
|
|
|
|
|
|
|
self.assertEqual(result, test_response) |
|
|
|
|
|
|
|
|
|
|
|
@patch(MODEL_PATH + '.action_expire_password') |
|
|
|
|
|
def test_mfa_login_post_expired_helper(self, helper_mock, super_mock): |
|
|
|
|
|
"""Should correctly call helper if user's password is expired""" |
|
|
|
|
|
self.test_controller.mfa_login_post() |
|
|
|
|
|
|
|
|
|
|
|
helper_mock.assert_called_once_with() |
|
|
|
|
|
|
|
|
|
|
|
def test_mfa_login_post_expired_log_out(self, super_mock): |
|
|
|
|
|
"""Should log out user and update params if password is expired""" |
|
|
|
|
|
self.test_controller.mfa_login_post() |
|
|
|
|
|
|
|
|
|
|
|
self.request_mock.session.logout.assert_called_once_with(keep_db=True) |
|
|
|
|
|
self.assertFalse(self.request_mock.params['login_success']) |
|
|
|
|
|
|
|
|
|
|
|
def test_mfa_login_post_expired_redirect(self, super_mock): |
|
|
|
|
|
"""Should return correct redirect if password is expired""" |
|
|
|
|
|
result = self.test_controller.mfa_login_post().get_data() |
|
|
|
|
|
|
|
|
|
|
|
expected = self.test_user.partner_id.signup_url |
|
|
|
|
|
self.assertIn(expected, result) |