def test_subscribe_association(self): """ To test the "subscription to the association" form. """ _, forum = create_category_and_forum() # overrides the settings to avoid 404 if forum does not exist settings.ZDS_APP['site']['association']['forum_ca_pk'] = forum.pk # send form long_str = '' for i in range(3100): long_str += 'A' result = self.client.post( reverse('pages-assoc-subscribe'), { 'full_name': 'Anne Onyme', 'email': '*****@*****.**', 'naissance': '01 janvier 1970', 'adresse': '42 rue du savoir, appartement 42, 75000 Paris, France', 'justification': long_str }, follow=False) self.assertEqual(result.status_code, 200)
def test_hidden_forums_give_no_results_if_user_not_allowed(self): """Long name, isn't ?""" if not self.manager.connected_to_es: return # 1. Create a hidden forum belonging to a hidden staff group. text = "test" group = Group.objects.create(name="Les illuminatis anonymes de ZdS") _, hidden_forum = create_category_and_forum(group) self.staff.groups.add(group) self.staff.save() topic_1 = TopicFactory(forum=hidden_forum, author=self.staff, title=text) post_1 = PostFactory(topic=topic_1, author=self.user, position=1) post_1.text = post_1.text_html = text post_1.save() self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() self.assertEqual( len( self.manager.setup_search(Search().query( MatchAll())).execute()), 2) # indexing ok # 2. search without connection and get not result result = self.client.get(reverse("search:query") + "?q=" + text, follow=False) self.assertEqual(result.status_code, 200) response = result.context["object_list"].execute() self.assertEqual(response.hits.total, 0) # 3. Connect with user (not a member of the group), search, and get no result self.client.force_login(self.user) result = self.client.get(reverse("search:query") + "?q=" + text, follow=False) self.assertEqual(result.status_code, 200) response = result.context["object_list"].execute() self.assertEqual(response.hits.total, 0) # 4. Connect with staff, search, and get the topic and the post self.client.logout() self.client.force_login(self.staff) result = self.client.get(reverse("search:query") + "?q=" + text, follow=False) self.assertEqual(result.status_code, 200) response = result.context["object_list"].execute() self.assertEqual(response.hits.total, 2) # ok !
def test_failure_post_karma_with_client_unauthenticated(self): profile = ProfileFactory() category, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) post = PostFactory(topic=topic, author=profile.user, position=2) response = self.client.put(reverse('api:forum:post-karma', args=(post.pk,))) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
def test_valid_post_form(self): profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = {"text": "Test Post Text"} form = PostForm(topic, profile.user, data=data) self.assertTrue(form.is_valid())
def test_invalid_post_form_empty_text(self): """ Test when text contains only whitespace """ profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = {"text": " "} form = PostForm(topic, profile.user, data=data) self.assertFalse(form.is_valid())
def test_invalid_post_form_missing_text(self): """ Test when text is missing """ profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = {} form = PostForm(topic, profile.user, data=data) self.assertFalse(form.is_valid())
def test_failure_post_karma_of_a_forum_we_cannot_read(self): group = Group.objects.create(name='DummyGroup_1') profile = ProfileFactory() category, forum = create_category_and_forum(group) topic = create_topic_in_forum(forum, profile) self.assertTrue(self.client.login(username=profile.user.username, password='******')) response = self.client.put(reverse('api:forum:post-karma', args=(topic.last_message.pk,)), {'vote': 'like'}) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_valid_post_form(self): profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = { 'text': 'Test Post Text' } form = PostForm(topic, profile.user, data=data) self.assertTrue(form.is_valid())
def test_invalid_post_form_missing_text(self): """ Test when text is missing """ profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = { } form = PostForm(topic, profile.user, data=data) self.assertFalse(form.is_valid())
def test_failure_post_karma_of_a_forum_we_cannot_read(self): group = Group.objects.create(name="DummyGroup_1") profile = ProfileFactory() category, forum = create_category_and_forum(group) topic = create_topic_in_forum(forum, profile) self.client.force_login(profile.user) response = self.client.put(reverse("api:forum:post-karma", args=(topic.last_message.pk,)), {"vote": "like"}) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_invalid_post_form_text_too_long(self): """ Test when text runs over the length limit """ profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = { "text": text_too_long, } form = PostForm(topic, profile.user, data=data) self.assertFalse(form.is_valid())
def test_invalid_post_form_text_too_long(self): """ Test when text runs over the length limit """ profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = { 'text': text_too_long, } form = PostForm(topic, profile.user, data=data) self.assertFalse(form.is_valid())
def test_invalid_post_form_empty_text(self): """ Test when text contains only whitespace """ profile = ProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) data = { 'text': ' ' } form = PostForm(topic, profile.user, data=data) self.assertFalse(form.is_valid())
def test_success_post_karma_like(self): profile = ProfileFactory() category, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) another_profile = ProfileFactory() post = PostFactory(topic=topic, author=another_profile.user, position=2) self.client.force_login(profile.user) response = self.client.put(reverse("api:forum:post-karma", args=(post.pk,)), {"vote": "like"}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertTrue(CommentVote.objects.filter(user=profile.user, comment=post, positive=True).exists())
def test_success_post_karma_dislike(self): profile = ProfileFactory() category, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) another_profile = ProfileFactory() post = PostFactory(topic=topic, author=another_profile.user, position=2) self.assertTrue(self.client.login(username=profile.user.username, password='******')) response = self.client.put(reverse('api:forum:post-karma', args=(post.pk,)), {'vote': 'dislike'}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertTrue(CommentVote.objects.filter(user=profile.user, comment=post, positive=False).exists())
def setUp(self): settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' self.mas = ProfileFactory().user settings.ZDS_APP['member']['bot_account'] = self.mas.username self.category, self.forum = create_category_and_forum() self.user = ProfileFactory().user self.staff = StaffProfileFactory().user self.index_manager = ESIndexManager(**settings.ES_SEARCH_INDEX)
def setUp(self): settings.EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend" self.mas = ProfileFactory().user settings.ZDS_APP["member"]["bot_account"] = self.mas.username self.category, self.forum = create_category_and_forum() self.user = ProfileFactory().user self.staff = StaffProfileFactory().user self.index_manager = ESIndexManager(**settings.ES_SEARCH_INDEX)
def setUp(self): self.user = ProfileFactory().user self.staff = StaffProfileFactory().user _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, self.user.profile) self.assertTrue(self.client.login(username=self.user.username, password="******")) data = {"text": "A new post!"} self.client.post(reverse("post-edit") + "?message={}".format(topic.last_message.pk), data, follow=False) self.post = topic.last_message self.edit = CommentEdit.objects.latest("date")
def test_hidden_forums_give_no_results_if_user_not_allowed(self): """Long name, isn't ?""" if not self.manager.connected_to_es: return # 1. Create a hidden forum belonging to a hidden staff group. text = 'test' group = Group.objects.create(name='Les illuminatis anonymes de ZdS') _, hidden_forum = create_category_and_forum(group) self.staff.groups.add(group) self.staff.save() topic_1 = TopicFactory(forum=hidden_forum, author=self.staff, title=text) post_1 = PostFactory(topic=topic_1, author=self.user, position=1) post_1.text = post_1.text_html = text post_1.save() self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() self.assertEqual(len(self.manager.setup_search(Search().query(MatchAll())).execute()), 2) # indexing ok # 2. search without connection and get not result result = self.client.get(reverse('search:query') + '?q=' + text, follow=False) self.assertEqual(result.status_code, 200) response = result.context['object_list'].execute() self.assertEqual(response.hits.total, 0) # 3. Connect with user (not a member of the group), search, and get no result self.assertTrue(self.client.login(username=self.user.username, password='******')) result = self.client.get(reverse('search:query') + '?q=' + text, follow=False) self.assertEqual(result.status_code, 200) response = result.context['object_list'].execute() self.assertEqual(response.hits.total, 0) # 4. Connect with staff, search, and get the topic and the post self.client.logout() self.assertTrue(self.client.login(username=self.staff.username, password='******')) result = self.client.get(reverse('search:query') + '?q=' + text, follow=False) self.assertEqual(result.status_code, 200) response = result.context['object_list'].execute() self.assertEqual(response.hits.total, 2) # ok !
def test_failure_post_karma_with_sanctioned_user(self): profile = ProfileFactory() category, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) another_profile = ProfileFactory() post = PostFactory(topic=topic, author=another_profile.user, position=2) profile = ProfileFactory() profile.can_read = False profile.can_write = False profile.save() self.assertTrue(self.client.login(username=profile.user.username, password='******')) response = self.client.put(reverse('api:forum:post-karma', args=(post.pk,))) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def setUp(self): self.user = ProfileFactory().user self.staff = StaffProfileFactory().user _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, self.user.profile) self.assertTrue(self.client.login(username=self.user.username, password='******')) data = { 'text': 'A new post!' } self.client.post( reverse('post-edit') + '?message={}'.format(topic.last_message.pk), data, follow=False) self.post = topic.last_message self.edit = CommentEdit.objects.latest('date')
def test_success_post_karma_like_already_disliked(self): profile = ProfileFactory() category, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) another_profile = ProfileFactory() post = PostFactory(topic=topic, author=another_profile.user, position=2) vote = CommentVote(user=profile.user, comment=post, positive=False) vote.save() self.assertTrue(self.client.login(username=profile.user.username, password='******')) response = self.client.put(reverse('api:forum:post-karma', args=(post.pk,)), {'vote': 'like'}) vote.refresh_from_db() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertTrue(vote.positive)
def setUp(self): settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' self.mas = ProfileFactory().user settings.ZDS_APP['member']['bot_account'] = self.mas.username self.category, self.forum = create_category_and_forum() self.user = ProfileFactory().user self.staff = StaffProfileFactory().user self.manager = ESIndexManager(**settings.ES_SEARCH_INDEX) self.indexable = [FakeChapter, PublishedContent, Topic, Post] self.manager.reset_es_index(self.indexable) self.manager.setup_custom_analyzer() self.manager.refresh_index()
def test_mark_as_potential_spam_forum(self): author = ProfileFactory() staff = StaffProfileFactory() _, forum = create_category_and_forum() topic = create_topic_in_forum(forum, author) PostFactory(topic=topic, author=author.user, position=2) comment = topic.last_message self.common_test_mark_as_potential_spam( url_comments_list=reverse("topic-posts-list", args=[topic.pk, topic.slug()]), url_comment_edit=reverse("post-edit") + f"?message={comment.pk}", comment=comment, author=author, staff=staff, )
def test_success_post_karma_neutral(self): profile = ProfileFactory() category, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) another_profile = ProfileFactory() post = PostFactory(topic=topic, author=another_profile.user, position=2) vote = CommentVote(user=profile.user, comment=post, positive=True) vote.save() self.assertTrue(CommentVote.objects.filter(pk=vote.pk).exists()) self.assertTrue( self.client.login(username=profile.user.username, password="******")) response = self.client.put( reverse("api:forum:post-karma", args=(post.pk, )), {"vote": "neutral"}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertFalse(CommentVote.objects.filter(pk=vote.pk).exists())
def test_change_topic_impacts_posts(self): if not self.manager.connected_to_es: return # 1. Create a hidden forum belonging to a hidden group and add staff in it. text = 'test' group = Group.objects.create(name='Les illuminatis anonymes de ZdS') _, hidden_forum = create_category_and_forum(group) self.staff.groups.add(group) self.staff.save() # 2. Create a normal topic and index it topic_1 = TopicFactory(forum=self.forum, author=self.user, title=text) post_1 = PostFactory(topic=topic_1, author=self.user, position=1) post_1.text = post_1.text_html = text post_1.save() self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() self.assertEqual(len(self.manager.setup_search(Search().query(MatchAll())).execute()), 2) # indexing ok result = self.client.get( reverse('search:query') + '?q=' + text + '&models=' + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context['object_list'].execute() self.assertEqual(response.hits.total, 1) # ok self.assertEqual(response[0].meta.doc_type, Post.get_es_document_type()) self.assertEqual(response[0].forum_pk, self.forum.pk) self.assertEqual(response[0].topic_pk, topic_1.pk) self.assertEqual(response[0].topic_title, topic_1.title) # 3. Change topic title and reindex topic_1.title = 'new title' topic_1.save() self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() result = self.client.get( reverse('search:query') + '?q=' + text + '&models=' + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context['object_list'].execute() self.assertEqual(response.hits.total, 1) # ok self.assertEqual(response[0].topic_title, topic_1.title) # title was changed # 4. connect with staff and move topic self.assertTrue(self.client.login(username=self.staff.username, password='******')) data = { 'move': '', 'forum': hidden_forum.pk, 'topic': topic_1.pk } response = self.client.post(reverse('topic-edit'), data, follow=False) self.assertEqual(302, response.status_code) self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() result = self.client.get( reverse('search:query') + '?q=' + text + '&models=' + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context['object_list'].execute() self.assertEqual(response.hits.total, 1) # Note: without staff, would not get any results (see below) self.assertEqual(response[0].forum_pk, hidden_forum.pk) # post was updated with new forum # 5. Topic is now hidden self.client.logout() result = self.client.get( reverse('search:query') + '?q=' + text + '&models=' + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context['object_list'].execute() self.assertEqual(response.hits.total, 0) # ok
def test_change_topic_impacts_posts(self): if not self.manager.connected_to_es: return # 1. Create a hidden forum belonging to a hidden group and add staff in it. text = "test" group = Group.objects.create(name="Les illuminatis anonymes de ZdS") _, hidden_forum = create_category_and_forum(group) self.staff.groups.add(group) self.staff.save() # 2. Create a normal topic and index it topic_1 = TopicFactory(forum=self.forum, author=self.user, title=text) post_1 = PostFactory(topic=topic_1, author=self.user, position=1) post_1.text = post_1.text_html = text post_1.save() self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() self.assertEqual( len( self.manager.setup_search(Search().query( MatchAll())).execute()), 2) # indexing ok result = self.client.get(reverse("search:query") + "?q=" + text + "&models=" + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context["object_list"].execute() self.assertEqual(response.hits.total, 1) # ok self.assertEqual(response[0].meta.doc_type, Post.get_es_document_type()) self.assertEqual(response[0].forum_pk, self.forum.pk) self.assertEqual(response[0].topic_pk, topic_1.pk) self.assertEqual(response[0].topic_title, topic_1.title) # 3. Change topic title and reindex topic_1.title = "new title" topic_1.save() self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() result = self.client.get(reverse("search:query") + "?q=" + text + "&models=" + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context["object_list"].execute() self.assertEqual(response.hits.total, 1) # ok self.assertEqual(response[0].topic_title, topic_1.title) # title was changed # 4. connect with staff and move topic self.client.force_login(self.staff) data = {"move": "", "forum": hidden_forum.pk, "topic": topic_1.pk} response = self.client.post(reverse("topic-edit"), data, follow=False) self.assertEqual(302, response.status_code) self.manager.es_bulk_indexing_of_model(Topic) self.manager.es_bulk_indexing_of_model(Post) self.manager.refresh_index() result = self.client.get(reverse("search:query") + "?q=" + text + "&models=" + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context["object_list"].execute() self.assertEqual( response.hits.total, 1) # Note: without staff, would not get any results (see below) self.assertEqual(response[0].forum_pk, hidden_forum.pk) # post was updated with new forum # 5. Topic is now hidden self.client.logout() result = self.client.get(reverse("search:query") + "?q=" + text + "&models=" + Post.get_es_document_type(), follow=False) self.assertEqual(result.status_code, 200) response = result.context["object_list"].execute() self.assertEqual(response.hits.total, 0) # ok
def test_get_post_voters(self): profile = ProfileFactory() profile2 = ProfileFactory() category, forum = create_category_and_forum() topic = create_topic_in_forum(forum, profile) another_profile = ProfileFactory() upvoted_answer = PostFactory(topic=topic, author=another_profile.user, position=2) upvoted_answer.like += 2 upvoted_answer.save() CommentVote.objects.create(user=profile.user, comment=upvoted_answer, positive=True) downvoted_answer = PostFactory(topic=topic, author=another_profile.user, position=3) downvoted_answer.dislike += 2 downvoted_answer.save() anon_limit = CommentVote.objects.create(user=profile.user, comment=downvoted_answer, positive=False) CommentVote.objects.create(user=profile2.user, comment=upvoted_answer, positive=True) CommentVote.objects.create(user=profile2.user, comment=downvoted_answer, positive=False) equal_answer = PostFactory(topic=topic, author=another_profile.user, position=4) equal_answer.like += 1 equal_answer.dislike += 1 equal_answer.save() CommentVote.objects.create(user=profile.user, comment=equal_answer, positive=True) CommentVote.objects.create(user=profile2.user, comment=equal_answer, positive=False) self.assertTrue(self.client.login(username=profile.user.username, password='******')) # on first message we should see 2 likes and 0 anonymous response = self.client.get(reverse('api:forum:post-karma', args=[upvoted_answer.pk])) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(2, len(response.data['like']['users'])) self.assertEqual(0, len(response.data['dislike']['users'])) self.assertEqual(2, response.data['like']['count']) self.assertEqual(0, response.data['dislike']['count']) # on second message we should see 2 dislikes and 0 anonymous response = self.client.get(reverse('api:forum:post-karma', args=[downvoted_answer.pk])) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(0, len(response.data['like']['users'])) self.assertEqual(2, len(response.data['dislike']['users'])) self.assertEqual(0, response.data['like']['count']) self.assertEqual(2, response.data['dislike']['count']) # on third message we should see 1 like and 1 dislike and 0 anonymous response = self.client.get(reverse('api:forum:post-karma', args=[equal_answer.pk])) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(1, len(response.data['like']['users'])) self.assertEqual(1, len(response.data['dislike']['users'])) self.assertEqual(1, response.data['like']['count']) self.assertEqual(1, response.data['dislike']['count']) # Now we change the settings to keep anonymous the first [dis]like settings.VOTES_ID_LIMIT = anon_limit.pk # and we run the same tests # on first message we should see 1 like and 1 anonymous response = self.client.get(reverse('api:forum:post-karma', args=[upvoted_answer.pk])) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(1, len(response.data['like']['users'])) self.assertEqual(0, len(response.data['dislike']['users'])) self.assertEqual(2, response.data['like']['count']) self.assertEqual(0, response.data['dislike']['count']) # on second message we should see 1 dislikes and 1 anonymous response = self.client.get(reverse('api:forum:post-karma', args=[downvoted_answer.pk])) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(0, len(response.data['like']['users'])) self.assertEqual(1, len(response.data['dislike']['users'])) self.assertEqual(0, response.data['like']['count']) self.assertEqual(2, response.data['dislike']['count']) # on third message we should see 1 like and 1 dislike and 0 anonymous response = self.client.get(reverse('api:forum:post-karma', args=[equal_answer.pk])) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(1, len(response.data['like']['users'])) self.assertEqual(1, len(response.data['dislike']['users'])) self.assertEqual(1, response.data['like']['count']) self.assertEqual(1, response.data['dislike']['count'])