def test_trending_returns_earlier_post_when_equal_ratings(self): low_post = PostFactory() middle_post = PostFactory() high_post = PostFactory() for i in range(50): RatingFactory(content_object=low_post, value=Rating.LIKE_VALUE) RatingFactory(content_object=middle_post, value=Rating.LIKE_VALUE) RatingFactory(content_object=high_post, value=Rating.LIKE_VALUE) low_post.created_at = timezone.now() - timedelta(hours=20) low_post.save() middle_post.created_at = timezone.now() - timedelta(hours=10) middle_post.save() high_post.created_at = timezone.now() - timedelta(hours=3) high_post.save() request = self.factory.get("api/posts/trending/") force_authenticate(request, self.user) response = self.trending_view(request) posts = response.data['results'] self.assertEqual(posts[0]["id"], high_post.id) self.assertEqual(posts[1]["id"], middle_post.id) self.assertEqual(posts[2]["id"], low_post.id)
def test_best_post_method_works_correctly(self): best_post = PostFactory(topic=self.active_topic) RatingFactory.create_batch(20, content_object=best_post, value=Rating.LIKE_VALUE) other_posts = PostFactory.create_batch(5, topic=self.active_topic) for post in other_posts: RatingFactory.create_batch(10, content_object=post) self.assertEqual(best_post, self.active_topic.get_best_post())
def test_ratings_are_calculated_correctly(self): like_count = random.randint(0, 100) dislike_count = random.randint(0, 100) expected_rating = like_count * Rating.LIKE_VALUE + dislike_count * Rating.DISLIKE_VALUE RatingFactory.create_batch(like_count, value=Rating.LIKE_VALUE, content_object=self.comment) RatingFactory.create_batch(dislike_count, value=Rating.DISLIKE_VALUE, content_object=self.comment) self.assertEqual(expected_rating, self.comment.get_rating())
def test_top_view_sort_correctly(self): batch_size = 5 new_posts = PostFactory.create_batch(batch_size) for p in new_posts: RatingFactory.create_batch(batch_size, content_object=p) request = self.factory.get("api/posts/top") force_authenticate(request, user=self.user) response = self.top_view(request) self.assertEqual(response.status_code, status.HTTP_200_OK) posts = response.data['results'] for i in range(len(posts) - 1): self.assertGreaterEqual(posts[i]['rating'], posts[i + 1]['rating'])
def test_post_detail_serializer_return_rating(self): new_post = PostFactory() RatingFactory(content_object=new_post, user=self.user, value=Rating.LIKE_VALUE) request = self.factory.get("api/posts/{id}/") force_authenticate(request, user=self.user) response = self.detail_view(request, pk=new_post.id) self.assertEqual(response.data['user_rating']['value'], 1)
def test_rate_view_update_correctly(self): new_post = PostFactory() RatingFactory(content_object=new_post, value=Rating.LIKE_VALUE) data = {} data['vote'] = Rating.LIKE_VALUE request = self.factory.put("api/posts/{id}/rate", data) force_authenticate(request, user=self.user) response = self.rate_view(request, pk=new_post.id) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(2, new_post.get_rating())
def handle(self, *args, **options): TopicFactory.create_batch(5) for topic in Topic.objects.all(): PostFactory.create_batch(5, topic=topic) for post in Post.objects.all(): RatingFactory.create_batch(5, content_object=post) CommentFactory.create_batch(5, post=post, user=User.objects.first()) for comment in post.comments.all(): CommentFactory.create_batch(5, post=post, user=User.objects.first(), parent=comment) for comment in post.comments.all(): RatingFactory.create_batch(5, content_object=comment, user=User.objects.first())
def test_rate_view_deletes_rating(self): new_comment = CommentFactory() rating_id = RatingFactory(content_object=new_comment, user=self.user).id data = {'vote': Rating.DELETE_RATING_VALUE} request = self.factory.put("api/posts/{id}/rate", data) force_authenticate(request, user=self.user) response = self.rate_view(request, pk=new_comment.id) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(0, new_comment.get_rating()) self.assertFalse(Rating.objects.filter(pk=rating_id).exists())
def test_trending_view_returns_highly_rated_new_posts_first(self): low_post = PostFactory() RatingFactory.create_batch(3, content_object=low_post, value=Rating.LIKE_VALUE) middle_post = PostFactory() RatingFactory.create_batch(7, content_object=middle_post, value=Rating.LIKE_VALUE) high_post = PostFactory() RatingFactory.create_batch(50, content_object=high_post, value=Rating.LIKE_VALUE) request = self.factory.get("api/posts/trending/") force_authenticate(request, self.user) response = self.trending_view(request) posts = response.data['results'] self.assertEqual(posts[0]["id"], high_post.id) self.assertEqual(posts[1]["id"], middle_post.id) self.assertEqual(posts[2]["id"], low_post.id)