diff --git a/lms/djangoapps/program_enrollments/api/v1/tests/test_views.py b/lms/djangoapps/program_enrollments/api/v1/tests/test_views.py index 1531b5ee71..8ac0644a12 100644 --- a/lms/djangoapps/program_enrollments/api/v1/tests/test_views.py +++ b/lms/djangoapps/program_enrollments/api/v1/tests/test_views.py @@ -32,6 +32,7 @@ from lms.djangoapps.program_enrollments.api.v1.constants import ( ) from lms.djangoapps.program_enrollments.tests.factories import ProgramCourseEnrollmentFactory, ProgramEnrollmentFactory from lms.djangoapps.program_enrollments.models import ProgramEnrollment, ProgramCourseEnrollment +from lms.djangoapps.program_enrollments.utils import ProviderDoesNotExistException from openedx.core.djangoapps.catalog.cache import PROGRAM_CACHE_KEY_TPL from openedx.core.djangoapps.catalog.tests.factories import CourseFactory from openedx.core.djangoapps.catalog.tests.factories import OrganizationFactory as CatalogOrganizationFactory @@ -839,6 +840,38 @@ class ProgramEnrollmentViewPostTests(APITestCase): self.assertEqual(enrollment.curriculum_uuid, curriculum_uuid) self.assertEqual(enrollment.user, user) + def test_program_enrollments_no_idp(self): + program_key = uuid4() + curriculum_uuid = uuid4() + + post_data = [ + { + 'status': 'enrolled', + REQUEST_STUDENT_KEY: 'abc{}'.format(i), + 'curriculum_uuid': str(curriculum_uuid) + } for i in range(3) + ] + + url = reverse('programs_api:v1:program_enrollments', args=[program_key]) + + with mock.patch('lms.djangoapps.program_enrollments.api.v1.views.get_programs', autospec=True): + with mock.patch( + 'lms.djangoapps.program_enrollments.api.v1.views.get_user_by_program_id', + autospec=True, + side_effect=ProviderDoesNotExistException() + ): + response = self.client.post(url, json.dumps(post_data), content_type='application/json') + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + for i in range(3): + enrollment = ProgramEnrollment.objects.get(external_user_key='abc{}'.format(i)) + + self.assertEqual(enrollment.program_uuid, program_key) + self.assertEqual(enrollment.status, 'enrolled') + self.assertEqual(enrollment.curriculum_uuid, curriculum_uuid) + self.assertIsNone(enrollment.user) + def test_enrollment_payload_limit(self): post_data = [] diff --git a/lms/djangoapps/program_enrollments/api/v1/views.py b/lms/djangoapps/program_enrollments/api/v1/views.py index 28c338978a..515f7c957c 100644 --- a/lms/djangoapps/program_enrollments/api/v1/views.py +++ b/lms/djangoapps/program_enrollments/api/v1/views.py @@ -43,7 +43,7 @@ from lms.djangoapps.program_enrollments.api.v1.serializers import ( ProgramEnrollmentSerializer, ) from lms.djangoapps.program_enrollments.models import ProgramCourseEnrollment, ProgramEnrollment -from lms.djangoapps.program_enrollments.utils import get_user_by_program_id +from lms.djangoapps.program_enrollments.utils import get_user_by_program_id, ProviderDoesNotExistException from student.helpers import get_resume_urls_for_enrollments from xmodule.modulestore.django import modulestore from openedx.core.djangoapps.catalog.utils import get_programs @@ -362,10 +362,13 @@ class ProgramEnrollmentsView(DeveloperErrorViewMixin, PaginatedAPIView): for student_key, data in student_data.items(): curriculum_uuid = data['curriculum_uuid'] - existing_user = get_user_by_program_id(student_key, program_uuid) - if existing_user: - data['user'] = existing_user.id + try: + existing_user = get_user_by_program_id(student_key, program_uuid) + if existing_user: + data['user'] = existing_user.id + except ProviderDoesNotExistException: + pass # IDP has not yet been set up, just create waiting enrollments serializer = ProgramEnrollmentSerializer(data=data) if serializer.is_valid():