diff --git a/ucamlookup/tests.py b/ucamlookup/tests.py
index 29ecb4dc7119d5a49af1be13706d8c9d40b5bc65..44a0f2ecb5b86342b0c694bc84409da1f22462dd 100644
--- a/ucamlookup/tests.py
+++ b/ucamlookup/tests.py
@@ -2,9 +2,11 @@ import json
 import sys
 from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
+from mock import patch, Mock
+
 try:
     from django.core.urlresolvers import reverse
-except Exception:
+except ImportError:
     from django.urls import reverse
 from django.test import TestCase, override_settings
 from ucamlookup.models import LookupGroup
@@ -13,12 +15,12 @@ from ucamlookup.utils import user_in_groups, get_users_from_query, return_visibl
     validate_crsid_list, validate_groupid_list, get_connection
 
 
-class UcamLookupTests(TestCase):
+class UcamLookupOptionsTests(TestCase):
 
     @override_settings(UCAMLOOKUP_HOST="mock_host", UCAMLOOKUP_PORT=80, UCAMLOOKUP_URL_BASE="/mock",
                        UCAMLOOKUP_CHECK_CERTS=False, UCAMLOOKUP_USERNAME="mock_username",
                        UCAMLOOKUP_PASSWORD="mock_password")
-    def test_optional_settins(self):
+    def test_optional_settings(self):
             conn = get_connection()
             self.assertEqual(conn.host, "mock_host")
             self.assertEqual(conn.port, 80)
@@ -27,6 +29,76 @@ class UcamLookupTests(TestCase):
             self.assertEqual(conn.username, "mock_username")
             self.assertEqual(conn.password, "mock_password")
 
+
+class UcamLookupTests(TestCase):
+
+    def setUp(self):
+        # fixture for group 101888
+        mock_101888 = Mock(groupid='101888', title='CS Information Systems team')
+        # fixture for institution UIS
+        mock_uis = Mock(instid='UIS')
+        mock_uis.name = 'University Information Services'
+        # fixture for institution CL
+        mock_cl = Mock(instid='CL')
+        mock_cl.name = 'Department of Computer Science and Technology'
+
+        # patch the lookup get_connection()
+        self.patcher = patch('ucamlookup.utils.get_connection')
+        mock_get_connection = self.patcher.start()
+
+        # a mock result returned by invoke_method()
+        mock_result = Mock(error=None)
+
+        def side_effect(_, path, path_params, __, ___):
+            """
+            Side effect method that mocks the lookup connection's invoke_method() and returns a
+            mock result.
+            """
+            try:
+                path = path % path_params
+            except KeyError:
+                pass
+
+            if path == 'api/v1/person/crsid/amc203':
+                mock_result.person.visibleName = 'Dr Abraham Martin'
+            elif path == 'api/v1/person/crsid/jw35':
+                mock_result.person.visibleName = 'John Warbrick'
+            elif path == 'api/v1/person/crsid/test0001':
+                mock_result.person.visibleName = 'Test User 1'
+            elif path == 'api/v1/person/crsid/amc20311':
+                mock_result.person = None
+            elif path == 'api/v1/group/101888':
+                mock_result.group.title = 'CS Information Systems team'
+            elif path == 'api/v1/group/101923':
+                mock_result.group.title = 'UIS Finance team'
+            elif path == 'api/v1/group/203840928304982':
+                mock_result.group = None
+            elif path == 'api/v1/person/search':
+                mock_result.people = [
+                    Mock(visibleName='Dr Abraham Martin', **{'identifier.value': 'amc203'})
+                ]
+            elif path == 'api/v1/person/crsid/test0001/insts':
+                mock_result.institutions = []
+            elif path == 'api/v1/person/crsid/amc203/insts':
+                mock_result.institutions = [mock_cl]
+            elif path == 'api/v1/inst/all-insts':
+                mock_result.institutions = [mock_uis, mock_cl]
+            elif path == 'api/v1/inst/UIS':
+                mock_result.institution.name = mock_uis.name
+            elif path == 'api/v1/group/search':
+                mock_result.groups = [mock_101888]
+            elif path == 'api/v1/person/crsid/amc203/groups':
+                mock_result.groups = [mock_101888]
+            else:
+                self.fail("%s hasn't been mocked" % path)
+            return mock_result
+
+        # mock connection returned by get_connectgion()
+        mock_connection = Mock()
+        mock_connection.invoke_method.side_effect = side_effect
+
+        mock_get_connection.return_value = mock_connection
+
     def test_add_name_to_user_and_add_title_to_group(self):
         with self.assertRaises(User.DoesNotExist):
             User.objects.get(username="amc203")
@@ -93,8 +165,15 @@ class UcamLookupTests(TestCase):
     def test_get_institutions_with_user(self):
         amc203 = User.objects.create_user(username="amc203")
         results = get_institutions(user=amc203)
+        self.assertEquals(("CL", "Department of Computer Science and Technology"), results[0])
         self.assertIn(("UIS", "University Information Services"), results)
 
+    def test_get_institutions_with_non_existant_user(self):
+        all_institutions = get_institutions()
+        test0001 = User.objects.create_user(username="test0001")
+        results = get_institutions(user=test0001)
+        self.assertEqual(all_institutions, results)
+
     def test_get_institution_name_by_id(self):
         result = get_institution_name_by_id(institution_id="UIS")
         self.assertEqual("University Information Services", result)
@@ -104,11 +183,6 @@ class UcamLookupTests(TestCase):
         result = get_institution_name_by_id(institution_id="UIS", all_institutions=all_institutions)
         self.assertEqual("University Information Services", result)
 
-        test_user = User.objects.create_user(username="test0001")
-        results = get_institutions(user=test_user)
-
-        self.assertEqual(all_institutions, results)
-
     def test_views_without_login(self):
         response = self.client.get(reverse('ucamlookup_find_people'), {'query': 'amc203', 'searchId_u': '1'})
         self.assertEqual(response.status_code, 302)
@@ -190,3 +264,6 @@ class UcamLookupTests(TestCase):
 
         with self.assertRaises(ValidationError):
             validate_groupid_list(["kaskvdkam20e9mciasmdimadf"])
+
+    def tearDown(self):
+        self.patcher.stop()