예제 #1
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)
예제 #2
0
파일: tests.py 프로젝트: sshivam95/IITBapp
    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')
예제 #3
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)
예제 #4
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]))
예제 #5
0
파일: tests.py 프로젝트: jawharjoe/IITBapp
    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
예제 #6
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)
예제 #7
0
파일: tests.py 프로젝트: jawharjoe/IITBapp
    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)
예제 #8
0
    def test_placements_chore(self):
        """Test the placement blog chore."""

        # Clear table
        BlogEntry.objects.all().delete()

        # Create blog bodies
        placement_body = create_body(name=settings.PLACEMENTS_BLOG_BODY)
        training_body = create_body(name=settings.TRAINING_BLOG_BODY)

        # Create users to follow blogs
        second_year = get_new_user()
        final_year = get_new_user()
        mentioned_user = get_new_user()
        mentioned_dual = get_new_user()
        second_year.profile.followed_bodies.add(training_body)
        final_year.profile.followed_bodies.add(placement_body)
        mentioned_user.profile.roll_no = '160010005'
        mentioned_user.profile.save()
        mentioned_dual.profile.roll_no = '150040010'
        mentioned_dual.profile.save()

        # Start mock server
        mock_server = Popen(['python', 'news/test/test_server.py'])
        time.sleep(1)

        # Run the placement chore
        call_command('placement_blog_chore')

        # Check if posts were collected
        placements = lambda: BlogEntry.objects.all().filter(blog_url=settings.PLACEMENTS_URL)
        trainings = lambda: BlogEntry.objects.all().filter(blog_url=settings.TRAINING_BLOG_URL)
        self.assertEqual(placements().count(), 3)
        self.assertEqual(trainings().count(), 5)
        self.assertEqual(set(x.guid for x in placements()), set('sample:p:%i' % i for i in range(1, 4)))
        self.assertEqual(set(x.title for x in placements()), set('Placement Item %i' % i for i in range(1, 4)))

        # Check if following blogs works
        self.assertEqual(second_year.notifications.count(), 5)
        self.assertEqual(final_year.notifications.count(), 3)

        # Check if mentioned users got a notification
        self.assertEqual(mentioned_user.notifications.count(), 1)
        self.assertEqual(mentioned_user.notifications.first().actor.title, 'Mentioning Item')
        self.assertEqual(mentioned_dual.notifications.count(), 1)
        self.assertEqual(mentioned_dual.notifications.first().actor.title, 'Placement Item 1')

        # Update placement blog URL
        call_command('placement_blog_chore')

        # Check if new placement blog posts are got
        self.assertEqual(trainings().all().count(), 5)
        self.assertEqual(placements().all().count(), 4)
        self.assertEqual(set(x.guid for x in placements()), set('sample:p:%i' % i for i in range(1, 5)))
        self.assertEqual(set(x.title for x in placements()), set('Placement Item %i' % i for i in range(1, 5)))

        # Check if existing ones are updated
        self.assertEqual(BlogEntry.objects.get(guid='sample:p:1').content, 'Updated')

        # Check if notification counts are updated
        self.assertEqual(second_year.notifications.count(), 5)
        self.assertEqual(final_year.notifications.count(), 4)
        self.assertEqual(mentioned_user.notifications.count(), 2)
        self.assertEqual(mentioned_dual.notifications.count(), 2)

        # Stop server
        mock_server.terminate()
예제 #9
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)
예제 #10
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])
예제 #11
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])