Esempio n. 1
0
    def setUp(self):
        self.test_profile = UserProfile.objects.create(name="TestUser",
                                                       email="*****@*****.**",
                                                       roll_no="10000001",
                                                       ldap_id='ldap')
        self.test_body = Body.objects.create(name="Test Body")
        self.test_event = create_event(name="Event 1",
                                       end_time_delta=20,
                                       image_url="https://insti.app/event1img")
        self.test_event_2 = create_event(
            name="Test Event 2",
            end_time_delta=-1,
            image_url="https://insti.app/event2img")
        self.test_body.events.add(self.test_event)
        self.test_body.events.add(self.test_event_2)

        self.news1 = NewsEntry.objects.create(guid="https://test.com",
                                              title="NewsIsGreat",
                                              body=self.test_body,
                                              blog_url="https://blog",
                                              link="https://blog-item")

        parent_body = Body.objects.create(name="Parent")
        grandparent_body = Body.objects.create(name="GrandParent")
        BodyChildRelation.objects.create(parent=parent_body,
                                         child=self.test_body)
        BodyChildRelation.objects.create(parent=grandparent_body,
                                         child=parent_body)
Esempio n. 2
0
    def setUp(self):
        # Create bodies
        body1 = create_body(name="Test WnCC",
                            description="<script> var js = 'XSS'; </script>")
        body2 = create_body(name="Test MoodI")

        # Create dummy events
        event1 = create_event(name="Test Scratch")
        event2 = create_event(name="Test Scratch Wncc")
        event3 = create_event(name="Test Aaveg")

        # Create dummy users for search
        UserProfile.objects.create(name="Test User1")
        UserProfile.objects.create(name="Test User2")
        UserProfile.objects.create(name="Test User3", active=False)

        # Associate events with bodies
        event1.bodies.add(body1)
        event2.bodies.add(body1)
        event3.bodies.add(body2)

        # Fake authenticate
        self.user = get_new_user()
        self.profile = self.user.profile
        self.client = APIClient()
        self.client.force_authenticate(self.user)
Esempio n. 3
0
    def test_body_get_events(self):
        """Test if get events API works."""

        body = Body.objects.create(name="TestBody1")
        url = '/api/bodies/' + str(body.id) + '/events'

        # Create events for the body
        event1 = create_event(48, 48)
        event1.bodies.add(body)
        event2 = create_event(4, 5)
        event2.bodies.add(body)
        eventP1 = create_event(-5, -4)
        eventP1.bodies.add(body)
        # Create an event before 1 year
        eventA = create_event(-24 * 370, -24 * 370 + 2)
        eventA.bodies.add(body)

        response = self.client.get(url)

        # Check response status and length
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 3)

        self.assertEqual(response.data[0]['id'], str(event1.id))
        self.assertEqual(response.data[1]['id'], str(event2.id))
        self.assertEqual(response.data[2]['id'], str(eventP1.id))

        # Check response for ?archived parameter in url
        response = self.client.get(url + '?archived')

        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 4)
        self.assertEqual(response.data[3]['id'], str(eventA.id))
Esempio n. 4
0
    def setUp(self):
        # Fake authenticate
        self.user = get_new_user()
        self.client.force_authenticate(self.user)  # pylint: disable=E1101

        self.test_body_1 = create_body()
        self.test_body_2 = create_body()

        self.body_1_role = BodyRole.objects.create(
            name="Body1Role",
            body=self.test_body_1,
            permissions='AddE,UpdE,DelE')
        self.user.profile.roles.add(self.body_1_role)

        self.update_test_event = create_event(-24, -24)
        url = '/api/events/%s' % self.update_test_event.id
        self.update_event_data = self.client.get(url).data
        self.update_url = '/api/events/%s' % self.update_test_event.id

        create_event(-24, -24)
Esempio n. 5
0
    def test_clean_images_chore(self):
        """Check clean images chore."""

        res = [None] * 5
        res[0] = new_upload(self)

        # Create images more than an hour ago
        with freeze_time(timezone.now() - timedelta(hours=3)):
            for i in range(1, 5):
                res[i] = new_upload(self)

            event1 = create_event(image_url=res[2].data['picture'])
            body1 = create_body(image_url=res[3].data['picture'])

        # Get path for checking deletion
        obj = lambda res: UploadedImage.objects.get(pk=res.data['id'])
        obj_exists = lambda res: UploadedImage.objects.filter(pk=res.data['id']
                                                              ).exists()
        paths = [obj(r).picture.path for r in res]

        # Check if deleting a non existent file is fine
        self.assertTrue(isfile(paths[4]))
        os.remove(paths[4])
        self.assertFalse(isfile(paths[4]))
        obj(res[4]).delete()
        self.assertFalse(obj_exists(res[4]))

        # Call the chore
        clean = lambda: call_command('clean-images')
        clean()

        # Check if unclaimed images were removed
        self.assertTrue(obj_exists(res[0]))
        self.assertFalse(obj_exists(res[1]))
        self.assertTrue(obj_exists(res[2]))
        self.assertTrue(obj_exists(res[3]))

        # Check if file is deleted
        self.assertTrue(isfile(paths[0]))
        self.assertFalse(isfile(paths[1]))

        # Check after invalidating claimant
        body1.image_url = 'https://insti.app'
        body1.save()
        clean()
        self.assertTrue(obj_exists(res[2]))
        self.assertFalse(obj_exists(res[3]))

        # Check after deleting claimant
        event1.delete()
        clean()
        self.assertFalse(obj_exists(res[2]))
Esempio n. 6
0
    def setUp(self):
        # Create bodies
        body1 = create_body(name="Test Body1")
        body2 = create_body(name="Test Body2")

        # Create dummy events
        event1 = create_event(name="Test Event1")
        event2 = create_event(name="Test Event2 Body1")
        event3 = create_event(name="Test Event21")

        # Create dummy users for search
        UserProfile.objects.create(name="Test User1")
        UserProfile.objects.create(name="Test User2")

        # Associate events with bodies
        event1.bodies.add(body1)
        event2.bodies.add(body1)
        event3.bodies.add(body2)

        # Fake authenticate
        self.user = get_new_user()
        self.profile = self.user.profile
        self.client.force_authenticate(self.user)  # pylint: disable=E1101
Esempio n. 7
0
    def setUp(self):
        # Fake authenticate
        self.user = get_new_user()
        self.client = APIClient()
        self.client.force_authenticate(self.user)

        # A different user
        self.user_2 = get_new_user()

        # Dummy bodies and events
        self.body_1 = create_body()
        self.body_2 = create_body()
        self.event_1 = create_event()

        # Body roles
        self.body_1_role = BodyRole.objects.create(
            name="Body1Role", body=self.body_1, permissions='VerA,AddE')
Esempio n. 8
0
    def test_event_update9(self):
        """Event tags can be updated."""
        # Add an event to an updateable body
        event = create_event()
        self.test_body_1.events.add(event)

        # Get the response
        url = '/api/events/%s' % event.id
        data = self.client.get(url).data

        # Create tags and assign them
        category = create_usertagcategory()
        tag1 = create_usertag(category, '1')
        tag2 = create_usertag(category, '2')
        data['user_tags'] = [str(tag1.id), str(tag2.id)]
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(event.user_tags.count(), 2)
Esempio n. 9
0
    def test_ues(self):
        """Test user-event-status APIs."""
        def assert_user_ues(t_event, t_ues):
            """Test user_ues in event serializer."""

            url = '/api/events/%s' % t_event.id
            response = self.client.get(url, format='json')
            self.assertEqual(response.status_code, 200)
            self.assertEqual(response.data['user_ues'], t_ues)

        def mark_test(event, ues, count):
            """Helper to mark UES and test creation/updation."""

            # Mark UES for the event
            url = '/api/user-me/ues/%s?status=%s' % (event.id, str(ues))
            response = self.client.get(url, format='json')
            self.assertEqual(response.status_code, 204)

            # Assert creation of UES
            self.assertEqual(event.ues.count(), count)
            assert_user_ues(event, ues)

            # Check first only if exists
            if count > 0:
                self.assertEqual(event.ues.first().status, ues)

        # Create event with one body
        test_body = create_body(name="Test Body1")
        test_event = create_event(name="Test Event1")
        test_event.bodies.add(test_body)
        self.assertEqual(test_event.ues.count(), 0)
        assert_user_ues(test_event, 0)

        # Test interested, going and neutral
        # When the user un-marks the event, UES must be removed
        mark_test(test_event, 1, 1)
        mark_test(test_event, 2, 1)
        mark_test(test_event, 0, 0)

        # Assert user_ues as anonymous
        self.client.logout()
        assert_user_ues(test_event, None)
Esempio n. 10
0
    def test_notifications(self):  # pylint: disable=R0914,R0915
        """Test notifications API."""
        # Fake authenticate
        profile = self.profile

        # Add two bodies, with the user following #1
        body1 = create_body()
        body2 = create_body()
        profile.followed_bodies.add(body1)

        # Add four events to followed body and one to other.
        # Event 5 has notifications turned off
        event1 = create_event()
        event2 = create_event()
        event3 = create_event()
        event4 = create_event()
        event5 = create_event()
        event5.notify = False
        event5.save()

        # Notifications older than a week shouldn't show up
        with freeze_time(timezone.now() - timedelta(days=10)):
            event6 = create_event()
            event6.bodies.add(body1)

        # Add bodies to all events
        event1.bodies.add(body1)
        event2.bodies.add(body1)
        event3.bodies.add(body1)
        event4.bodies.add(body2)
        event5.bodies.add(body1)

        # Get notifications
        url = '/api/notifications'
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)

        # Check if notifications are correct three
        self.assertEqual(len(response.data), 3)
        actors = [n['actor'] for n in response.data]
        self.assertIn(EventSerializer(event1).data, actors)
        self.assertIn(EventSerializer(event2).data, actors)
        self.assertIn(EventSerializer(event3).data, actors)

        # Mark event2 as read
        e2n = [n for n in response.data if n['actor'] == EventSerializer(event2).data][0]
        response = self.client.get(url + '/read/' + str(e2n['id']))
        self.assertEqual(response.status_code, 204)

        # Check if notifications are correct remaining two
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 2)
        actors = [n['actor'] for n in response.data]
        self.assertIn(EventSerializer(event1).data, actors)
        self.assertIn(EventSerializer(event3).data, actors)

        # Follow event 4
        uesurl = '/api/user-me/ues/' + str(event4.id) + '?status=1'
        response = self.client.get(uesurl, format='json')
        self.assertEqual(response.status_code, 204)

        # Update event 4
        event4.name = 'UpdatedEvent4'
        event4.save()

        # Check if notification is added for event 4
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 3)
        actors = [n['actor'] for n in response.data]
        self.assertIn(EventSerializer(event1).data, actors)
        self.assertIn(EventSerializer(event3).data, actors)
        self.assertIn(EventSerializer(event4).data, actors)

        # Follow event 5
        uesurl = '/api/user-me/ues/' + str(event5.id) + '?status=1'
        response = self.client.get(uesurl, format='json')
        self.assertEqual(response.status_code, 204)

        # Update event 5
        event5.name = 'UpdatedEvent5'
        event5.save()

        # Check no notification is added for event 5
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 3)

        # Check no notification after unfollowing event - unfollow 4 and update again
        uesurl = '/api/user-me/ues/' + str(event4.id) + '?status=0'
        response = self.client.get(uesurl, format='json')
        self.assertEqual(response.status_code, 204)
        event4.name = 'AUpdatedEvent4'
        event4.save()
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 3)

        # Mark all notifications as read and check
        response = self.client.get(url + '/read')
        self.assertEqual(response.status_code, 204)

        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 0)
Esempio n. 11
0
    def test_notifications(self):  # pylint: disable=R0914,R0915
        """Test notifications API."""
        # Fake authenticate
        profile = self.profile
        profile.user.notifications.all().delete()

        # Add two bodies, with the user following #1
        body1 = create_body()
        body2 = create_body()
        profile.followed_bodies.add(body1)

        # Add four events to followed body and one to other.
        # Event 5 has notifications turned off
        event1 = create_event()
        event2 = create_event()
        event3 = create_event()
        event4 = create_event()
        event5 = create_event()
        event5.notify = False
        event5.save()

        # Add bodies to all events
        event1.bodies.add(body1)
        event2.bodies.add(body1)
        event3.bodies.add(body1)
        event4.bodies.add(body2)
        event5.bodies.add(body1)

        celery_delay()

        # Get notifications
        url = '/api/notifications'
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)

        # Check if notifications are correct three
        self.assertEqual(len(response.data), 3)
        actors = [n['actor'] for n in response.data]
        self.assertIn(EventSerializer(event1).data, actors)
        self.assertIn(EventSerializer(event2).data, actors)
        self.assertIn(EventSerializer(event3).data, actors)

        # Mark event2 as read
        e2n = [
            n for n in response.data
            if n['actor'] == EventSerializer(event2).data
        ][0]
        e2notif = lambda: Notification.objects.get(pk=e2n['id'])
        self.assertEqual(e2notif().unread, True)
        self.assertEqual(e2notif().deleted, False)
        response = self.client.get(url + '/read/' + str(e2n['id']))
        self.assertEqual(response.status_code, 204)
        self.assertEqual(e2notif().unread, False)
        self.assertEqual(e2notif().deleted, False)

        # Mark event2 as deleted
        response = self.client.get(url + '/read/' + str(e2n['id']) +
                                   '?delete=1')
        self.assertEqual(response.status_code, 204)
        self.assertEqual(e2notif().unread, False)
        self.assertEqual(e2notif().deleted, True)

        celery_delay()

        # Check if notifications are correct remaining two
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 2)
        actors = [n['actor'] for n in response.data]
        self.assertIn(EventSerializer(event1).data, actors)
        self.assertIn(EventSerializer(event3).data, actors)

        # Follow event 4
        uesurl = '/api/user-me/ues/' + str(event4.id) + '?status=1'
        response = self.client.get(uesurl, format='json')
        self.assertEqual(response.status_code, 204)

        # Update event 4
        event4.name = 'UpdatedEvent4'
        event4.save()

        celery_delay()

        # Check if notification is added for event 4
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 3)
        actors = [n['actor'] for n in response.data]
        self.assertIn(EventSerializer(event1).data, actors)
        self.assertIn(EventSerializer(event3).data, actors)
        self.assertIn(EventSerializer(event4).data, actors)

        # Follow event 5
        uesurl = '/api/user-me/ues/' + str(event5.id) + '?status=1'
        response = self.client.get(uesurl, format='json')
        self.assertEqual(response.status_code, 204)

        # Update event 5
        event5.name = 'UpdatedEvent5'
        event5.save()

        # Check no notification is added for event 5
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 3)

        # Check no notification after unfollowing event - unfollow 4 and update again
        uesurl = '/api/user-me/ues/' + str(event4.id) + '?status=0'
        response = self.client.get(uesurl, format='json')
        self.assertEqual(response.status_code, 204)
        event4.name = 'AUpdatedEvent4'
        event4.save()

        celery_delay()
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 3)

        # Mark all notifications as read and check
        response = self.client.get(url + '/read')
        self.assertEqual(response.status_code, 204)

        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 0)
Esempio n. 12
0
    def test_event_prioritizer(self):
        """Test the event prioritizer."""
        def assertOrder(events, url='/api/events'):
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            for index, event in enumerate(events):
                self.assertEqual(response.data['data'][index]['id'],
                                 str(event.id))

        # Events in future. event1 after event3 after event2. event4 in past
        event1 = create_event(48, 48)
        event2 = create_event(4, 5)
        event3 = create_event(15, 16)
        event4 = create_event(-5, -4)

        assertOrder([event2, event3, event1, event4])

        # Check followed bodies priorities
        body1 = create_body()
        body2 = create_body()
        body3 = create_body()
        body4 = create_body()
        body5 = create_body()
        self.user.profile.followed_bodies.add(body1, body2, body3, body4,
                                              body5)

        # After the user is following  a body of event 3, it should bump up
        event3.bodies.add(body1)
        assertOrder([event3, event2, event1, event4])

        # Test the cap on followed bodies bonus
        event1.bodies.add(body1, body2, body3, body4, body5)
        assertOrder([event3, event1, event2, event4])

        # Check user tags - setup the user
        self.user.profile.hostel = '1'
        self.user.profile.department = 'ME'
        self.user.profile.save()

        # Add one matching and one non-matching tag to both
        category1 = create_usertagcategory()
        h1_tag = create_usertag(category1, '1')
        h13_tag = create_usertag(category1, '13')
        event1.user_tags.add(h1_tag)
        event3.user_tags.add(h13_tag)

        # Add one matching tag to both events
        category2 = create_usertagcategory()
        me_tag = create_usertag(category2, 'ME', target='department')
        event1.user_tags.add(me_tag)
        event3.user_tags.add(me_tag)

        # Check new order
        assertOrder([event1, event2, event4])

        # Check if user needs to satisfy only one tag from each category
        event1.user_tags.add(h13_tag)
        assertOrder([event1, event2, event4])

        # Test null check - now the department matching tag is non matching
        self.user.profile.department = None
        self.user.profile.save()
        assertOrder([event2, event4])

        # Test if secondary_target is working
        me_tag.secondary_target = 'hostel'
        me_tag.secondary_regex = '1'
        me_tag.save()
        assertOrder([event1, event2, event4])

        # Test for anonymous user
        self.client.logout()
        assertOrder([event2, event4])
Esempio n. 13
0
    def test_event_prioritizer(self):  # pylint: disable=R0914,R0915
        """Test the event prioritizer."""
        def assertOrder(events, url='/api/events'):
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            for index, event in enumerate(events):
                self.assertEqual(response.data['data'][index]['id'],
                                 str(event.id))

        def assertWeightOrder(events, url='/api/events'):
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            prev_weight = response.data['data'][0]['weight']
            for event in events:
                response_event = next(x for x in response.data['data']
                                      if x['id'] == str(event.id))
                self.assertLess(response_event['weight'], prev_weight)
                prev_weight = response_event['weight']

        # Events in future:
        # event1 after event3 after event2
        # eventP1, eventP1 in past
        event1 = create_event(48, 48)
        event2 = create_event(4, 5)
        event3 = create_event(15, 16)
        eventP1 = create_event(-5, -4)
        eventP2 = create_event(-6, -5)

        # These events check linear decay after 15 days
        eventL1 = create_event(24 * 30, 24 * 30)
        eventL2 = create_event(24 * 20, 24 * 20)
        eventL3 = create_event(24 * 40, 24 * 40)

        assertOrder([event2, event3, event1, eventP1, eventP2])
        assertWeightOrder([eventL2, eventL1, eventL3])

        # Check followed bodies priorities
        body1 = create_body()
        body2 = create_body()
        body3 = create_body()
        body4 = create_body()
        body5 = create_body()
        self.user.profile.followed_bodies.add(body1, body2, body3, body4,
                                              body5)

        # After the user is following  a body of event 3, it should bump up
        event3.bodies.add(body1)
        assertOrder([event3, event2, event1, eventP1, eventP2])

        # Test the cap on followed bodies bonus
        event1.bodies.add(body1, body2, body3, body4, body5)
        assertOrder([event3, event1, event2, eventP1, eventP2])

        # Test that ended events do not receive bonus
        eventP2.bodies.add(body1, body2, body3, body4)
        eventP2.promotion_boost = 2000
        eventP2.save()
        assertOrder([event3, event1, event2, eventP1, eventP2])

        # Check user tags - setup the user
        self.user.profile.hostel = '1'
        self.user.profile.department = 'ME'
        self.user.profile.save()

        # Add one matching and one non-matching tag to both
        category1 = create_usertagcategory()
        h1_tag = create_usertag(category1, '1')
        h13_tag = create_usertag(category1, '13')
        event1.user_tags.add(h1_tag)
        event3.user_tags.add(h13_tag)

        # Add one matching tag to both events
        category2 = create_usertagcategory()
        me_tag = create_usertag(category2, 'ME', target='department')
        event1.user_tags.add(me_tag)
        event3.user_tags.add(me_tag)

        # Check new order
        assertOrder([event1, event2, eventP1])

        # Check if user needs to satisfy only one tag from each category
        event1.user_tags.add(h13_tag)
        assertOrder([event1, event2, eventP1])

        # Test null check - now the department matching tag is non matching
        self.user.profile.department = None
        self.user.profile.save()
        assertOrder([event2, eventP1])

        # Test if secondary_target is working
        me_tag.secondary_target = 'hostel'
        me_tag.secondary_regex = '1'
        me_tag.save()
        assertOrder([event1, event2, eventP1])

        # Test promotion boost
        event2.promotion_boost = 2000
        event2.save()
        assertOrder([event2, event1, eventP1])
        event2.promotion_boost = 0
        event2.save()

        # Test for anonymous user
        self.client.logout()
        assertOrder([event2, eventP1])