def test_exclude_private_tags(self, render): """ Check that the tag list does not include tags only used for private banners """ user = random_user() state = models.State.objects.get(name='Active') state.save() pub_banner = create_banner('Public') priv_banner = create_banner('Private', is_private=True) pub_idea = models.Idea(creator=user, title='AAAA', text='AAAA Text', state=state, banner_id=pub_banner.id) pub_idea.save() priv_idea = models.Idea(creator=user, title='BBBB', text='BBBB Text', state=state, banner_id=priv_banner.id) priv_idea.save() pub_idea.tags.add('bbb', 'ccc', 'ddd') priv_idea.tags.add('ddd', 'eee', 'fff') views.list(mock_req()) context = render.call_args[0][2] self.assertTrue('tags' in context) self.assertEqual(3, len(context['tags'])) self.assertEqual(set(['bbb', 'ccc', 'ddd']), set([t.name for t in context['tags']]))
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_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_tags_top_list(self, render): """ Tag list should be in proper order. """ user = random_user() state = models.State.objects.get(name='Active') state.save() # Make 13 tags, and assign each to a set of ideas for count in range(30): tag = str(count) * 4 for i in range(count + 1): idea = models.Idea(creator=user, title=str(i) * 4, text=str(i) * 4 + ' Text', state=state) idea.save() idea.tags.add(tag) views.list(mock_req()) context = render.call_args[0][2] self.assertTrue('tags' in context) self.assertEqual(25, len(context['tags'])) # 29292929, 28282828, 27272727, ... self.assertEqual([str(i) * 4 for i in range(29, 4, -1)], [t.name for t in context['tags']])
def test_vote_twice(self): """ Voting twice shouldn't do anything to the vote count (it's idempotent). """ idea = models.Idea(creator=random_user(), title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() self.client.login(username='******', password='******') resp = self.client.post( reverse('upvote_idea'), { 'idea_id': idea.id, 'next': reverse('idea_detail', args=(idea.id, )) }) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 1) resp = self.client.post( reverse('upvote_idea'), { 'idea_id': idea.id, 'next': reverse('idea_detail', args=(idea.id, )) }) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 1)
def test_tags_count(self, render): """ Tag list should include tag count. """ user = random_user() state = models.State.objects.get(name='Active') state.save() self._generate_data(entry_data=None) # Make 13 tags, and assign each to a set of ideas for count in range(13): tag = str(count) * 4 for i in range(count + 1): idea = models.Idea(creator=user, title=str(i) * 4, text=str(i) * 4 + ' Text', state=state, banner_id=1) idea.save() idea.tags.add(tag) views.challenge_detail(mock_req(), banner_id=1) context = render.call_args[0][2] self.assertTrue('tags' in context) for i in range(12, 2, -1): tag = context['tags'][12 - i] self.assertTrue(hasattr(tag, 'count')) self.assertEqual(i + 1, tag.count)
def create_idea(): 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() return idea
def test_tags_count(self, render): """ Tag list should include tag count. """ user = random_user() state = models.State.objects.get(name='Active') state.save() # Make 13 tags, and assign each to a set of ideas for count in range(13): tag = str(count) * 4 for i in range(count + 1): idea = models.Idea(creator=user, title=str(i) * 4, text=str(i) * 4 + ' Text', state=state) idea.save() idea.tags.add(tag) # create some dummy tags for private banner ideas # these tags should not be reflected in the tag count banner = models.Banner(id=1, title="XXXX", text="text", is_private=True, start_date=datetime.date.today()) banner.save() for count in range(5): tag = str(count) * 4 for i in range(count + 1): idea = models.Idea(creator=user, title=str(i) * 4 + '2', text=str(i) * 42 + ' Text', state=state, banner_id=1) idea.save() idea.tags.add(tag) views.list(mock_req()) context = render.call_args[0][2] self.assertTrue('tags' in context) for i in range(12, 2, -1): tag = context['tags'][12 - i] self.assertTrue(hasattr(tag, 'count')) self.assertEqual(i + 1, tag.count)
def test_idea_correct(self, render): """ The idea passed to the ui should be that identified by the id. """ user = User.objects.create_user('example') state = models.State.objects.get(name='Active') idea1 = models.Idea(creator=user, title='title', text='text', state=state) idea2 = models.Idea(creator=user, title='title', text='text', state=state) idea1.save() idea2.save() views.detail(mock_req(), str(idea2.id)) context = render.call_args[0][2] self.assertTrue('idea' in context) self.assertEqual(idea2.id, context['idea'].id) self.assertEqual(idea2.title, context['idea'].title)
def test_members(self): user = random_user() idea = models.Idea(creator=user, title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() self.assertEqual(len(idea.members), 1) self.assertIn(user, idea.members)
def test_404s(self): """ Should get a 404 when using a bad idea_id. """ user = User.objects.create_user('example') state = models.State.objects.get(name='Active') idea = models.Idea(creator=user, title='title', text='text', state=state) idea.save() self.assertRaises(Http404, views.detail, mock_req(), '1234')
def make_idea(nonce, title): kwargs = { 'creator': user, 'title': title, 'text': title + ' Text', 'state': state } paramfn(kwargs, nonce) idea = models.Idea(**kwargs) idea.save() postfn(idea, nonce) return idea
def test_tag_form_exists(self, render): """ Detail page should have a form for adding tags. """ idea = models.Idea(creator=random_user(), title='AAAA', state = models.State.objects.get(name='Active')) idea.save() views.detail(mock_req(), str(idea.id)) context = render.call_args[0][2] self.assertTrue('tag_form' in context) self.assertTrue(isinstance(context['tag_form'], IdeaTagForm))
def test_tag_remove_not_exists_for_different_idea(self): """ Detail page does not allow for removal of tags created by a different user """ user1 = login(self) user2 = random_user() idea = models.Idea(creator=user1, title='AAAA', state=models.State.objects.get(name='Active')) idea.save() idea2 = models.Idea(creator=user2, title='BBBB', state=models.State.objects.get(name='Active')) idea2.save() add_tags(idea, 'AAA', None, user1, 'idea') add_tags(idea2, 'AAA', None, user2, 'idea') response = self.client.get( reverse("idea:idea_detail", args=(str(idea2.id), ))) self.assertContains(response, 'aaa') self.assertNotContains(response, 'tag_remove')
def test_similar(self, render): """ List of similar ideas should make sense. """ class Mock(): pass with patch('idea.views.more_like_text') as mlt: backend.SearchBackend().clear() user = random_user() state = models.State.objects.get(name='Active') similar1 = models.Idea(creator=user, title='airplanes', state=state, text="Title is enough said.") similar1.save() similar2 = models.Idea(creator=user, title='exexex', state=state, text="I, too, love submarines.") similar2.save() models.Idea(creator=user, title='AAAAAA', state=state, text='BBBBBB').save() m1, m2 = Mock(), Mock() m1.object = similar1 m2.object = similar2 mlt.return_value = [m1, m2] views.add_idea( mock_req('/?idea_title=' + 'Airplanes%20and%20submarines')) context = render.call_args[0][2] self.assertTrue('similar' in context) self.assertEqual(2, len(context['similar'])) self.assertEqual(set(context['similar']), set([similar1, similar2]))
def test_must_logged_in(self): """ A user must be logged in to vote. """ idea = models.Idea(creator=random_user(), title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() resp = self.client.post( reverse('upvote_idea'), { 'idea_id': idea.id, 'next': reverse('idea_detail', args=(idea.id, )) }) self.assertIn('up', resp['Location'])
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_tag_remove_exists_for_creator(self): """ Detail page allows for removal of tags created by the current user """ user1 = login(self) 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.assertContains(response, 'tag_remove')
def create_idea(user=None): if not user: user = random_user() state = models.State.objects.get(name='Active') idea = models.Idea(creator=user, title='Transit subsidy to Mars', text='Aliens need assistance.', state=state) banner = models.Banner(id=1, title="AAAA", text="text1", start_date=date.today()) banner.save() idea.banner = banner idea.save() idea.tags.add("test tag") return idea
def test_idea_no_support(self, render): """ Check support = False if no votes. """ user = random_user() state = models.State.objects.get(name='Active') idea = models.Idea(creator=user, title='title', text='text', state=state) idea.save() for _ in range(7): models.Vote(creator=random_user(), idea=idea).save() views.detail(mock_req(), str(idea.id)) context = render.call_args[0][2] self.assertTrue('support' in context) self.assertFalse(context['support'])
def test_edit_idea_tag(self): """ Check that adding a new idea allows the associated tag to be immediately searchable. """ idea = models.Idea(creator=random_user(), title='title', state=models.State.objects.get(name='Active')) idea.save() results = backend.SearchBackend().search('example_tag') self.assertEqual(0, results['hits']) req = RequestFactory().post('/', {'tags': 'example_tag'}) req.user = random_user() views.detail(req, str(idea.id)) results = backend.SearchBackend().search('example_tag') self.assertEqual(1, results['hits'])
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() self.client.login(username='******', password='******') resp = self.client.post( reverse('upvote_idea'), { 'idea_id': idea.id, 'next': reverse('idea_detail', args=(idea.id, )) }) self.assertEqual(resp.status_code, 302) self.assertEqual(len(idea.vote_set.all()), 1)
def test_tag_form_submission(self): """ Detail page tag form submission should add tags. """ idea = models.Idea(creator=random_user(), title='AAAA', state=models.State.objects.get(name='Active')) idea.save() idea.tags.add('aaa', 'bbb', 'ccc') req = RequestFactory().post('/', {'tags': 'DDD, EEE, ZZZ,'}) req.user = random_user() views.detail(req, str(idea.id)) idea = models.Idea.objects.get(id=idea.id) tags = set([tag.name for tag in idea.tags.all()]) self.assertEqual(set(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'zzz']), tags)
def test_like_display(self): user = random_user() idea = models.Idea( creator=user, title='We need more meetings', text='Seriously - more meetings are productivity++.', state=self.state) idea.save() self.client.login(username='******', password='******') 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_members_with_voters(self): user = random_user() idea = models.Idea(creator=user, title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() voter = random_user() self.assertNotEqual(user, voter) vote = models.Vote() vote.idea = idea vote.creator = voter vote.save() self.assertEqual(len(idea.members), 1) self.assertNotIn(voter, idea.members) self.assertIn(user, idea.members)
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_tags(self, render): """ Include a sorted list of tags for this idea. """ user = random_user() state = models.State.objects.get(name='Active') idea = models.Idea(creator=user, title='title', text='text', state=state) idea.save() tags = [str(random.randint(11111, 99999)) for _ in range(20)] idea.tags.add(*tags) views.detail(mock_req(), str(idea.id)) context = render.call_args[0][2] self.assertTrue('tags' in context) self.assertEqual(20, len(context['tags'])) tags.sort() self.assertEqual(tags, [tag.name for tag in context['tags']])
def test_idea_voters(self, render): """ The idea passed to the ui should have the correct voters. """ user = User.objects.create_user('example') state = models.State.objects.get(name='Active') idea = models.Idea(creator=user, title='title', text='text', state=state) idea.save() users = [] for i in range(5): users.append(User.objects.create_user('example' + str(i))) models.Vote(creator=users[i], idea=idea).save() views.detail(mock_req(), str(idea.id)) context = render.call_args[0][2] self.assertTrue('voters' in context) self.assertEqual(5, len(context['voters'])) self.assertEqual(set([u.id for u in users]), set([v.id for v in context['voters']]))
def test_members_with_comment_by_same_user(self): user = random_user() idea = models.Idea(creator=user, title='Transit subsidy to Mars', text='Aliens need assistance.', state=self.state) idea.save() commenter = user comment = MPTTComment() comment.user = commenter comment.content_object = idea comment.comment = 'Test' comment.is_public = True comment.is_removed = False comment.site_id = 1 comment.submit_date = datetime.now() comment.save() self.assertEqual(len(idea.members), 1) self.assertIn(user, idea.members)
def test_tags_exist(self, render): """ Check that the tag list is populated and only shows the top ten tags. """ user = random_user() state = models.State.objects.get(name='Active') state.save() idea = models.Idea(creator=user, title='AAAA', text='AAAA Text', state=state) idea.save() idea.tags.add('bbb', 'ccc', 'ddd') views.list(mock_req()) context = render.call_args[0][2] self.assertTrue('tags' in context) self.assertEqual(3, len(context['tags'])) self.assertEqual(set(['bbb', 'ccc', 'ddd']), set([t.name for t in context['tags']]))