def test_all_courses(self):
        """
        Verifies that we can calculate over all courses
        """

        course2 = CourseFactory.create(org='foo', course='bar', run='baz')

        CourseEnrollment.enroll(self.user, course2.id)

        self.assertEqual(CourseEnrollment.objects.filter(course_id=course2.id).count(), 1)

        with patch('social_engagement.engagement._get_user_social_stats') as mock_func:
            mock_func.return_value = {
                'num_threads': 1,
                'num_comments': 1,
                'num_replies': 1,
                'num_upvotes': 1,
                'num_thread_followers': 1,
                'num_comments_generated': 1,
            }

            # update whole course and re-calc
            update_all_courses_engagement_scores()

        leaderboard = StudentSocialEngagementScore.generate_leaderboard(self.course.id)
        self.assertEqual(len(leaderboard), 2)

        leaderboard = StudentSocialEngagementScore.generate_leaderboard(course2.id)
        self.assertEqual(len(leaderboard), 1)
    def handle(self, *args, **options):
        help = "Command to creaete or update social engagement entries"
        option_list = BaseCommand.option_list + (
            make_option(
                "-c",
                "--course_ids",
                dest="course_ids",
                help="List of courses for which to generate social engagement",
                metavar="first/course/id,second/course/id"
            ),
            make_option(
                "-u",
                "--user_ids",
                dest="user_ids",
                help="List of users for which to generate social engagement",
                metavar="1234,2468,3579"
            ),
        )

        course_ids = options.get('course_ids')
        user_ids = options.get('user_ids')

        if course_ids:
            # over a few specific courses?
            for course_id in course_ids:
                if user_ids:
                    # over a few specific users in those courses?
                    for user_id in user_ids:
                        update_user_engagement_score(course_id, user_id, compute_if_closed_course=True)
                else:
                    update_course_engagement_scores(course_id, compute_if_closed_course=True)
        else:
            print 'Updating social engagement scores in all courses...'
            update_all_courses_engagement_scores(compute_if_closed_course=True)
    def test_closed_course(self, store):
        """
        Make sure we can force update closed course
        """

        course2 = CourseFactory.create(org='foo',
                                       course='bar',
                                       run='baz',
                                       end=datetime.now(pytz.UTC) -
                                       timedelta(days=1),
                                       default_store=store)

        CourseEnrollment.enroll(self.user, course2.id)
        CourseEnrollment.enroll(self.user2, course2.id)

        with patch('social_engagement.engagement._get_user_social_stats'
                   ) as mock_func:
            mock_func.return_value = {
                'num_threads': 1,
                'num_comments': 1,
                'num_replies': 1,
                'num_upvotes': 1,
                'num_thread_followers': 1,
                'num_comments_generated': 1,
            }

            # update whole course and re-calc
            update_all_courses_engagement_scores()

            # shouldn't be anything in there because course is closed
            course_avg, enrollment_count, leaderboard = StudentSocialEngagementScore.generate_leaderboard(
                course2.id)
            self.assertEqual(len(leaderboard), 0)
            self.assertEqual(course_avg, 0)

            # update whole course and re-calc
            update_all_courses_engagement_scores(compute_if_closed_course=True)

            # shouldn't be anything in there because course is closed
            course_avg, enrollment_count, leaderboard = StudentSocialEngagementScore.generate_leaderboard(
                course2.id)
            self.assertEqual(len(leaderboard), 2)
            self.assertEqual(course_avg, 85)
    def test_all_courses(self, store):
        """
        Verifies that we can calculate over all courses
        """

        course2 = CourseFactory.create(org='foo',
                                       course='bar',
                                       run='baz',
                                       default_store=store)

        CourseEnrollment.enroll(self.user, course2.id)

        self.assertEqual(
            CourseEnrollment.objects.filter(course_id=course2.id).count(), 1)

        with patch('social_engagement.engagement._get_user_social_stats'
                   ) as mock_func:
            mock_func.return_value = {
                'num_threads': 1,
                'num_comments': 1,
                'num_replies': 1,
                'num_upvotes': 1,
                'num_thread_followers': 1,
                'num_comments_generated': 1,
            }

            # update whole course and re-calc
            update_all_courses_engagement_scores()

        course_avg, enrollment_count, leaderboard = StudentSocialEngagementScore.generate_leaderboard(
            self.course.id)
        self.assertEqual(len(leaderboard), 2)
        self.assertEqual(course_avg, 85)

        course_avg, enrollment_count, leaderboard = StudentSocialEngagementScore.generate_leaderboard(
            course2.id)
        self.assertEqual(len(leaderboard), 1)
        self.assertEqual(course_avg, 85)
    def test_closed_course(self):
        """
        Make sure we can force update closed course
        """

        course2 = CourseFactory.create(
            org='foo',
            course='bar',
            run='baz',
            end=datetime.now(pytz.UTC) - timedelta(days=1)
        )

        CourseEnrollment.enroll(self.user, course2.id)
        CourseEnrollment.enroll(self.user2, course2.id)

        with patch('social_engagement.engagement._get_user_social_stats') as mock_func:
            mock_func.return_value = {
                'num_threads': 1,
                'num_comments': 1,
                'num_replies': 1,
                'num_upvotes': 1,
                'num_thread_followers': 1,
                'num_comments_generated': 1,
            }

            # update whole course and re-calc
            update_all_courses_engagement_scores()

            # shouldn't be anything in there because course is closed
            leaderboard = StudentSocialEngagementScore.generate_leaderboard(course2.id)
            self.assertEqual(len(leaderboard), 0)

            # update whole course and re-calc
            update_all_courses_engagement_scores(compute_if_closed_course=True)

            # shouldn't be anything in there because course is closed
            leaderboard = StudentSocialEngagementScore.generate_leaderboard(course2.id)
            self.assertEqual(len(leaderboard), 2)