def test_authenticated_user(self):
        # require super user permissions
        user = mixer.blend("auth.User", is_superuser=False)
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user

        with pytest.raises(PermissionDenied):
            views.start_cisco_eox_api_sync_now(request)
    def test_authenticated_user(self):
        # require super user permissions
        user = mixer.blend("auth.User", is_superuser=False)
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user

        with pytest.raises(PermissionDenied):
            views.start_cisco_eox_api_sync_now(request)
    def test_anonymous_default(self):
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = AnonymousUser()
        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url != "/productdb/task/mock_task_id"
    def test_anonymous_default(self):
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = AnonymousUser()
        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url != "/productdb/task/mock_task_id"
    def test_start_of_task(self, monkeypatch):
        """
        Test the manual schedule of a synchronization process. To avoid a multiple execution, a cache value is set
        after the process is scheduled. This cache value contains the Task ID to monitor the execution process. If
        a task is already executed, the view should redirect to the process view for the Task ID. Furthermore, a
        meta data object for the task should be created
        """
        user = mixer.blend("auth.User", is_superuser=True)

        # ensure that the task process ID is not set
        cache.delete(self.TASK_IDENTIFICATION_CACHE_VALUE)

        # get call to create task (should not run because no task backend is active at this point in time
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user
        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url == "/productdb/task/mock_task_id"
        assert get_meta_data_for_task(task_id="mock_task_id") == {
            "auto_redirect": False,
            "redirect_to": "/productdb/config/status/",
            "title": "Synchronize local database with Cisco EoX API"
        }

        # mock task schedule to raise an exception if called (verify that really the redirect works)
        def raise_exception():
            raise Exception("should never happen")

        monkeypatch.setattr(
            tasks.execute_task_to_synchronize_cisco_eox_states,
            "delay",
            lambda ignore_periodic_sync_flag: raise_exception()
        )

        # verify redirect
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user
        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url == "/productdb/task/mock_task_id"
    def test_start_of_task(self, monkeypatch):
        """
        Test the manual schedule of a synchronization process. To avoid a multiple execution, a cache value is set
        after the process is scheduled. This cache value contains the Task ID to monitor the execution process. If
        a task is already executed, the view should redirect to the process view for the Task ID. Furthermore, a
        meta data object for the task should be created
        """
        user = mixer.blend("auth.User", is_superuser=True)

        # ensure that the task process ID is not set
        cache.delete(self.TASK_IDENTIFICATION_CACHE_VALUE)

        # get call to create task (should not run because no task backend is active at this point in time
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user
        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url == "/productdb/task/mock_task_id"
        assert get_meta_data_for_task(task_id="mock_task_id") == {
            "auto_redirect": False,
            "redirect_to": "/productdb/config/status/",
            "title": "Synchronize local database with Cisco EoX API"
        }

        # mock task schedule to raise an exception if called (verify that really the redirect works)
        def raise_exception():
            raise Exception("should never happen")

        monkeypatch.setattr(
            tasks.execute_task_to_synchronize_cisco_eox_states, "delay",
            lambda ignore_periodic_sync_flag: raise_exception())

        # verify redirect
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user
        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url == "/productdb/task/mock_task_id"
    def test_superuser_access(self):
        # require super user permissions
        user = mixer.blend("auth.User", is_superuser=True)
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user

        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url == "/productdb/task/mock_task_id"
    def test_superuser_access(self):
        # require super user permissions
        user = mixer.blend("auth.User", is_superuser=True)
        url = reverse(self.URL_NAME)
        request = RequestFactory().get(url)
        request.user = user

        response = views.start_cisco_eox_api_sync_now(request)

        assert response.status_code == 302
        assert response.url == "/productdb/task/mock_task_id"