From 1f5f1e04602abfde0d1a26904f97890ce0e64b6c Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 30 Apr 2017 08:34:17 +0530 Subject: [PATCH] utils: Write tests for checking is user admin Signed-off-by: Sunil Mohan Adapa --- plinth/tests/test_context_processors.py | 3 - plinth/tests/test_utils.py | 83 +++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 plinth/tests/test_utils.py diff --git a/plinth/tests/test_context_processors.py b/plinth/tests/test_context_processors.py index 819923d5b..e8c4e737f 100644 --- a/plinth/tests/test_context_processors.py +++ b/plinth/tests/test_context_processors.py @@ -56,9 +56,6 @@ class ContextProcessorsTestCase(TestCase): self.assertEqual(['/', '/aaa/', '/aaa/bbb/', '/aaa/bbb/ccc/'], urls) self.assertTrue(response['user_is_admin']) - request.user.groups.filter().exists = Mock(return_value=False) - response = cp.common(request) - self.assertFalse(response['user_is_admin']) def test_common_border_conditions(self): """Verify that the common() function works for border conditions.""" diff --git a/plinth/tests/test_utils.py b/plinth/tests/test_utils.py new file mode 100644 index 000000000..514126805 --- /dev/null +++ b/plinth/tests/test_utils.py @@ -0,0 +1,83 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Test module for Plinth's utilities. +""" + +from unittest.mock import Mock, MagicMock + +from django.test import TestCase +from django.test.client import RequestFactory + +from plinth.utils import is_user_admin + + +class TestIsAdminUser(TestCase): + """Test class for is_user_admin utility.""" + + def setUp(self): + """Setup each test case befor execution.""" + request = RequestFactory().get('/plinth/mockapp') + request.user = Mock() + request.session = MagicMock() + self.request = request + + def test_is_false_for_anonymous_user(self): + """Test anonymous user is reported as non-admin.""" + super(TestIsAdminUser, self).setUp() + self.request.user = Mock() + self.request.user.is_authenticated.return_value = False + self.assertFalse(is_user_admin(self.request)) + self.assertFalse(is_user_admin(self.request, cached=True)) + + def test_values_for_authenticated_users(self): + """Test correct return values for authenticated users.""" + self.request.user.groups.filter().exists = Mock(return_value=False) + self.assertFalse(is_user_admin(self.request)) + self.request.user.groups.filter().exists = Mock(return_value=True) + self.assertTrue(is_user_admin(self.request)) + + def test_caching_of_values(self): + """Test that caching of values for authenticate users.""" + session_mock = MagicMock() + session_dict = {} + session_mock.__setitem__.side_effect = session_dict.__setitem__ + session_mock.__getitem__.side_effect = session_dict.__getitem__ + session_mock.__contains__.side_effect = session_dict.__contains__ + self.request.session = session_mock + + mock = Mock(return_value=False) + self.request.user.groups.filter().exists = mock + self.assertFalse(is_user_admin(self.request)) + mock.assert_called_once_with() + session_mock.__setitem__.assert_called_once_with( + 'cache_user_is_admin', False) + + mock = Mock(return_value=False) + self.request.user.groups.filter().exists = mock + self.assertFalse(is_user_admin(self.request, cached=True)) + mock.assert_not_called() + session_mock.__getitem__.assert_called_once_with( + 'cache_user_is_admin') + + mock = Mock(return_value=False) + self.request.user.groups.filter().exists = mock + self.assertFalse(is_user_admin(self.request, cached=False)) + mock.assert_called_once_with() + session_mock.__getitem__.assert_called_once_with( + 'cache_user_is_admin')