def test_vote_twice(self): """ When a vote exists from a user, the user should see the "Liked" button. When another vote_up function is called, the user should see the "Like" button and the initial vote should be deleted. """ idea = models.Idea(creator=random_user(), title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() #Login and create a vote login(self) resp = self.client.post(reverse('idea:upvote_idea'), {'idea_id':idea.id, 'next':reverse('idea:idea_detail', args=(idea.id,))}) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 1) #Check to see that the vote appears, and that button displays liked resp = self.client.get(reverse('idea:idea_detail', args=(idea.id,))) self.assertContains(resp, 'value="Liked" id="vote_down"', status_code=200, html=False) #Click unlike and remove the vote and confirm it doesn't exist resp = self.client.post(reverse('idea:upvote_idea'), {'idea_id':idea.id, 'next':reverse('idea:idea_detail', args=(idea.id,))}) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 0) #Check to see that the button on page displays Like option resp = self.client.get(reverse('idea:idea_detail', args=(idea.id,))) self.assertContains(resp, 'value="Like" id="vote_up"', status_code=200, html=False)
def test_anonymous_checkbox_absent(self): """ Detail page should NOT have an anonymous checkbox for non-private banners and ideas without a banner """ banner = models.Banner(id=1, title="XXXX", text="text", is_private=False, start_date=datetime.date.today()) banner.save() idea = models.Idea(creator=random_user(), title='AAAA', banner=banner, state=models.State.objects.get(name='Active')) idea.save() create_superuser() login(self) resp = self.client.get(reverse('idea:idea_detail', args=(idea.id, ))) self.assertFalse('id_is_anonymous' in resp.content) idea2 = models.Idea(creator=random_user(), title='BBBB', banner=None, state=models.State.objects.get(name='Active')) idea2.save() resp = self.client.get(reverse('idea:idea_detail', args=(idea2.id, ))) self.assertFalse('id_is_anonymous' in resp.content)
def test_anonymous_checkbox_absent(self): """ Detail page should NOT have an anonymous checkbox for non-private banners and ideas without a banner """ banner = models.Banner(id=1, title="XXXX", text="text", is_private=False, start_date=datetime.date.today()) banner.save() idea = models.Idea(creator=random_user(), title='AAAA', banner=banner, state=models.State.objects.get(name='Active')) idea.save() create_superuser() login(self) resp = self.client.get(reverse('idea:idea_detail', args=(idea.id,))) self.assertFalse('id_is_anonymous' in resp.content) idea2 = models.Idea(creator=random_user(), title='BBBB', banner=None, state=models.State.objects.get(name='Active')) idea2.save() resp = self.client.get(reverse('idea:idea_detail', args=(idea2.id,))) self.assertFalse('id_is_anonymous' in resp.content)
def test_duplicate_idea(self): """ Test an duplicate POST submission to add an idea. """ login(self) self.assertEquals(models.Idea.objects.all().count(), 0) resp = self.client.post(reverse('idea:add_idea'), {'title':'test title', 'summary':'test summary', 'text':'test text', 'tags':'test, tags'}) self.assertEquals(models.Idea.objects.all().count(), 1) resp = self.client.post(reverse('idea:add_idea'), {'title':'test title', 'summary':'new summary', 'text':'new text', 'tags':'new, tags'}) self.assertEqual(resp.status_code, 302) self.assertIn('detail', resp['Location']) self.assertEquals(models.Idea.objects.all().count(), 1)
def test_good_vote(self): user = random_user() idea = models.Idea(creator=user, title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() login(self) resp = self.client.post(reverse('idea:upvote_idea'), {'idea_id':idea.id, 'next':reverse('idea:idea_detail', args=(idea.id,))}) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 1)
def test_good_idea(self): """ Test an normal POST submission to add an idea. """ login(self) self.assertEquals(models.Idea.objects.all().count(), 0) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 0) resp = self.client.post(reverse('idea:add_idea'), {'title':'test title', 'summary':'test summary', 'text':'test text', 'tags':'test, tags'}) self.assertContains(resp, 'Thanks for sharing your Idea') self.assertEquals(models.Idea.objects.all().count(), 1) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 1)
def test_tag_remove_not_exists_for_random_user(self): """ Detail page does not allow for removal of tags created by a different user """ login(self) user1 = random_user() idea = models.Idea(creator=user1, title='AAAA', state = models.State.objects.get(name='Active')) idea.save() add_tags(idea, 'AAA', None, user1, 'idea') response = self.client.get(reverse("idea:idea_detail", args=(str(idea.id),))) self.assertContains(response, 'aaa') self.assertNotContains(response, 'tag_remove')
def test_bad_idea(self): """ Test an incomplete POST submission to add an idea. """ login(self) self.assertEquals(models.Idea.objects.all().count(), 0) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 0) resp = self.client.post(reverse('idea:add_idea'), {'text':'test text'}) self.assertEqual(resp.status_code, 200) self.assertIn('This field is required.', resp.content) self.assertEquals(models.Idea.objects.all().count(), 0) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 0)
def test_tag_remove_not_exists_for_random_user(self): """ Detail page does not allow for removal of tags created by a different user """ login(self) user1 = random_user() idea = models.Idea(creator=user1, title='AAAA', state=models.State.objects.get(name='Active')) idea.save() add_tags(idea, 'AAA', None, user1, 'idea') response = self.client.get( reverse("idea:idea_detail", args=(str(idea.id), ))) self.assertContains(response, 'aaa') self.assertNotContains(response, 'tag_remove')
def test_must_be_logged_in(self): """ A user must be logged in to edit an idea. """ user = login(self) idea = create_idea(user=user) self.client.logout() resp = self.client.post(reverse('idea:edit_idea', args=(idea.id,)), {'title':'test title', 'summary':'test summary', 'text':'test text'}) self.assertEqual(resp.status_code, 302) self.assertIn('login', resp['Location'])
def test_good_vote(self): user = random_user() idea = models.Idea(creator=user, title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() login(self) resp = self.client.post( reverse('idea:upvote_idea'), { 'idea_id': idea.id, 'next': reverse('idea:idea_detail', args=(idea.id, )) }) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 1)
def test_bad_idea(self): """ Test an incomplete POST submission to add an idea. """ login(self) self.assertEquals(models.Idea.objects.all().count(), 0) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 0) resp = self.client.post(reverse('idea:add_idea'), {'text': 'test text'}) self.assertEqual(resp.status_code, 200) self.assertIn('This field is required.', resp.content) self.assertEquals(models.Idea.objects.all().count(), 0) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 0)
def test_edit_idea_with_private_banner(self, render): """ Verify that the private banner field auto-populates properly """ user = login(self) state = models.State.objects.get(name='Active') idea1 = models.Idea(creator=user, title='Transit subsidy to Venus', text='Aliens need assistance.', state=state) banner1 = models.Banner(id=1, title="AAAA", text="text1", start_date=date.today(), is_private=True) banner1.save() idea1.banner = banner1 idea1.save() idea2 = models.Idea(creator=user, title='Transit subsidy to Venus', text='Aliens need assistance.', state=state) banner2 = models.Banner(id=2, title="BBBB", text="text2", start_date=date.today()) banner2.save() idea2.banner = banner2 idea2.save() views.edit_idea(mock_req(user=user), idea1.id) context = render.call_args[0][2] self.assertTrue('form' in context) self.assertTrue(isinstance(context['form'], PrivateIdeaForm)) banner_field = context['form'].fields['banner'] selected = context['form'].initial['banner'] self.assertEqual(banner1.id, selected) self.assertEqual( context['form'].fields['banner'].widget.choices.field.empty_label, None) self.assertIn(banner1, banner_field._queryset) self.assertNotIn(banner2, banner_field._queryset) views.edit_idea(mock_req(user=user), idea2.id) context = render.call_args[0][2] self.assertTrue('form' in context) self.assertTrue(isinstance(context['form'], IdeaForm)) self.assertFalse(isinstance(context['form'], PrivateIdeaForm)) banner_field = context['form'].fields['banner'] selected = context['form'].initial['banner'] self.assertEqual(banner2.id, selected) self.assertEqual( context['form'].fields['banner'].widget.choices.field.empty_label, 'Select') self.assertNotIn(banner1, banner_field._queryset) self.assertIn(banner2, banner_field._queryset)
def test_vote_twice(self): """ When a vote exists from a user, the user should see the "Liked" button. When another vote_up function is called, the user should see the "Like" button and the initial vote should be deleted. """ idea = models.Idea(creator=random_user(), title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() #Login and create a vote login(self) resp = self.client.post( reverse('idea:upvote_idea'), { 'idea_id': idea.id, 'next': reverse('idea:idea_detail', args=(idea.id, )) }) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 1) #Check to see that the vote appears, and that button displays liked resp = self.client.get(reverse('idea:idea_detail', args=(idea.id, ))) self.assertContains(resp, 'value="Liked" id="vote_down"', status_code=200, html=False) #Click unlike and remove the vote and confirm it doesn't exist resp = self.client.post( reverse('idea:upvote_idea'), { 'idea_id': idea.id, 'next': reverse('idea:idea_detail', args=(idea.id, )) }) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 0) #Check to see that the button on page displays Like option resp = self.client.get(reverse('idea:idea_detail', args=(idea.id, ))) self.assertContains(resp, 'value="Like" id="vote_up"', status_code=200, html=False)
def test_anonymous_idea_hidden_name(self): user = random_user() state = models.State.objects.get(name='Active') state.save() idea = models.Idea(creator=user, title='AAAA', text='AA Text', state=state) idea.save() create_superuser() login(self) resp = self.client.get(reverse('idea:idea_detail', args=(idea.id,))) self.assertTrue(user.first_name in resp.content) idea2 = models.Idea(creator=user, title='BBBB', text='BB Text', state=state, is_anonymous=True) idea2.save() resp = self.client.get(reverse('idea:idea_detail', args=(idea2.id,))) self.assertFalse(user.first_name in resp.content)
def test_tagged_item_creator(self): """ Test tag fields from a normal POST submission to add an idea. """ user = login(self) self.assertEquals(models.Idea.objects.all().count(), 0) resp = self.client.post(reverse('idea:add_idea'), {'title':'test title', 'summary':'test summary', 'text':'test text', 'tags':'test, tags'}) tagged_items = TaggedItem.objects.filter(content_type__name='idea') self.assertEqual(2, tagged_items.count()) idea = models.Idea.objects.all()[0] for ti in tagged_items: self.assertEqual(user, ti.tag_creator)
def test_good_idea(self): """ Test an normal POST submission to add an idea. """ login(self) self.assertEquals(models.Idea.objects.all().count(), 0) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 0) resp = self.client.post( reverse('idea:add_idea'), { 'title': 'test title', 'summary': 'test summary', 'text': 'test text', 'tags': 'test, tags' }) self.assertContains(resp, 'Thanks for sharing your Idea') self.assertEquals(models.Idea.objects.all().count(), 1) num_voters = get_user_model().objects.filter(vote__idea__pk=1, vote__vote=1).count() self.assertEqual(num_voters, 1)
def test_edit_ignores_tags(self): """ A user must be logged in to edit an idea. """ user = login(self) idea = create_idea(user=user) resp = self.client.post(reverse('idea:edit_idea', args=(idea.id,)), {'title':'test title', 'summary':'test summary', 'text':'test text', 'tags':'sample, newtag'}) self.assertEqual(resp.status_code, 302) self.assertIn('detail', resp['Location']) refresh_idea = models.Idea.objects.get(id=idea.id) self.assertEqual(refresh_idea.tags.count(), 1) self.assertEqual(refresh_idea.tags.all()[0].name, "test tag")
def test_must_be_logged_in(self): """ A user must be logged in to edit an idea. """ user = login(self) idea = create_idea(user=user) self.client.logout() resp = self.client.post(reverse('idea:edit_idea', args=(idea.id, )), { 'title': 'test title', 'summary': 'test summary', 'text': 'test text' }) self.assertEqual(resp.status_code, 302) self.assertIn('login', resp['Location'])
def test_duplicate_idea(self): """ Test an duplicate POST submission to add an idea. """ login(self) self.assertEquals(models.Idea.objects.all().count(), 0) resp = self.client.post( reverse('idea:add_idea'), { 'title': 'test title', 'summary': 'test summary', 'text': 'test text', 'tags': 'test, tags' }) self.assertEquals(models.Idea.objects.all().count(), 1) resp = self.client.post( reverse('idea:add_idea'), { 'title': 'test title', 'summary': 'new summary', 'text': 'new text', 'tags': 'new, tags' }) self.assertEqual(resp.status_code, 302) self.assertIn('detail', resp['Location']) self.assertEquals(models.Idea.objects.all().count(), 1)
def test_bad_edit_idea(self): """ Test an incomplete POST submission to edit an idea. """ user = login(self) idea = create_idea(user=user) resp = self.client.post(reverse('idea:edit_idea', args=(idea.id,)), {'text':'new title'}) self.assertEqual(resp.status_code, 200) self.assertIn('This field is required.', resp.content) self.assertEquals(models.Idea.objects.all().count(), 1) refresh_idea = models.Idea.objects.get(id=idea.id) self.assertEqual(refresh_idea.title, idea.title) self.assertEqual(refresh_idea.banner, idea.banner)
def test_anonymous_comment_hidden_name(self): idea = create_idea() data = get_valid_form_data(idea) data['is_anonymous'] = True f = MPTTCommentForm(idea, data=data) c = f.get_comment_object() c.save() create_superuser() login(self) resp = self.client.get(reverse('idea:idea_detail', args=(idea.id, ))) self.assertFalse(data['name'] in resp.content) # add a second comment where anonymous = False data['is_anonymous'] = False data['comment'] = "new comment" f = MPTTCommentForm(idea, data=data) c = f.get_comment_object() c.save() resp = self.client.get(reverse('idea:idea_detail', args=(idea.id, ))) self.assertTrue(data['name'] in resp.content)
def test_bad_edit_idea(self): """ Test an incomplete POST submission to edit an idea. """ user = login(self) idea = create_idea(user=user) resp = self.client.post(reverse('idea:edit_idea', args=(idea.id, )), {'text': 'new title'}) self.assertEqual(resp.status_code, 200) self.assertIn('This field is required.', resp.content) self.assertEquals(models.Idea.objects.all().count(), 1) refresh_idea = models.Idea.objects.get(id=idea.id) self.assertEqual(refresh_idea.title, idea.title) self.assertEqual(refresh_idea.banner, idea.banner)
def test_anonymous_comment_hidden_name(self): idea = create_idea() data = get_valid_form_data(idea) data['is_anonymous'] = True f = MPTTCommentForm(idea, data=data) c = f.get_comment_object() c.save() create_superuser() login(self) resp = self.client.get(reverse('idea:idea_detail', args=(idea.id,))) self.assertFalse(data['name'] in resp.content) # add a second comment where anonymous = False data['is_anonymous'] = False data['comment'] = "new comment" f = MPTTCommentForm(idea, data=data) c = f.get_comment_object() c.save() resp = self.client.get(reverse('idea:idea_detail', args=(idea.id,))) self.assertTrue(data['name'] in resp.content)
def test_anonymous_idea_hidden_name(self): user = random_user() state = models.State.objects.get(name='Active') state.save() idea = models.Idea(creator=user, title='AAAA', text='AA Text', state=state) idea.save() create_superuser() login(self) resp = self.client.get(reverse('idea:idea_detail', args=(idea.id, ))) self.assertTrue(user.first_name in resp.content) idea2 = models.Idea(creator=user, title='BBBB', text='BB Text', state=state, is_anonymous=True) idea2.save() resp = self.client.get(reverse('idea:idea_detail', args=(idea2.id, ))) self.assertFalse(user.first_name in resp.content)
def test_tagged_item_creator(self): """ Test tag fields from a normal POST submission to add an idea. """ user = login(self) self.assertEquals(models.Idea.objects.all().count(), 0) resp = self.client.post( reverse('idea:add_idea'), { 'title': 'test title', 'summary': 'test summary', 'text': 'test text', 'tags': 'test, tags' }) tagged_items = TaggedItem.objects.filter(content_type__name='idea') self.assertEqual(2, tagged_items.count()) idea = models.Idea.objects.all()[0] for ti in tagged_items: self.assertEqual(user, ti.tag_creator)
def test_edit_idea_with_private_banner(self, render): """ Verify that the private banner field auto-populates properly """ user = login(self) state = models.State.objects.get(name='Active') idea1 = models.Idea(creator=user, title='Transit subsidy to Venus', text='Aliens need assistance.', state=state) banner1 = models.Banner(id=1, title="AAAA", text="text1", start_date=date.today(), is_private=True) banner1.save() idea1.banner = banner1 idea1.save() idea2 = models.Idea(creator=user, title='Transit subsidy to Venus', text='Aliens need assistance.', state=state) banner2 = models.Banner(id=2, title="BBBB", text="text2", start_date=date.today()) banner2.save() idea2.banner = banner2 idea2.save() views.edit_idea(mock_req(user=user), idea1.id) context = render.call_args[0][2] self.assertTrue('form' in context) self.assertTrue(isinstance(context['form'], PrivateIdeaForm)) banner_field = context['form'].fields['banner'] selected = context['form'].initial['banner'] self.assertEqual(banner1.id, selected) self.assertEqual(context['form'].fields['banner'].widget.choices.field.empty_label, None) self.assertIn(banner1, banner_field._queryset) self.assertNotIn(banner2, banner_field._queryset) views.edit_idea(mock_req(user=user), idea2.id) context = render.call_args[0][2] self.assertTrue('form' in context) self.assertTrue(isinstance(context['form'], IdeaForm)) self.assertFalse(isinstance(context['form'], PrivateIdeaForm)) banner_field = context['form'].fields['banner'] selected = context['form'].initial['banner'] self.assertEqual(banner2.id, selected) self.assertEqual(context['form'].fields['banner'].widget.choices.field.empty_label, 'Select') self.assertNotIn(banner1, banner_field._queryset) self.assertIn(banner2, banner_field._queryset)
def test_edit_ignores_tags(self): """ A user must be logged in to edit an idea. """ user = login(self) idea = create_idea(user=user) resp = self.client.post( reverse('idea:edit_idea', args=(idea.id, )), { 'title': 'test title', 'summary': 'test summary', 'text': 'test text', 'tags': 'sample, newtag' }) self.assertEqual(resp.status_code, 302) self.assertIn('detail', resp['Location']) refresh_idea = models.Idea.objects.get(id=idea.id) self.assertEqual(refresh_idea.tags.count(), 1) self.assertEqual(refresh_idea.tags.all()[0].name, "test tag")
def test_edit_good_idea(self): """ Test an normal POST submission to edit an idea. """ user = login(self) idea = create_idea(user=user) self.assertEquals(models.Idea.objects.all().count(), 1) new_title = "new title" new_summary = "new summary" new_text = "new text" new_banner = models.Banner(id=2, title="BBB", text="text2", start_date=date.today()) new_banner.save() resp = self.client.post( reverse('idea:edit_idea', args=(idea.id, )), { 'title': new_title, 'summary': new_summary, 'text': new_text, 'banner': new_banner.id }) self.assertEqual(resp.status_code, 302) self.assertIn('detail', resp['Location']) self.assertEquals(models.Idea.objects.all().count(), 1) # ensure editing an idea does not up the vote count # vote count is 0 because votes are added in views.add_idea, which is not used in this test num_voters = get_user_model().objects.filter(vote__idea__pk=idea.id, vote__vote=1).count() self.assertEqual(num_voters, 0) refresh_idea = models.Idea.objects.get(id=idea.id) self.assertEqual(refresh_idea.title, new_title) self.assertEqual(refresh_idea.summary, new_summary) self.assertEqual(refresh_idea.text, new_text) self.assertEqual(refresh_idea.banner, new_banner) # verify the expected fields remain the same self.assertEqual(refresh_idea.tags.count(), 1) self.assertEqual(refresh_idea.tags.all()[0].name, "test tag") self.assertEqual(refresh_idea.creator, idea.creator)
def test_edit_good_idea(self): """ Test an normal POST submission to edit an idea. """ user = login(self) idea = create_idea(user=user) self.assertEquals(models.Idea.objects.all().count(), 1) new_title = "new title" new_summary = "new summary" new_text = "new text" new_banner = models.Banner(id=2, title="BBB", text="text2", start_date=date.today()) new_banner.save() resp = self.client.post(reverse('idea:edit_idea', args=(idea.id,)), {'title':new_title, 'summary':new_summary, 'text':new_text, 'banner': new_banner.id}) self.assertEqual(resp.status_code, 302) self.assertIn('detail', resp['Location']) self.assertEquals(models.Idea.objects.all().count(), 1) # ensure editing an idea does not up the vote count # vote count is 0 because votes are added in views.add_idea, which is not used in this test num_voters = get_user_model().objects.filter(vote__idea__pk=idea.id, vote__vote=1).count() self.assertEqual(num_voters, 0) refresh_idea = models.Idea.objects.get(id=idea.id) self.assertEqual(refresh_idea.title, new_title) self.assertEqual(refresh_idea.summary, new_summary) self.assertEqual(refresh_idea.text, new_text) self.assertEqual(refresh_idea.banner, new_banner) # verify the expected fields remain the same self.assertEqual(refresh_idea.tags.count(), 1) self.assertEqual(refresh_idea.tags.all()[0].name, "test tag") self.assertEqual(refresh_idea.creator, idea.creator)