def test_list_method_filter_method_user_ids(self, monkeypatch, enrollment_test_data): site = enrollment_test_data['site'] users = enrollment_test_data['users'] caller = self.make_caller(site, users) other_site = SiteFactory() assert site.domain != other_site.domain check_user = users[0] LearnerCourseGradeMetricsFactory(site=other_site) LearnerCourseGradeMetricsFactory(site=site) # Make sure we show only for our site for the selected user LearnerCourseGradeMetricsFactory(site=other_site, user=check_user) user_lcgm = [LearnerCourseGradeMetricsFactory( site=site, user=check_user) for i in range(3)] request_path = self.base_request_path + '?user_ids=' + str(check_user.id) response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=site, caller=caller, action='list') assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check keys result_ids = [obj['id'] for obj in results] assert set(result_ids) == set([obj.id for obj in user_lcgm]) # Spot check the first record obj = LearnerCourseGradeMetrics.objects.get(id=results[0]['id']) self.check_serialized_data(results[0], obj)
def test_completed_method(self, monkeypatch, enrollment_test_data): site = enrollment_test_data['site'] users = enrollment_test_data['users'] caller = self.make_caller(site, users) other_site = SiteFactory() assert site.domain != other_site.domain # Create an LCGM record for the other site LearnerCourseGradeMetricsFactory(site=other_site, sections_worked=1, sections_possible=1) # Create an LCGM record for our site that is not completed LearnerCourseGradeMetricsFactory(site=site, sections_worked=1, sections_possible=5) completed_lcgm = [LearnerCourseGradeMetricsFactory(site=site, sections_worked=5, sections_possible=5) for i in range(3)] request_path = self.base_request_path + '/completed/' response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=site, caller=caller, action='completed') assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check keys result_ids = [obj['id'] for obj in results] assert set(result_ids) == set([obj.id for obj in completed_lcgm]) # Spot check the first record obj = LearnerCourseGradeMetrics.objects.get(id=results[0]['id']) self.check_serialized_data(results[0], obj)
def test_course_param_multiple(self, monkeypatch, enrollment_test_data): """Test that the 'course' query parameter works """ site = enrollment_test_data['site'] users = enrollment_test_data['users'] enrollments = enrollment_test_data['enrollments'] course_overviews = enrollment_test_data['course_overviews'] caller = self.make_caller(site, users) other_site = SiteFactory() assert site.domain != other_site.domain assert len(course_overviews) > 1 query_params = '?course={}&course={}'.format( str(course_overviews[0].id), str(course_overviews[1].id)) request_path = self.base_request_path + query_params response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=site, caller=caller, action='list') assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check user ids result_ids = [obj['id'] for obj in results] expected_user_ids = [obj.user.id for obj in enrollments] assert set(result_ids) == set(expected_user_ids)
def test_list_method_all(self, monkeypatch, enrollment_test_data): """Partial test coverage to check we get all site users Checks returned user ids against all user ids for the site Checks top level keys Does NOT check values in the `enrollments` key. This should be done as follow up work """ site = enrollment_test_data['site'] users = enrollment_test_data['users'] caller = self.make_caller(site, users) other_site = SiteFactory() assert site.domain != other_site.domain response = self.make_request(request_path=self.base_request_path, monkeypatch=monkeypatch, site=site, caller=caller, action='list') assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check user ids result_ids = [obj['id'] for obj in results] user_ids = get_user_ids_for_site(site=site) assert set(result_ids) == set(user_ids) # Spot check the first record top_keys = [ 'id', 'username', 'email', 'fullname', 'is_active', 'date_joined', 'enrollments' ] assert set(results[0].keys()) == set(top_keys)
def test_no_paginate(self, monkeypatch, enrollment_test_data, action): site = enrollment_test_data['site'] users = enrollment_test_data['users'] caller = self.make_caller(site, users) request_path = '{}/{}/'.format(self.base_request_path, action) monkeypatch.setattr(EnrollmentMetricsViewSet, 'paginate_queryset', lambda self, qs: None) with mock.patch.object(self.view_class, 'get_paginated_response') as paginate_check: response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=site, caller=caller, action=action) assert response.status_code == status.HTTP_200_OK assert not is_response_paginated(response.data) assert not paginate_check.called
def test_completed_ids_method(self, monkeypatch, enrollment_test_data): site = enrollment_test_data['site'] users = enrollment_test_data['users'] caller = self.make_caller(site, users) other_site = SiteFactory() assert site.domain != other_site.domain LearnerCourseGradeMetricsFactory(site=other_site, sections_worked=1, sections_possible=1) # Create an incomplete LCGM rec for our site LearnerCourseGradeMetricsFactory(site=site, sections_worked=1, sections_possible=5) completed_lcgm = [ LearnerCourseGradeMetricsFactory(site=site, sections_worked=5, sections_possible=5) for i in range(3) ] request_path = self.base_request_path + '/completed_ids/' response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=site, caller=caller, action='completed_ids') assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check that the results have our expected keys and only our expected keys res_keys_list = [elem.keys() for elem in results] results_key_set = set( [item for sublist in res_keys_list for item in sublist]) assert results_key_set == set(['course_id', 'user_id']) # Check that we have the data we're looking for results_values = [elem.values() for elem in results] expected_values = [[obj.course_id, obj.user_id] for obj in completed_lcgm] assert set(map(tuple, results_values)) == set(map(tuple, expected_values))
def test_list_method_all(self, monkeypatch, lm_test_data): """Partial test coverage to check we get all site users Checks returned user ids against all user ids for the site Checks top level keys Does NOT check values in the `enrollments` key. This should be done as follow up work """ us = lm_test_data['us'] them = lm_test_data['them'] our_courses = us['courses'] caller = make_caller(us['org']) assert us['site'].domain != them['site'].domain assert len(our_courses) > 1 response = self.make_request(request_path=self.base_request_path, monkeypatch=monkeypatch, site=us['site'], caller=caller, action='list') assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check users result_ids = [obj['id'] for obj in results] # Get all enrolled users course_keys = get_course_keys_for_site(site=us['site']) users = users_enrolled_in_courses(course_keys) user_ids = [user.id for user in users] assert set(result_ids) == set(user_ids) # Spot check the first record top_keys = [ 'id', 'username', 'email', 'fullname', 'is_active', 'date_joined', 'enrollments' ] assert set(results[0].keys()) == set(top_keys)
def test_distinct_user(self, monkeypatch, lm_test_data, query_param, field_name): """ Test data setup: We need to have a user enrolled in multiple courses We expect to have just one user record returned with each of the courses for which the user is enrolled """ # Set up data us = lm_test_data['us'] our_enrollments = us['enrollments'] caller = make_caller(us['org']) our_site_users = lm_test_data['us']['users'] our_user = our_site_users[-1] user_ce = [ rec for rec in our_enrollments if rec.user_id == our_user.id ] query_val = getattr(our_user, field_name) query_str = '?{}={}'.format(query_param, query_val) # Run test request_path = self.base_request_path + query_str response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=us['site'], caller=caller, action='list') # Check results # Continue updating here assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] found_ce_ids = set([rec['id'] for rec in results[0]['enrollments']]) assert len(results) == 1 assert results[0]['id'] == our_user.id assert found_ce_ids == set([rec.id for rec in user_ce])
def test_course_param_multiple(self, monkeypatch, lm_test_data): """Test that the 'course' query parameter works """ us = lm_test_data['us'] them = lm_test_data['them'] our_enrollments = us['enrollments'] our_courses = us['courses'] caller = make_caller(us['org']) assert us['site'].domain != them['site'].domain assert len(our_courses) > 1 filtered_courses = our_courses[:2] # TODO: build params from 'filtered_courses' query_params = '?course={}&course={}'.format(str(our_courses[0].id), str(our_courses[1].id)) request_path = self.base_request_path + query_params response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=us['site'], caller=caller, action='list') # Continue updating here assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check user ids result_ids = [obj['id'] for obj in results] expected_enrollments = filter_enrollments(enrollments=our_enrollments, courses=filtered_courses) expected_user_ids = [obj.user.id for obj in expected_enrollments] assert set(result_ids) == set(expected_user_ids) for rec in results: assert self.matching_enrollment_set_to_course_ids( rec['enrollments'], [rec.id for rec in filtered_courses])
def test_course_param_single(self, monkeypatch, lm_test_data): """Test that the 'course' query parameter works """ us = lm_test_data['us'] them = lm_test_data['them'] our_enrollments = us['enrollments'] our_courses = us['courses'] caller = make_caller(us['org']) assert us['site'].domain != them['site'].domain assert len(our_courses) > 1 query_params = '?course={}'.format(str(our_courses[0].id)) request_path = self.base_request_path + query_params response = self.make_request(request_path=request_path, monkeypatch=monkeypatch, site=us['site'], caller=caller, action='list') assert response.status_code == status.HTTP_200_OK assert is_response_paginated(response.data) results = response.data['results'] # Check user ids result_ids = [obj['id'] for obj in results] course_enrollments = [ elem for elem in our_enrollments if elem.course_id == our_courses[0].id ] expected_user_ids = [obj.user.id for obj in course_enrollments] assert set(result_ids) == set(expected_user_ids) for rec in results: assert self.matching_enrollment_set_to_course_ids( rec['enrollments'], [our_courses[0].id])