def test_not_create_post_if_invalid_status(self): data = {'title': 'Test Post', 'body': 'A test post.', 'status': 'A'} user = create_user() login_user(self.client, user) response = self.client.post(self.base_url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_not_create_post_if_title_missing(self): data = {'body': 'A test post.', 'status': 'D'} user = create_user() login_user(self.client, user) response = self.client.post(self.base_url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_logout_logged_in_user(self): user = create_user() login_user(self.client, user) response = self.client.delete(self.base_url) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) self.assertEqual(response.data, None)
def test_create_post_if_status_missing(self): data = {'title': 'Test Post', 'body': 'A test post.'} user = create_user() login_user(self.client, user) response = self.client.post(self.base_url, data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(Post.objects.count(), 1) self.assertEqual(Post.objects.get().status, Post.PostStatus.DRAFT)
def test_create_post_if_user_logged_in(self): data = {'title': 'Test Post', 'body': 'A test post.', 'status': 'D'} user = create_user() login_user(self.client, user) response = self.client.post(self.base_url, data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(Post.objects.count(), 1) self.assertEqual(Post.objects.get().title, data['title']) self.assertEqual(Post.objects.get().author_id, user.pk)
def test_post_views_not_increase_when_author_views_it(self): login_user(self.client, self.post_user) initial_view_count = PostViews.objects.get( post_id=self.test_posts[2].pk).views response = self.client.get(self.published_url) final_view_count = PostViews.objects.get( post_id=self.test_posts[2].pk).views self.assertEqual(response.data.get('views'), initial_view_count) self.assertEqual(final_view_count, initial_view_count)
def test_posts_ordered_by_descending_created_date(self): login_user(self.client, self.post_user) response = self.client.get(self.base_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertTrue( self.str_to_date(response.data[0].get('created_on')) > self.str_to_date(response.data[1].get('created_on'))) self.assertTrue( self.str_to_date(response.data[1].get('created_on')) > self.str_to_date(response.data[2].get('created_on')))
def test_post_views_increase_when_non_author_views_it(self): user = create_user({'username': '******', 'password': '******'}) login_user(self.client, user) initial_view_count = PostViews.objects.get( post_id=self.test_posts[2].pk).views response = self.client.get(self.published_url) final_view_count = PostViews.objects.get( post_id=self.test_posts[2].pk).views self.assertEqual(response.data.get('views'), final_view_count) self.assertEqual(final_view_count, initial_view_count + 1)
def test_author_sees_all_self_posts(self): login_user(self.client, self.post_user) response = self.client.get(self.base_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data), 3) self.assertEqual(response.data[0].get('title'), self.test_posts[2].get('title')) self.assertEqual(response.data[1].get('title'), self.test_posts[1].get('title')) self.assertEqual(response.data[2].get('title'), self.test_posts[0].get('title'))
def test_new_post_creates_related_post_view(self): data = {'title': 'Test Post', 'body': 'A test post.', 'status': 'D'} user = create_user() login_user(self.client, user) response = self.client.post(self.base_url, data) post = Post.objects.get() post_views = PostViews.objects.get() self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(Post.objects.count(), 1) self.assertEqual(PostViews.objects.count(), 1) self.assertTrue(hasattr(post, 'postviews')) self.assertEqual(post.postviews.pk, post_views.pk) self.assertEqual(post_views.views, 0)
def test_author_can_update_individual_fields(self): post = create_post() login_user(self.client, post.author) new_data = {'status': Post.PostStatus.PUBLISHED} url = reverse('retrieve-update-post', args=[post.pk]) response = self.client.patch(url, new_data) updated_post = Post.objects.get() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(updated_post.id, post.id) self.assertEqual(updated_post.status, new_data['status']) self.assertEqual(updated_post.title, post.title) self.assertEqual(updated_post.body, post.body) self.assertNotEqual(updated_post.status, post.status)
def test_non_author_can_only_view_published_posts_of_others(self): user = create_user({'username': '******', 'password': '******'}) login_user(self.client, user) # DRAFT POST response = self.client.get(self.draft_url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) # UNPUBLISHED POST response = self.client.get(self.unpublished_url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) # PUBLISHED POST response = self.client.get(self.published_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data.get('title'), self.test_posts[2].title)
def test_non_author_only_sees_published_posts_and_own_posts(self): user = create_user({'username': '******', 'password': '******'}) user_post = create_post({ 'title': 'User Post', 'body': 'User Post body', 'status': Post.PostStatus.DRAFT, 'author': user }) login_user(self.client, user) response = self.client.get(self.base_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data), 2) self.assertEqual(response.data[0].get('title'), user_post.title) self.assertEqual(response.data[1].get('title'), self.test_posts[2].get('title'))
def test_author_can_view_all_self_posts(self): login_user(self.client, self.post_user) # DRAFT POST response = self.client.get(self.draft_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data.get('title'), self.test_posts[0].title) # UNPUBLISHED POST response = self.client.get(self.unpublished_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data.get('title'), self.test_posts[1].title) # PUBLISHED POST response = self.client.get(self.published_url) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data.get('title'), self.test_posts[2].title)
def test_non_author_cannot_update_post(self): author = create_user() published_post = create_post({ 'title': 'Test Post', 'body': 'Test body', 'status': Post.PostStatus.PUBLISHED, 'author': author }) user_data = {'username': '******', 'password': '******'} non_author = create_user(user_data) login_user(self.client, non_author) new_data = { 'title': 'DRAFT Post', 'body': 'DRAFT Post Body', 'status': Post.PostStatus.DRAFT } url = reverse('retrieve-update-post', args=[published_post.pk]) response = self.client.put(url, new_data) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_author_can_update_complete_post(self): post = create_post() login_user(self.client, post.author) new_data = { 'title': 'Published Post', 'body': 'Published Post Body', 'status': Post.PostStatus.PUBLISHED } url = reverse('retrieve-update-post', args=[post.pk]) response = self.client.put(url, new_data) updated_post = Post.objects.get() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(updated_post.id, post.id) self.assertEqual(updated_post.title, new_data['title']) self.assertEqual(updated_post.body, new_data['body']) self.assertEqual(updated_post.status, new_data['status']) self.assertNotEqual(updated_post.title, post.title) self.assertNotEqual(updated_post.body, post.body) self.assertNotEqual(updated_post.status, post.status)