From b3a3e39970c320e08b11ade7f12cc227832b9789 Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Tue, 25 Sep 2018 10:07:06 -0500
Subject: [PATCH] Add unit tests for superevents views

New unit tests which check whether different user classes can
access superevent detail pages and superevent file list pages,
and what information they are shown.
---
 gracedb/superevents/tests/test_access.py | 244 +++++++++++++++++++++++
 1 file changed, 244 insertions(+)
 create mode 100644 gracedb/superevents/tests/test_access.py

diff --git a/gracedb/superevents/tests/test_access.py b/gracedb/superevents/tests/test_access.py
new file mode 100644
index 000000000..64b8e5a8d
--- /dev/null
+++ b/gracedb/superevents/tests/test_access.py
@@ -0,0 +1,244 @@
+from django.conf import settings
+from django.core.files.uploadedfile import SimpleUploadedFile
+from django.urls import reverse
+
+from core.permission_utils import expose_log_to_lvem, expose_log_to_public
+from core.tests.utils import GraceDbTestBase, SignoffGroupsAndUsersSetup, \
+    AccessManagersGroupAndUserSetup
+from events.models import Label
+from superevents.utils import create_log
+from .mixins import SupereventSetup
+
+
+class TestSupereventDetailView(SignoffGroupsAndUsersSetup, 
+    AccessManagersGroupAndUserSetup, SupereventSetup, GraceDbTestBase):
+    """
+    Test who can view superevent detail pages and which
+    forms are shown
+    """
+
+    def test_internal_user_view_superevent(self):
+        """Basic internal user can view superevent detail page w/out forms"""
+        url = reverse('superevents:view',
+            args=[self.internal_superevent.superevent_id])
+
+        # Get response and check status code
+        response = self.request_as_user(url, "GET", self.internal_user)
+        self.assertEqual(response.status_code, 200)
+
+        # Test context
+        context = response.context
+        # Make sure user status is correct
+        self.assertEqual(context['user_is_internal'], True)
+        self.assertEqual(context['user_is_external'], False)
+        # GW status form not shown for basic internal user
+        self.assertEqual(context['show_gw_status_form'], False)
+        # No 'expose/hide' form for basic internal user
+        self.assertEqual(context['can_modify_permissions'], False)
+        # No signoff forms shown for basic internal user
+        self.assertEqual(context['advocate_signoff_authorized'], False)
+        self.assertEqual(context['operator_signoff_authorized'], False)
+
+    def test_H1_control_room_view_superevent(self):
+        """
+        H1 control room can see H1 operator signoff form on superevent page
+        """
+
+        # Apply H1OPS label so we can do a full test
+        h1ops = Label.objects.create(name='H1OPS')
+        self.internal_superevent.labelling_set.create(label=h1ops,
+            creator=self.internal_user)
+
+        # Get URL
+        url = reverse('superevents:view',
+            args=[self.internal_superevent.superevent_id])
+
+        # Get response and check status code
+        response = self.request_as_user(url, "GET", self.H1_user)
+        self.assertEqual(response.status_code, 200)
+
+        # Test context
+        context = response.context
+        # Make sure user status is correct
+        self.assertEqual(context['user_is_internal'], True)
+        self.assertEqual(context['user_is_external'], False)
+        # GW status form not shown for basic internal user
+        self.assertEqual(context['show_gw_status_form'], False)
+        # No 'expose/hide' form for basic internal user
+        self.assertEqual(context['can_modify_permissions'], False)
+        # Only H1 operator signoff form shown
+        self.assertEqual(context['advocate_signoff_authorized'], False)
+        self.assertEqual(context['operator_signoff_authorized'], True)
+
+        # Test signoff details
+        self.assertEqual(context['operator_signoff_active'], True)
+        self.assertEqual(context['operator_signoff_exists'], False)
+        self.assertEqual(context['operator_signoff_type'],
+            self.internal_superevent.signoff_set.model.SIGNOFF_TYPE_OPERATOR)
+        self.assertEqual(context['operator_signoff_instrument'],
+            self.internal_superevent.signoff_set.model.INSTRUMENT_H1)
+
+
+    def test_advocate_view_superevent(self):
+        """EM advocate user can see advocate signoff form on superevent page"""
+
+        # Apply H1OPS label so we can do a full test
+        advreq = Label.objects.create(name='ADVREQ')
+        self.internal_superevent.labelling_set.create(label=advreq,
+            creator=self.internal_user)
+
+        # Get URL
+        url = reverse('superevents:view',
+            args=[self.internal_superevent.superevent_id])
+
+        # Get response and check status code
+        response = self.request_as_user(url, "GET", self.adv_user)
+        self.assertEqual(response.status_code, 200)
+
+        # Test context
+        context = response.context
+        # Make sure user status is correct
+        self.assertEqual(context['user_is_internal'], True)
+        self.assertEqual(context['user_is_external'], False)
+        # GW status form not shown for basic internal user
+        self.assertEqual(context['show_gw_status_form'], False)
+        # No 'expose/hide' form for basic internal user
+        self.assertEqual(context['can_modify_permissions'], False)
+        # Only H1 operator signoff form shown
+        self.assertEqual(context['advocate_signoff_authorized'], True)
+        self.assertEqual(context['operator_signoff_authorized'], False)
+
+        # Test signoff details
+        self.assertEqual(context['advocate_signoff_active'], True)
+        self.assertEqual(context['advocate_signoff_exists'], False)
+        self.assertEqual(context['advocate_signoff_type'],
+            self.internal_superevent.signoff_set.model.SIGNOFF_TYPE_ADVOCATE)
+        self.assertEqual(context['advocate_signoff_instrument'], '')
+
+    def test_lvem_user_view_hidden_superevent(self):
+        """LV-EM user can't view hidden superevent"""
+        url = reverse('superevents:view',
+            args=[self.internal_superevent.superevent_id])
+        response = self.request_as_user(url, "GET", self.lvem_user)
+        self.assertEqual(response.status_code, 404)
+
+    def test_lvem_user_view_exposed_superevent(self):
+        """LV-EM user can view exposed superevent"""
+        url = reverse('superevents:view',
+            args=[self.lvem_superevent.superevent_id])
+
+        # Get response and check status code
+        response = self.request_as_user(url, "GET", self.lvem_user)
+        self.assertEqual(response.status_code, 200)
+
+        # Test context
+        context = response.context
+        # Make sure user status is correct
+        self.assertEqual(context['user_is_internal'], False)
+        self.assertEqual(context['user_is_external'], True)
+        # GW status form not shown for basic internal user
+        self.assertEqual(context['show_gw_status_form'], False)
+        # No 'expose/hide' form for basic internal user
+        self.assertEqual(context['can_modify_permissions'], False)
+        # No signoff forms shown for basic internal user
+        self.assertEqual(context['advocate_signoff_authorized'], False)
+
+    def test_public_user_view_hidden_superevent(self):
+        """Public user can't view hidden superevent"""
+        url = reverse('superevents:view',
+            args=[self.internal_superevent.superevent_id])
+        response = self.request_as_user(url, "GET")
+        self.assertEqual(response.status_code, 403)
+        # TODO: this will be a 404 error in the future
+
+    def test_public_user_view_exposed_superevent(self):
+        """Public user can view exposed superevent"""
+        # TODO
+        pass
+
+
+class TestSupereventFileListView(SupereventSetup, GraceDbTestBase):
+    """Test what users see in the file list for superevents"""
+
+    @classmethod
+    def setUpTestData(cls):
+        super(TestSupereventFileListView, cls).setUpTestData()
+
+        # Create files for internal and exposed superevents
+        cls.file1 = {'filename': 'file1.txt', 'content': 'test content 1'}
+        cls.file2 = {'filename': 'file2.txt', 'content': 'test content 2'}
+        for i in range(4):
+            log1 = create_log(cls.internal_user, 'upload file1',
+                cls.internal_superevent, filename=cls.file1['filename'],
+                data_file=SimpleUploadedFile.from_dict(cls.file1))
+            log2 = create_log(cls.internal_user, 'upload file2',
+                cls.internal_superevent, filename=cls.file2['filename'],
+                data_file=SimpleUploadedFile.from_dict(cls.file2))
+            log3 = create_log(cls.internal_user, 'upload file1',
+                cls.lvem_superevent, filename=cls.file1['filename'],
+                data_file=SimpleUploadedFile.from_dict(cls.file1))
+            log4 = create_log(cls.internal_user, 'upload file2',
+                cls.lvem_superevent, filename=cls.file2['filename'],
+                data_file=SimpleUploadedFile.from_dict(cls.file2))
+
+    def test_internal_user_view_superevent_files(self):
+        """Basic internal user can see all files"""
+        url = reverse('superevents:file-list',
+            args=[self.internal_superevent.superevent_id])
+
+        # Get response and check status code
+        response = self.request_as_user(url, "GET", self.internal_user)
+        self.assertEqual(response.status_code, 200)
+
+        # Loop over all logs for this superevent which have a file
+        # and make sure they are included in the list. Also check file_list
+        # length.  We have to account for symlinks, too
+        file_logs = self.internal_superevent.log_set.exclude(filename='')
+        file_list = [l.versioned_filename for l in file_logs]
+        symlinks = list(set([fl.filename for fl in file_logs]))
+        file_list.extend(symlinks)
+        self.assertEqual(len(response.context['file_list']), len(file_list))
+        for f in file_list:
+            self.assertIn(f, response.context['file_list'])
+
+    def test_lvem_user_view_files_for_hidden_superevent(self):
+        """LV-EM user can't view files for hidden superevent"""
+        url = reverse('superevents:file-list',
+            args=[self.internal_superevent.superevent_id])
+        response = self.request_as_user(url, "GET", self.lvem_user)
+        self.assertEqual(response.status_code, 404)
+
+        # Try exposing a log and make sure it's still a 404
+        log = self.internal_superevent.log_set.exclude(filename='').first()
+        expose_log_to_lvem(log)
+        response = self.request_as_user(url, "GET", self.lvem_user)
+        self.assertEqual(response.status_code, 404)
+
+
+    def test_lvem_user_view_files_for_exposed_superevent(self):
+        """LV-EM user can view exposed files for exposed superevent"""
+        # Expose a non-symlinked log
+        log = self.lvem_superevent.log_set.get(filename=self.file1['filename'],
+            file_version=1)
+        expose_log_to_lvem(log)
+ 
+        # Make request and check response
+        url = reverse('superevents:file-list',
+            args=[self.lvem_superevent.superevent_id])
+        response = self.request_as_user(url, "GET", self.lvem_user)
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(len(response.context['file_list']), 1)
+        self.assertIn(log.versioned_filename, response.context['file_list'])
+
+    def test_public_user_view_files_for_hidden_superevent(self):
+        """Public user can't view files for hidden superevent"""
+        url = reverse('superevents:file-list',
+            args=[self.internal_superevent.superevent_id])
+        response = self.request_as_user(url, "GET")
+        self.assertEqual(response.status_code, 403)
+        # TODO: this will be a 404 error in the future
+
+    def test_public_user_view_files_for_exposed_superevent(self):
+        """Public user can view exposed files for exposed superevent"""
+        # TODO
+        pass
-- 
GitLab