def test_new_to_review_mails(self): author = testing.create_user() reviewer_a = testing.create_user(perms=['content.review']) testing.create_user(perms=['content.review']) # There are two reviewers, both should receive an email about the new # article added by Alice. article = Article.create_for_testing(author) send_new_to_review_mails(article) self.assertEqual(len(mail.outbox), 2) # Only one email should be sent when an approver adds a new article - # only the other one can review it. article = Article.create_for_testing(reviewer_a) send_new_to_review_mails(article) self.assertEqual(len(mail.outbox), 3) # https://github.com/ppiet/piosenka/issues/8 # Set the first reviewers's email to empty - they should now be skipped, # but the other reviewer should be notified. reviewer_a.email = '' reviewer_a.save() article = Article.create_for_testing(author) send_new_to_review_mails(article) self.assertEqual(len(mail.outbox), 4)
def test_item_approved_mail(self): author = testing.create_user() reviewer = testing.create_user(perms=['content.review']) self.assertEqual(len(mail.outbox), 0) article = Article.create_for_testing(author) send_item_approved_mail(article, reviewer) self.assertEqual(len(mail.outbox), 1)
def test_invite_view_post_valid(self): email_address = '*****@*****.**' data = {'email_address': email_address} self.assertEqual( 0, len(Invitation.objects.filter(email_address=email_address))) anonymous_client = testing.get_client() response = anonymous_client.post(reverse('invite'), data, follow=True) self.assertRedirects(response, self._INVITE_LOGIN_URL) self.assertEqual( 0, len(Invitation.objects.filter(email_address=email_address))) regular_client = testing.get_client(testing.create_user()) response = regular_client.post(reverse('invite'), data) self.assertEqual(403, response.status_code) self.assertEqual( 0, len(Invitation.objects.filter(email_address=email_address))) self.assertEqual(0, len(mail.outbox)) allowed_client = testing.get_client(testing.create_user( perms=['piosenka.invite'])) response = allowed_client.post(reverse('invite'), data) self.assertEqual(302, response.status_code) self.assertRedirects(response, reverse('index')) # Redirect on success. self.assertEqual( 1, len(Invitation.objects.filter(email_address=email_address))) self.assertEqual(1, len(mail.outbox)) self.assertEqual([email_address], mail.outbox[0].to)
def test_invite_view_post_empty(self): anonymous_client = testing.get_client() response = anonymous_client.post(reverse('invite'), follow=True) self.assertRedirects(response, self._INVITE_LOGIN_URL) regular_client = testing.get_client(testing.create_user()) response = regular_client.post(reverse('invite')) self.assertEqual(403, response.status_code) allowed_client = testing.get_client(testing.create_user( perms=['piosenka.invite'])) response = allowed_client.post(reverse('invite')) self.assertEqual(200, response.status_code)
def test_event_visibility(self): response = testing.get_public_client().get(reverse('event_index')) self.assertEqual(200, response.status_code) author = testing.create_user() venue = Venue.create_for_testing() event_a = Event.create_for_testing(author, venue) event_a.reviewed = True event_a.save() event_b = Event.create_for_testing(author, venue) event_b.reviewed = False event_b.save() # The general public should see only the reviewed event. response = testing.get_public_client().get(reverse('event_index')) self.assertEqual(200, response.status_code) self.assertEqual(1, len(response.context['events'])) # The author should see both. response = testing.get_user_client(author).get(reverse('event_index')) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context['events'])) # Another regular user should also see both. response = testing.get_user_client().get(reverse('event_index')) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context['events']))
def test_join_view_post_valid(self): email_address = '*****@*****.**' invitation = Invitation.create_for_testing(email_address, testing.create_user()) self.assertTrue(invitation.is_valid) anonymous_client = testing.get_client() response = anonymous_client.post(invitation.get_invitation_url(), self._JOIN_DATA) self.assertRedirects(response, reverse('index')) # Redirect on success. invitation.refresh_from_db() self.assertFalse(invitation.is_valid) self.assertEqual(1, len(User.objects.filter(email=email_address))) new_user = User.objects.get(email=email_address) self.assertEqual(1, new_user.groups.count()) self.assertEqual('everyone', new_user.groups.values_list('name', flat=True)[0]) another_client = testing.get_client() response = another_client.post(invitation.get_invitation_url(), self._JOIN_DATA) self.assertEqual(404, response.status_code) response = another_client.get(invitation.get_invitation_url()) self.assertEqual(404, response.status_code)
def test_join_view_get(self): invitation = Invitation.create_for_testing('*****@*****.**', testing.create_user()) anonymous_client = testing.get_client() response = anonymous_client.get(invitation.get_invitation_url()) self.assertEqual(200, response.status_code) regular_client = testing.get_client(testing.create_user()) response = regular_client.get(invitation.get_invitation_url()) self.assertEqual(404, response.status_code) allowed_client = testing.get_client(testing.create_user( perms=['piosenka.invite'])) response = allowed_client.get(invitation.get_invitation_url()) self.assertEqual(404, response.status_code)
def test_entity_index(self): author = testing.create_user() jack_white = Entity.create_for_testing() seven_nations_army = Song.create_for_testing(author) self.add_contribution(seven_nations_army, jack_white, True) jolene = Song.create_for_testing(author) self.add_contribution(jolene, jack_white, True) # Approve only Jolene. seven_nations_army.reviewed = False seven_nations_army.save() jolene.reviewed = True jolene.save() # General public should see only Jolene. response = testing.get_public_client().get( jack_white.get_absolute_url()) self.assertEqual(200, response.status_code) self.assertEqual(1, len(response.context['songs'])) # The author should see both. response = testing.get_user_client(author).get( jack_white.get_absolute_url()) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context['songs'])) # Any logged-in user should see both, too. response = testing.get_user_client().get(jack_white.get_absolute_url()) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context['songs']))
def test_edit_item(self): author = testing.create_user() item = self.item_cls.create_for_testing(author) response = testing.get_public_client().get(item.get_edit_url()) self.assertEqual(302, response.status_code) response = testing.get_user_client(author).get(item.get_edit_url()) self.assertEqual(200, response.status_code)
def test_edit_song_note(self): author = testing.create_user() note = SongNote.create_for_testing(author) data = {'title': 'tytul', 'text_trevor': put_text_in_trevor('CDE')} response = testing.get_user_client(user=author).post( note.get_edit_url(), data=data) self.assertEqual(302, response.status_code) self.assertRedirects(response, note.song.get_absolute_url())
def test_add_item(self): # Verify that the general public can't access the add view. response = testing.get_public_client().get(self.get_add_url()) self.assertEqual(302, response.status_code) # Authenticated user should be able to access it just fine. authorized_user = testing.create_user() response = testing.get_user_client(authorized_user).get(self.get_add_url()) self.assertEqual(200, response.status_code)
def get_add_url(self): author = testing.create_user() artist = Artist.create_for_testing(author) artist.reviewed = True artist.save() song = Song.create_for_testing(author) song.reviewed = True song.full_clean() song.save() return song.get_add_note_url()
def test_review_item(self): """Tests the review helper view.""" # Add a new item. author = testing.create_user() item = self.item_cls.create_for_testing(author) self.assertFalse(item.is_live()) # Verify that anonymous user is redirected to login. response = testing.get_public_client().get(item.get_review_url()) self.assertEqual(302, response.status_code) self.assertTrue(reverse('hello') in response.url) # The author should be redirected to the actual item with some # informative message. response = testing.get_client(author).get( item.get_review_url(), follow=True) self.assertRedirects(response, item.get_absolute_url()) self.assertTrue('messages' in response.context) self.assertEqual(1, len(response.context['messages'])) # Another regular user should be redirected too. response = testing.get_user_client().get( item.get_review_url(), follow=True) self.assertRedirects(response, item.get_absolute_url()) self.assertTrue('messages' in response.context) self.assertEqual(1, len(response.context['messages'])) # And the valid approver too. reviewer = testing.create_user(perms=['content.review']) response = testing.get_client(reviewer).get( item.get_review_url(), follow=True) self.assertRedirects(response, item.get_absolute_url()) self.assertTrue('messages' in response.context) self.assertEqual(1, len(response.context['messages'])) # After the item is live too. item.reviewed = True item.save() response = testing.get_client(reviewer).get( item.get_review_url(), follow=True) self.assertRedirects(response, item.get_absolute_url()) self.assertTrue('messages' in response.context) self.assertEqual(1, len(response.context['messages']))
def test_to_review(self): login_url = reverse('hello') + '?next=' + reverse('to_review') response = testing.get_public_client().get(reverse('to_review')) self.assertEqual(302, response.status_code) self.assertRedirects(response, login_url) response = testing.get_user_client().get(reverse('to_review')) self.assertEqual(403, response.status_code) user = testing.create_user(perms=['content.review']) response = testing.get_user_client(user).get(reverse('to_review')) self.assertEqual(200, response.status_code)
def test_site_urls(self): login_url = reverse('hello') + '?next=' + reverse('inspect_locale') response = testing.get_public_client().get(reverse('inspect_locale')) self.assertEqual(302, response.status_code) self.assertRedirects(response, login_url) response = testing.get_user_client().get(reverse('inspect_locale')) self.assertEqual(403, response.status_code) user = testing.create_user(perms=['piosenka.inspect']) response = testing.get_user_client(user).get(reverse('inspect_locale')) self.assertEqual(200, response.status_code)
def test_approve_item(self): """Tests the approve view.""" # Add a new item. author = testing.create_user() item = self.item_cls.create_for_testing(author) self.assertFalse(item.is_live()) # Verify that the general public can't access the item. response = testing.get_public_client().get(item.get_absolute_url()) self.assertNotServedOk(item, response) # Try to approve the item - the author can't do that. response = testing.get_user_client(author).get( item.get_approve_url()) self.assertEqual(404, response.status_code) item.refresh_from_db() self.assertFalse(item.is_live()) # Try to approve the item - another regular user cannot. response = testing.get_user_client().get(item.get_approve_url()) self.assertEqual(404, response.status_code) item.refresh_from_db() self.assertFalse(item.is_live()) # Try to approve the item - reviewer can and does. reviewer = testing.create_user(perms=['content.review']) response = testing.get_user_client(reviewer).get(item.get_approve_url()) self.assertEqual(302, response.status_code) item.refresh_from_db() self.assertTrue(item.is_live()) # General public should now be able to access the item. response = testing.get_public_client().get(item.get_absolute_url()) self.assertServedOk(item, response) # The reviewer should still be able to access the item. Ideally we'd # verify that the 'approve' link is no longer displayed here anymore. response = testing.get_user_client(reviewer).get( item.get_absolute_url()) self.assertServedOk(item, response)
def test_join_view_post_empty(self): email_address = '*****@*****.**' invitation = Invitation.create_for_testing(email_address, testing.create_user()) self.assertTrue(invitation.is_valid) anonymous_client = testing.get_client() response = anonymous_client.post(invitation.get_invitation_url()) self.assertEqual(200, response.status_code) invitation.refresh_from_db() self.assertTrue(invitation.is_valid) self.assertEqual(0, len(User.objects.filter(email=email_address)))
def setUp(self): author = testing.create_user() song = Song.create_for_testing(author) entity = Entity.create_for_testing() contribution = EntityContribution() contribution.song = song contribution.entity = entity contribution.texted = True contribution.save() song.old_slug = "some-old-slug" song.reviewed = True song.save() self.song = song self.entity = entity
def test_join_view_expired(self): email_address = '*****@*****.**' invitation = Invitation.create_for_testing(email_address, testing.create_user()) invitation.expires_on = timezone.now() - timedelta(days=1) invitation.save() self.assertTrue(invitation.is_valid) anonymous_client = testing.get_client() response = anonymous_client.post(invitation.get_invitation_url(), self._JOIN_DATA) self.assertEqual(404, response.status_code) invitation.refresh_from_db() self.assertTrue(invitation.is_valid) self.assertEqual(0, len(User.objects.filter(email=email_address)))
def test_view_new_item(self): author = testing.create_user() item = self.item_cls.create_for_testing(author) item.save() # Verify that the general public can't access the item. self.assertFalse(item.is_live()) response = testing.get_public_client().get(item.get_absolute_url()) self.assertNotServedOk(item, response) # Verify that the author can. response = testing.get_user_client(author).get(item.get_absolute_url()) self.assertServedOk(item, response) # Verify that another signed-in user can, too. response = testing.get_user_client().get(item.get_absolute_url()) self.assertServedOk(item, response)
def test_add_item(self): if self.item_cls.is_card: return # Verify that the general public can't access the add view. response = testing.get_public_client().get(self.item_cls.get_add_url()) self.assertEqual(302, response.status_code) # Verify that unauthorized user can't access it either. response = testing.get_user_client().get(self.item_cls.get_add_url()) self.assertEqual(404, response.status_code) # Authorized user should be able to access it just fine. authorized_user = testing.create_user( perms=[self.item_cls.permstring()]) response = testing.get_user_client(authorized_user).get( self.item_cls.get_add_url()) self.assertEqual(200, response.status_code)
def test_add_song_empty_form(self): user = testing.create_user() data = { 'entitycontribution_set-TOTAL_FORMS': 1, 'entitycontribution_set-INITIAL_FORMS': 0, 'entitycontribution_set-MIN_NUM_FORMS': 1, 'entitycontribution_set-MAX_NUM_FORMS': 1000, } response = testing.get_user_client(user=user).post( reverse('add_song'), data=data) self.assertEqual(200, response.status_code) self.assertFormError(response, 'form', 'title', 'To pole jest wymagane.') self.assertFormError(response, 'form', 'capo_fret', 'To pole jest wymagane.') self.assertFormError(response, 'form', 'lyrics', 'To pole jest wymagane.') self.assertFormsetError(response, 'entitycontribution', 0, 'artist', 'To pole jest wymagane.') self.assertFormsetError(response, 'entitycontribution', 0, None, 'Zaznacz co najmniej jedną rolę artysty.')
def test_add_song_note(self): user = testing.create_user() artist = Artist.create_for_testing(user) artist.reviewed = True artist.full_clean() artist.save() song = Song.create_for_testing(user) song.reviewed = True song.full_clean() song.save() data = { 'title': 'dalsze losy kotka', 'text_trevor': put_text_in_trevor('Abc') } self.assertEqual(len(SongNote.objects.all()), 0) response = testing.get_user_client(user=user).post( song.get_add_note_url(), data=data) self.assertEqual(302, response.status_code) self.assertRedirects(response, song.get_absolute_url()) self.assertEqual(len(SongNote.objects.all()), 1)
def test_add_song(self): user = testing.create_user() artist = Artist.create_for_testing(user) artist.reviewed = True artist.save() data = { 'title': 'wlazlkotek', 'capo_fret': 0, 'lyrics': 'wlazl kotek na plotek', 'entitycontribution_set-TOTAL_FORMS': 1, 'entitycontribution_set-INITIAL_FORMS': 0, 'entitycontribution_set-MIN_NUM_FORMS': 1, 'entitycontribution_set-MAX_NUM_FORMS': 1000, 'entitycontribution_set-0-artist': artist.pk, 'entitycontribution_set-0-texted': True, } response = testing.get_user_client(user=user).post( reverse('add_song'), data=data) self.assertRedirects(response, '/opracowanie/' + artist.name + '-wlazlkotek/') song = Song.objects.get(title='wlazlkotek') self.assertEqual('wlazl kotek na plotek', song.lyrics)
def test_blog_index(self): response = testing.get_public_client().get(reverse("post_index")) self.assertEqual(200, response.status_code) author = testing.create_user() post_a = Post.create_for_testing(author) post_a.reviewed = True post_a.save() post_b = Post.create_for_testing(author) post_b.reviewed = False post_b.save() response = testing.get_public_client().get(reverse("post_index")) self.assertEqual(200, response.status_code) self.assertEqual(1, len(response.context["all_posts"])) response = testing.get_user_client(author).get(reverse("post_index")) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context["all_posts"])) response = testing.get_user_client().get(reverse("post_index")) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context["all_posts"]))
def test_article_index(self): response = testing.get_public_client().get(reverse('articles')) self.assertEqual(200, response.status_code) author = testing.create_user() article_a = Article.create_for_testing(author) article_a.reviewed = True article_a.save() article_b = Article.create_for_testing(author) article_b.reviewed = False article_b.save() response = testing.get_public_client().get(reverse('articles')) self.assertEqual(200, response.status_code) self.assertEqual(1, len(response.context['articles'])) response = testing.get_user_client(author).get(reverse('articles')) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context['articles'])) response = testing.get_user_client().get(reverse('articles')) self.assertEqual(200, response.status_code) self.assertEqual(2, len(response.context['articles']))
def test_cannot_add_song_note_if_song_not_reviewed(self): user = testing.create_user() artist = Artist.create_for_testing(user) artist.reviewed = True artist.full_clean() artist.save() song = Song.create_for_testing(user) song.reviewed = True song.full_clean() song.save() url = song.get_add_note_url() song.reviewed = False song.full_clean() song.save() data = { 'title': 'dalsze losy kotka', 'text_trevor': put_text_in_trevor('Abc') } response = testing.get_user_client(user=user).post(url, data=data) self.assertEqual(404, response.status_code) self.assertEqual(len(SongNote.objects.all()), 0)
def test_user_menu(self): response = testing.get_user_client().get(reverse('index')) self.assertEqual(200, response.status_code) self.assertNotContains(response, reverse('hello'), html=False) self.assertContains(response, reverse('goodbye'), html=False) self.assertNotContains(response, reverse('add_article'), html=False) self.assertNotContains(response, reverse('add_event'), html=False) self.assertNotContains(response, reverse('add_post'), html=False) self.assertNotContains(response, reverse('add_song'), html=False) user = testing.create_user(perms=[Article.permstring()]) response = testing.get_user_client(user).get(reverse('index')) self.assertEqual(200, response.status_code) self.assertNotContains(response, reverse('hello'), html=False) self.assertContains(response, reverse('goodbye'), html=False) self.assertContains(response, reverse('add_article'), html=False) self.assertNotContains(response, reverse('add_event'), html=False) self.assertNotContains(response, reverse('add_post'), html=False) self.assertNotContains(response, reverse('add_song'), html=False) user = testing.create_user(perms=[Event.permstring()]) response = testing.get_user_client(user).get(reverse('index')) self.assertEqual(200, response.status_code) self.assertNotContains(response, reverse('hello'), html=False) self.assertContains(response, reverse('goodbye'), html=False) self.assertNotContains(response, reverse('add_article'), html=False) self.assertContains(response, reverse('add_event'), html=False) self.assertNotContains(response, reverse('add_post'), html=False) self.assertNotContains(response, reverse('add_song'), html=False) user = testing.create_user(perms=[Post.permstring()]) response = testing.get_user_client(user).get(reverse('index')) self.assertEqual(200, response.status_code) self.assertNotContains(response, reverse('hello'), html=False) self.assertContains(response, reverse('goodbye'), html=False) self.assertNotContains(response, reverse('add_article'), html=False) self.assertNotContains(response, reverse('add_event'), html=False) self.assertContains(response, reverse('add_post'), html=False) self.assertNotContains(response, reverse('add_song'), html=False) user = testing.create_user(perms=[Song.permstring()]) response = testing.get_user_client(user).get(reverse('index')) self.assertEqual(200, response.status_code) self.assertNotContains(response, reverse('hello'), html=False) self.assertContains(response, reverse('goodbye'), html=False) self.assertNotContains(response, reverse('add_article'), html=False) self.assertNotContains(response, reverse('add_event'), html=False) self.assertNotContains(response, reverse('add_post'), html=False) self.assertContains(response, reverse('add_song'), html=False) user = testing.create_user(perms=[Article.permstring(), Event.permstring(), Post.permstring(), Song.permstring()]) response = testing.get_user_client(user).get(reverse('index')) self.assertEqual(200, response.status_code) self.assertNotContains(response, reverse('hello'), html=False) self.assertContains(response, reverse('goodbye'), html=False) self.assertContains(response, reverse('add_article'), html=False) self.assertContains(response, reverse('add_event'), html=False) self.assertContains(response, reverse('add_post'), html=False) self.assertContains(response, reverse('add_song'), html=False)