ENT-188
This commit is contained in:
@@ -1084,6 +1084,9 @@ OPTIONAL_APPS = (
|
||||
|
||||
# Organizations App (http://github.com/edx/edx-organizations)
|
||||
'organizations',
|
||||
|
||||
# Enterprise App (http://github.com/edx/edx-enterprise)
|
||||
'enterprise',
|
||||
)
|
||||
|
||||
|
||||
@@ -1263,6 +1266,8 @@ USER_TASKS_MAX_AGE = timedelta(days=7)
|
||||
############## Settings for the Enterprise App ######################
|
||||
|
||||
ENTERPRISE_ENROLLMENT_API_URL = LMS_ROOT_URL + "/api/enrollment/v1/"
|
||||
ENTERPRISE_SERVICE_WORKER_USERNAME = 'enterprise_worker'
|
||||
ENTERPRISE_API_CACHE_TIMEOUT = 3600 # Value is in seconds
|
||||
|
||||
############## Settings for the Discovery App ######################
|
||||
|
||||
|
||||
@@ -7,8 +7,11 @@ from django.test.client import RequestFactory
|
||||
from django.test.utils import override_settings
|
||||
from smtplib import SMTPException
|
||||
from student.tests.factories import UserFactory
|
||||
from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory
|
||||
from openedx.features.enterprise_support.tests.mixins.enterprise import EnterpriseServiceMockMixin
|
||||
from util import views
|
||||
from zendesk import ZendeskError
|
||||
import httpretty
|
||||
import json
|
||||
import mock
|
||||
from ddt import ddt, data, unpack
|
||||
@@ -17,7 +20,11 @@ from student.tests.test_configuration_overrides import fake_get_value
|
||||
from student.tests.factories import CourseEnrollmentFactory
|
||||
|
||||
TEST_SUPPORT_EMAIL = "support@example.com"
|
||||
TEST_ZENDESK_CUSTOM_FIELD_CONFIG = {"course_id": 1234, "enrollment_mode": 5678}
|
||||
TEST_ZENDESK_CUSTOM_FIELD_CONFIG = {
|
||||
"course_id": 1234,
|
||||
"enrollment_mode": 5678,
|
||||
'enterprise_customer_name': 'enterprise_customer_name'
|
||||
}
|
||||
TEST_REQUEST_HEADERS = {
|
||||
"HTTP_REFERER": "test_referer",
|
||||
"HTTP_USER_AGENT": "test_user_agent",
|
||||
@@ -44,11 +51,12 @@ def fake_support_backend_values(name, default=None): # pylint: disable=unused-a
|
||||
ZENDESK_URL="dummy",
|
||||
ZENDESK_USER="dummy",
|
||||
ZENDESK_API_KEY="dummy",
|
||||
ZENDESK_CUSTOM_FIELDS={}
|
||||
ZENDESK_CUSTOM_FIELDS={},
|
||||
ENABLE_ENTERPRISE_INTEGRATION=False
|
||||
)
|
||||
@mock.patch("util.views.dog_stats_api")
|
||||
@mock.patch("util.views._ZendeskApi", autospec=True)
|
||||
class SubmitFeedbackTest(TestCase):
|
||||
class SubmitFeedbackTest(EnterpriseServiceMockMixin, TestCase):
|
||||
"""
|
||||
Class to test the submit_feedback function in views.
|
||||
"""
|
||||
@@ -72,6 +80,13 @@ class SubmitFeedbackTest(TestCase):
|
||||
# This does not contain issue_type nor course_id to ensure that they are optional
|
||||
self._auth_fields = {"subject": "a subject", "details": "some details"}
|
||||
|
||||
# Create a service user, because the track selection page depends on it
|
||||
UserFactory.create(
|
||||
username='enterprise_worker',
|
||||
email="enterprise_worker@example.com",
|
||||
password="edx",
|
||||
)
|
||||
|
||||
def _build_and_run_request(self, user, fields):
|
||||
"""
|
||||
Generate a request and invoke the view, returning the response.
|
||||
@@ -87,6 +102,7 @@ class SubmitFeedbackTest(TestCase):
|
||||
REMOTE_ADDR=TEST_REQUEST_HEADERS["REMOTE_ADDR"],
|
||||
SERVER_NAME=TEST_REQUEST_HEADERS["SERVER_NAME"],
|
||||
)
|
||||
req.site = SiteFactory.create()
|
||||
req.user = user
|
||||
return views.submit_feedback(req)
|
||||
|
||||
@@ -441,6 +457,69 @@ class SubmitFeedbackTest(TestCase):
|
||||
self._assert_zendesk_called(zendesk_mock_instance, ticket_id, ticket, ticket_update)
|
||||
self._assert_datadog_called(datadog_mock, datadog_tags)
|
||||
|
||||
@httpretty.activate
|
||||
@data(
|
||||
("course-v1:testOrg+testCourseNumber+testCourseRun", True),
|
||||
("course-v1:testOrg+testCourseNumber+testCourseRun", False),
|
||||
)
|
||||
@unpack
|
||||
@override_settings(ZENDESK_CUSTOM_FIELDS=TEST_ZENDESK_CUSTOM_FIELD_CONFIG, ENABLE_ENTERPRISE_INTEGRATION=True)
|
||||
def test_valid_request_auth_user_with_enterprise_info(self, course_id, enrolled, zendesk_mock_class, datadog_mock):
|
||||
"""
|
||||
Test a valid request from an authenticated user with enterprise tags.
|
||||
"""
|
||||
self.mock_enterprise_learner_api()
|
||||
zendesk_mock_instance = zendesk_mock_class.return_value
|
||||
user = self._auth_user
|
||||
|
||||
fields = self._auth_fields.copy()
|
||||
if course_id is not None:
|
||||
fields["course_id"] = course_id
|
||||
|
||||
ticket_id = 42
|
||||
zendesk_mock_instance.create_ticket.return_value = ticket_id
|
||||
|
||||
zendesk_tags = ["enterprise_learner", "LMS"]
|
||||
datadog_tags = ['learner_type:enterprise_learner']
|
||||
zendesk_custom_fields = []
|
||||
|
||||
if course_id:
|
||||
zendesk_tags.insert(0, course_id)
|
||||
datadog_tags.insert(0, "course_id:{}".format(course_id))
|
||||
zendesk_custom_fields.append({"id": TEST_ZENDESK_CUSTOM_FIELD_CONFIG["course_id"], "value": course_id})
|
||||
if enrolled is not None:
|
||||
enrollment = CourseEnrollmentFactory.create(
|
||||
user=user,
|
||||
course_id=course_id,
|
||||
is_active=enrolled
|
||||
)
|
||||
if enrollment.is_active:
|
||||
zendesk_custom_fields.append(
|
||||
{"id": TEST_ZENDESK_CUSTOM_FIELD_CONFIG["enrollment_mode"], "value": enrollment.mode}
|
||||
)
|
||||
|
||||
zendesk_custom_fields.append(
|
||||
{
|
||||
"id": TEST_ZENDESK_CUSTOM_FIELD_CONFIG["enterprise_customer_name"],
|
||||
"value": 'TestShib'
|
||||
}
|
||||
)
|
||||
|
||||
ticket = self._build_zendesk_ticket(
|
||||
recipient=TEST_SUPPORT_EMAIL,
|
||||
name=user.profile.name,
|
||||
email=user.email,
|
||||
subject=fields["subject"],
|
||||
details=fields["details"],
|
||||
tags=zendesk_tags,
|
||||
custom_fields=zendesk_custom_fields
|
||||
)
|
||||
|
||||
ticket_update = self._build_zendesk_ticket_update(TEST_REQUEST_HEADERS, user.username)
|
||||
self._test_success(user, fields)
|
||||
self._assert_zendesk_called(zendesk_mock_instance, ticket_id, ticket, ticket_update)
|
||||
self._assert_datadog_called(datadog_mock, datadog_tags)
|
||||
|
||||
def test_get_request(self, zendesk_mock_class, datadog_mock):
|
||||
"""Test that a GET results in a 405 even with all required fields"""
|
||||
req = self._request_factory.get("/submit_feedback", data=self._anon_fields)
|
||||
|
||||
@@ -23,6 +23,7 @@ from opaque_keys.edx.keys import CourseKey, UsageKey
|
||||
|
||||
from edxmako.shortcuts import render_to_response, render_to_string
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
from openedx.features.enterprise_support import api as enterprise_api
|
||||
import track.views
|
||||
from student.roles import GlobalStaff
|
||||
from student.models import CourseEnrollment
|
||||
@@ -223,7 +224,7 @@ class _ZendeskApi(object):
|
||||
return None
|
||||
|
||||
|
||||
def _get_zendesk_custom_field_context(request):
|
||||
def _get_zendesk_custom_field_context(request, **kwargs):
|
||||
"""
|
||||
Construct a dictionary of data that can be stored in Zendesk custom fields.
|
||||
"""
|
||||
@@ -241,6 +242,11 @@ def _get_zendesk_custom_field_context(request):
|
||||
if enrollment and enrollment.is_active:
|
||||
context["enrollment_mode"] = enrollment.mode
|
||||
|
||||
enterprise_learner_data = kwargs.get('learner_data', None)
|
||||
if enterprise_learner_data:
|
||||
enterprise_customer_name = enterprise_learner_data[0]['enterprise_customer']['name']
|
||||
context["enterprise_customer_name"] = enterprise_customer_name
|
||||
|
||||
return context
|
||||
|
||||
|
||||
@@ -434,6 +440,12 @@ def submit_feedback(request):
|
||||
|
||||
success = False
|
||||
context = get_feedback_form_context(request)
|
||||
|
||||
#Update the tag info with 'enterprise_learner' if the user belongs to an enterprise customer.
|
||||
enterprise_learner_data = enterprise_api.get_enterprise_learner_data(site=request.site, user=request.user)
|
||||
if enterprise_learner_data:
|
||||
context["tags"]["learner_type"] = "enterprise_learner"
|
||||
|
||||
support_backend = configuration_helpers.get_value('CONTACT_FORM_SUBMISSION_BACKEND', SUPPORT_BACKEND_ZENDESK)
|
||||
|
||||
if support_backend == SUPPORT_BACKEND_EMAIL:
|
||||
@@ -456,7 +468,7 @@ def submit_feedback(request):
|
||||
|
||||
custom_fields = None
|
||||
if settings.ZENDESK_CUSTOM_FIELDS:
|
||||
custom_field_context = _get_zendesk_custom_field_context(request)
|
||||
custom_field_context = _get_zendesk_custom_field_context(request, learner_data=enterprise_learner_data)
|
||||
custom_fields = _format_zendesk_custom_fields(custom_field_context)
|
||||
|
||||
success = _record_feedback_in_zendesk(
|
||||
|
||||
Reference in New Issue
Block a user