def setUp(self): self.post_user = create_user() data_test_posts = [{ 'title': 'Post 1', 'body': 'Post 1 body', 'status': Post.PostStatus.DRAFT, 'author': self.post_user }, { 'title': 'Post 2', 'body': 'Post 2 body', 'status': Post.PostStatus.UNPUBLISHED, 'author': self.post_user }, { 'title': 'Post 3', 'body': 'Post 3 body', 'status': Post.PostStatus.PUBLISHED, 'author': self.post_user }] self.test_posts = [] for post in data_test_posts: self.test_posts.append(create_post_with_views(post)) self.draft_url = reverse('retrieve-update-post', args=[self.test_posts[0].pk]) self.unpublished_url = reverse('retrieve-update-post', args=[self.test_posts[1].pk]) self.published_url = reverse('retrieve-update-post', args=[self.test_posts[2].pk])
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_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_login_user_with_correct_credentials(self): user = create_user() data = {'username': user.username, 'password': '******'} response = self.client.post(self.base_url, data) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['token'], user.auth_token.key)
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_not_register_user_if_username_exist(self): user = create_user() data = { 'username': user.username, 'password': '******', 'retype_password': '******' } response = self.client.post(self.base_url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
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_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_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 create_post(data=None): if data is None: user = create_user() data = { 'title': 'Test Post', 'body': 'Test body', 'status': Post.PostStatus.DRAFT, 'author': user } post = Post.objects.create(**data) return post
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_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_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 setUp(self): self.base_url = reverse('list-create-post') self.post_user = create_user() self.test_posts = [{ 'title': 'Post 1', 'body': 'Post 1 body', 'status': Post.PostStatus.DRAFT, 'author': self.post_user }, { 'title': 'Post 2', 'body': 'Post 2 body', 'status': Post.PostStatus.UNPUBLISHED, 'author': self.post_user }, { 'title': 'Post 3', 'body': 'Post 3 body', 'status': Post.PostStatus.PUBLISHED, 'author': self.post_user }] for post in self.test_posts: create_post(post)
def test_not_login_user_with_invalid_credentials(self): user = create_user() data = {'username': '******', 'password': '******'} response = self.client.post(self.base_url, data) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_deny_logout_logged_out_user(self): user = create_user() response = self.client.delete(self.base_url) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)