Example #1
0
    def test_get_course_schedules(self):
        # GIVEN
        user1 = userhelper.given_a_user_exists()
        user2 = userhelper.given_a_user_exists_and_is_authenticated(
            self.client, username='******', email='*****@*****.**')
        course_group1 = coursegrouphelper.given_course_group_exists(user1)
        course_group2 = coursegrouphelper.given_course_group_exists(user2)
        course_group3 = coursegrouphelper.given_course_group_exists(user2)
        course1 = coursehelper.given_course_exists(course_group1)
        course2 = coursehelper.given_course_exists(course_group2)
        course3 = coursehelper.given_course_exists(course_group3)
        course4 = coursehelper.given_course_exists(course_group3)
        courseschedulehelper.given_course_schedule_exists(course1)
        courseschedulehelper.given_course_schedule_exists(course2)
        courseschedulehelper.given_course_schedule_exists(course3)
        courseschedulehelper.given_course_schedule_exists(course4)
        courseschedulehelper.given_course_schedule_exists(course4)

        # WHEN
        response = self.client.get(
            reverse('planner_coursegroups_courses_courseschedules_list',
                    kwargs={
                        'course_group': course_group3.pk,
                        'course': course4.pk
                    }))

        # THEN
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(CourseSchedule.objects.count(), 5)
        self.assertEqual(len(response.data), 2)
    def test_get_course_schedule_cached(self):
        # GIVEN
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        courseschedulehelper.given_course_schedule_exists(course)

        # WHEN
        response_db = self.client.get(reverse('planner_resource_courseschedules_events',
                                              kwargs={'course_group': course_group.pk, 'course': course.pk}))
        with mock.patch('helium.planner.services.coursescheduleservice._create_events_from_course_schedules') as \
                _create_events_from_course_schedules_mock:
            response_cached = self.client.get(reverse('planner_resource_courseschedules_events',
                                                      kwargs={'course_group': course_group.pk, 'course': course.pk}))

            # THEN
            self.assertEqual(_create_events_from_course_schedules_mock.call_count, 0)
            self.assertEqual(len(response_cached.data), len(response_db.data))
            cached_event = [e for e in response_cached.data if e['id'] == response_db.data[0]['id']]
            self.assertTrue(len(cached_event) == 1)
            self.assertEqual(cached_event[0]['title'], response_db.data[0]['title'])
            self.assertEqual(cached_event[0]['start'], response_db.data[0]['start'])
            self.assertEqual(cached_event[0]['end'], response_db.data[0]['end'])
            self.assertEqual(cached_event[0]['all_day'], response_db.data[0]['all_day'])
            self.assertEqual(cached_event[0]['show_end_time'], response_db.data[0]['show_end_time'])
            self.assertEqual(cached_event[0]['comments'], response_db.data[0]['comments'])
    def test_get_course_schedule_as_events(self):
        # GIVEN
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        courseschedulehelper.given_course_schedule_exists(course)

        # WHEN
        response = self.client.get(
            reverse('planner_resource_courseschedules_events',
                    kwargs={
                        'course_group': course_group.pk,
                        'course': course.pk
                    }))

        # THEN
        self.assertEqual(len(response.data), 53)
        self.assertEqual(response.data[0]['title'], course.title)
        self.assertEqual(response.data[0]['start'], '2017-01-06T10:30:00Z')
        self.assertEqual(response.data[0]['end'], '2017-01-06T13:00:00Z')
        self.assertEqual(response.data[0]['all_day'], False)
        self.assertEqual(response.data[0]['show_end_time'], True)
        self.assertEqual(
            response.data[0]['comments'],
            '<a href="{}">{}</a> in {}'.format(course.website, course.title,
                                               course.room))
Example #4
0
    def test_export_success(self):
        # GIVEN
        user1 = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        user2 = userhelper.given_a_user_exists(username='******', email='*****@*****.**')
        external_calendar = externalcalendarhelper.given_external_calendar_exists(user1)
        event1 = eventhelper.given_event_exists(user1)
        event2 = eventhelper.given_event_exists(user1)
        eventhelper.given_event_exists(user2)
        course_group1 = coursegrouphelper.given_course_group_exists(user1)
        course_group2 = coursegrouphelper.given_course_group_exists(user1)
        course_group3 = coursegrouphelper.given_course_group_exists(user2)
        course1 = coursehelper.given_course_exists(course_group1, room='')
        course2 = coursehelper.given_course_exists(course_group2)
        course3 = coursehelper.given_course_exists(course_group3)
        course_schedule1 = courseschedulehelper.given_course_schedule_exists(course1)
        course_schedule2 = courseschedulehelper.given_course_schedule_exists(course2)
        courseschedulehelper.given_course_schedule_exists(course3)
        category1 = categoryhelper.given_category_exists(course1, title='Uncategorized')
        category2 = categoryhelper.given_category_exists(course2)
        category3 = categoryhelper.given_category_exists(course3)
        material_group1 = materialgrouphelper.given_material_group_exists(user1)
        material_group2 = materialgrouphelper.given_material_group_exists(user2)
        material1 = materialhelper.given_material_exists(material_group1)
        materialhelper.given_material_exists(material_group2)
        homework1 = homeworkhelper.given_homework_exists(course1, category=category1, completed=True,
                                                         current_grade="20/30", materials=[material1])
        homework2 = homeworkhelper.given_homework_exists(course2, category=category2, current_grade="-1/100")
        homeworkhelper.given_homework_exists(course3, category=category3, completed=True, current_grade="-1/100")
        reminder = reminderhelper.given_reminder_exists(user1, homework=homework1)

        # WHEN
        response = self.client.get(reverse('importexport_resource_export'))
        data = json.loads(response.content.decode('utf-8'))

        # THEN
        course_group1 = CourseGroup.objects.get(pk=course_group1.pk)
        course_group2 = CourseGroup.objects.get(pk=course_group2.pk)
        course1 = Course.objects.get(pk=course1.pk)
        course2 = Course.objects.get(pk=course2.pk)
        category1 = Category.objects.get(pk=category1.pk)
        category2 = Category.objects.get(pk=category2.pk)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        externalcalendarhelper.verify_externalcalendar_matches_data(self, external_calendar,
                                                                    data['external_calendars'][0])
        eventhelper.verify_event_matches_data(self, event1, data['events'][0])
        eventhelper.verify_event_matches_data(self, event2, data['events'][1])
        coursegrouphelper.verify_course_group_matches_data(self, course_group1, data['course_groups'][0])
        coursegrouphelper.verify_course_group_matches_data(self, course_group2, data['course_groups'][1])
        coursehelper.verify_course_matches_data(self, course1, data['courses'][0])
        coursehelper.verify_course_matches_data(self, course2, data['courses'][1])
        courseschedulehelper.verify_course_schedule_matches(self, course_schedule1, data['course_schedules'][0])
        courseschedulehelper.verify_course_schedule_matches(self, course_schedule2, data['course_schedules'][1])
        categoryhelper.verify_category_matches_data(self, category1, data['categories'][1])
        categoryhelper.verify_category_matches_data(self, category2, data['categories'][0])
        homeworkhelper.verify_homework_matches_data(self, homework1, data['homework'][0])
        homeworkhelper.verify_homework_matches_data(self, homework2, data['homework'][1])
        reminderhelper.verify_reminder_matches_data(self, reminder, data['reminders'][0])
    def test_error_on_object_owned_by_another_user(self):
        # GIVEN
        user1 = userhelper.given_a_user_exists()
        userhelper.given_a_user_exists_and_is_authenticated(
            self.client, username='******', email='*****@*****.**')
        course_group = coursegrouphelper.given_course_group_exists(user1)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(
            course)

        # WHEN
        responses = [
            self.client.get(
                reverse('planner_resource_courseschedules_events',
                        kwargs={
                            'course_group': course_group.pk,
                            'course': course.pk
                        }))
        ]

        # THEN
        self.assertTrue(
            CourseSchedule.objects.filter(
                pk=course_schedule.pk,
                course__course_group__user_id=user1.pk).exists())
        for response in responses:
            if isinstance(response.data, list):
                self.assertEqual(len(response.data), 0)
            else:
                self.assertEqual(response.status_code,
                                 status.HTTP_404_NOT_FOUND)
    def test_course_schedule_cache_cleared_when_course_changed(
            self, get_many_mock):
        # GIVEN
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(
            course)
        self.client.get(
            reverse('planner_resource_courseschedules_events',
                    kwargs={
                        'course_group': course_group.pk,
                        'course': course.pk
                    }))
        self.assertEqual(get_many_mock.call_count, 0)

        # WHEN
        course.start_date = datetime.date(2017, 1, 2)
        course.save()

        course_schedule.mon_start_time = datetime.time(2, 00, 0)
        course_schedule.save()

        self.client.get(
            reverse('planner_resource_courseschedules_events',
                    kwargs={
                        'course_group': course_group.pk,
                        'course': course.pk
                    }))

        # THEN
        self.assertEqual(get_many_mock.call_count, 0)
    def test_courseschedules_feed(self):
        # GIVEN
        user1 = userhelper.given_a_user_exists()
        user1.settings.enable_private_slug()
        user2 = userhelper.given_a_user_exists(username='******', email='*****@*****.**')
        user2.settings.enable_private_slug()
        course_group1 = coursegrouphelper.given_course_group_exists(user1)
        course_group2 = coursegrouphelper.given_course_group_exists(user1)
        course_group3 = coursegrouphelper.given_course_group_exists(user2)
        course1 = coursehelper.given_course_exists(course_group1, room='SSC 123')
        course2 = coursehelper.given_course_exists(course_group2)
        course3 = coursehelper.given_course_exists(course_group3)
        courseschedulehelper.given_course_schedule_exists(course1)
        courseschedulehelper.given_course_schedule_exists(course2)
        courseschedulehelper.given_course_schedule_exists(course3)

        # WHEN
        response = self.client.get(
            reverse("feed_private_courseschedules_ical", kwargs={"slug": user1.settings.private_slug}))

        # THEN
        calendar = icalendar.Calendar.from_ical(response.content.decode('utf-8'))
        self.assertEqual(len(calendar.subcomponents), 106)
        self.assertEqual(calendar.subcomponents[0]['SUMMARY'], course1.title)
        self.assertEqual(str(calendar.subcomponents[0]['DTSTART'].dt), '2017-01-06 02:30:00-08:00')
        self.assertEqual(str(calendar.subcomponents[0]['DTEND'].dt), '2017-01-06 05:00:00-08:00')
        self.assertEqual(calendar.subcomponents[0]['DESCRIPTION'],
                         f'Comments: <a href="{course1.website}">{course1.title}</a> in {course1.room}')
Example #8
0
    def test_get_end_time_for_weekday(self):
        # GIVEN
        user = userhelper.given_a_user_exists()
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(course, days_of_week='1111111',
                                                                            sun_end_time=datetime.time(3, 0, 0),
                                                                            mon_end_time=datetime.time(3, 0, 1),
                                                                            tue_end_time=datetime.time(3, 0, 2),
                                                                            wed_end_time=datetime.time(3, 0, 3),
                                                                            thu_end_time=datetime.time(3, 0, 4),
                                                                            fri_end_time=datetime.time(3, 0, 5),
                                                                            sat_end_time=datetime.time(3, 0, 6))

        # WHEN
        day_0 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 0)
        day_1 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 1)
        day_2 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 2)
        day_3 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 3)
        day_4 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 4)
        day_5 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 5)
        day_6 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 6)

        # THEN
        self.assertEqual(day_0, datetime.time(3, 0, 0))
        self.assertEqual(day_1, datetime.time(3, 0, 1))
        self.assertEqual(day_2, datetime.time(3, 0, 2))
        self.assertEqual(day_3, datetime.time(3, 0, 3))
        self.assertEqual(day_4, datetime.time(3, 0, 4))
        self.assertEqual(day_5, datetime.time(3, 0, 5))
        self.assertEqual(day_6, datetime.time(3, 0, 6))
        self.assertRaises(HeliumCourseScheduleError,
                          coursescheduleservice._get_end_time_for_weekday, course_schedule, 7)

        # WHEN
        course_schedule.days_of_week = '1011111'
        course_schedule.save()
        day_0 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 0)
        day_1 = coursescheduleservice._get_end_time_for_weekday(course_schedule, 1)

        # THEN
        self.assertIsNotNone(day_0)
        self.assertIsNone(day_1)
Example #9
0
    def test_update_course_schedule_by_id(self):
        # GIVEN
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(
            course)

        # WHEN
        data = {
            'days_of_week': '0001000',
            'wed_start_time': '18:30:00',
            'wed_end_time': '19:30:00',
            # These fields are set to their defaults
            'sun_start_time': '12:00:00',
            'sun_end_time': '12:00:00',
            'mon_start_time': '12:00:00',
            'mon_end_time': '12:00:00',
            'tue_start_time': '12:00:00',
            'tue_end_time': '12:00:00',
            'thu_start_time': '12:00:00',
            'thu_end_time': '12:00:00',
            'fri_start_time': '12:00:00',
            'fri_end_time': '12:00:00',
            'sat_start_time': '12:00:00',
            'sat_end_time': '12:00:00',
        }
        response = self.client.put(reverse(
            'planner_coursegroups_courses_courseschedules_detail',
            kwargs={
                'course_group': course_group.pk,
                'course': course.pk,
                'pk': course_schedule.pk
            }),
                                   json.dumps(data),
                                   content_type='application/json')

        # THEN
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertDictContainsSubset(data, response.data)
        course_schedule = CourseSchedule.objects.get(pk=course_schedule.pk)
        courseschedulehelper.verify_course_schedule_matches(
            self, course_schedule, response.data)
Example #10
0
    def test_delete_course_schedule_by_id(self):
        # GIVEN
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(
            course)

        # WHEN
        response = self.client.delete(
            reverse('planner_coursegroups_courses_courseschedules_detail',
                    kwargs={
                        'course_group': course_group.pk,
                        'course': course.pk,
                        'pk': course_schedule.pk
                    }))

        # THEN
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertFalse(
            CourseSchedule.objects.filter(pk=course_group.pk).exists())
        self.assertEqual(CourseSchedule.objects.count(), 0)
Example #11
0
    def test_get_course_schedule_by_id(self):
        # GIVEN
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(
            course)

        # WHEN
        response = self.client.get(
            reverse('planner_coursegroups_courses_courseschedules_detail',
                    kwargs={
                        'course_group': course_group.pk,
                        'course': course.pk,
                        'pk': course_schedule.pk
                    }))

        # THEN
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        course_schedule = CourseSchedule.objects.get(pk=course_schedule.pk)
        courseschedulehelper.verify_course_schedule_matches(
            self, course_schedule, response.data)
Example #12
0
    def test_update_bad_data(self):
        # GIVEN
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(
            course)

        # WHEN
        data = {'sun_start_time': 'not-a-valid-time'}
        response = self.client.put(reverse(
            'planner_coursegroups_courses_courseschedules_detail',
            kwargs={
                'course_group': course_group.pk,
                'course': course.pk,
                'pk': course_schedule.pk
            }),
                                   json.dumps(data),
                                   content_type='application/json')

        # THEN
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertIn('sun_start_time', response.data)
Example #13
0
    def test_not_found(self):
        user = userhelper.given_a_user_exists_and_is_authenticated(self.client)
        course_group = coursegrouphelper.given_course_group_exists(user)
        course = coursehelper.given_course_exists(course_group)
        course_schedule = courseschedulehelper.given_course_schedule_exists(
            course)

        responses = [
            self.client.get(
                reverse('planner_coursegroups_courses_courseschedules_list',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999'
                        })),
            self.client.post(
                reverse('planner_coursegroups_courses_courseschedules_list',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999'
                        })),
            self.client.get(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999',
                            'pk': '9999'
                        })),
            self.client.put(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999',
                            'pk': '9999'
                        })),
            self.client.delete(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999',
                            'pk': '9999'
                        })),
            self.client.get(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': course_group.pk,
                            'course': '9999',
                            'pk': '9999'
                        })),
            self.client.put(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': course_group.pk,
                            'course': '9999',
                            'pk': '9999'
                        })),
            self.client.delete(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': course_group.pk,
                            'course': '9999',
                            'pk': '9999'
                        })),
            self.client.get(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': course.pk,
                            'pk': '9999'
                        })),
            self.client.put(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': course.pk,
                            'pk': '9999'
                        })),
            self.client.delete(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': course.pk,
                            'pk': '9999'
                        })),
            self.client.get(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999',
                            'pk': course_schedule.pk
                        })),
            self.client.put(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999',
                            'pk': course_schedule.pk
                        })),
            self.client.delete(
                reverse('planner_coursegroups_courses_courseschedules_detail',
                        kwargs={
                            'course_group': '9999',
                            'course': '9999',
                            'pk': course_schedule.pk
                        }))
        ]

        for response in responses:
            if isinstance(response.data, list):
                self.assertEqual(response.status_code, status.HTTP_200_OK)
                self.assertEqual(len(response.data), 0)
            else:
                self.assertEqual(response.status_code,
                                 status.HTTP_404_NOT_FOUND)
                self.assertIn('not found', response.data['detail'].lower())