207 lines
6.6 KiB
Python
207 lines
6.6 KiB
Python
import json
|
|
|
|
from grant.proposal.models import Proposal, Comment, db
|
|
from grant.utils.enums import ProposalStatus
|
|
from ..config import BaseUserConfig
|
|
from ..test_data import test_comment, test_reply, test_comment_large
|
|
|
|
|
|
class TestProposalCommentAPI(BaseUserConfig):
|
|
def test_unauthorized_create_new_proposal_comment(self):
|
|
# no login
|
|
proposal = Proposal(status=ProposalStatus.LIVE)
|
|
db.session.add(proposal)
|
|
db.session.commit()
|
|
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal.id),
|
|
data=json.dumps(test_comment),
|
|
content_type='application/json'
|
|
)
|
|
self.assertStatus(comment_res, 401)
|
|
|
|
def test_create_new_proposal_comment(self):
|
|
self.login_default_user()
|
|
proposal = Proposal(status=ProposalStatus.LIVE)
|
|
db.session.add(proposal)
|
|
db.session.commit()
|
|
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal.id),
|
|
data=json.dumps(test_comment),
|
|
content_type='application/json'
|
|
)
|
|
self.assertStatus(comment_res, 201)
|
|
|
|
def test_invalid_proposal_id_create_comment(self):
|
|
self.login_default_user()
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/12345/comments",
|
|
data=json.dumps(test_comment),
|
|
content_type='application/json'
|
|
)
|
|
self.assertStatus(comment_res, 404)
|
|
|
|
def test_create_new_proposal_comment_reply(self):
|
|
self.login_default_user()
|
|
proposal = Proposal(status=ProposalStatus.LIVE)
|
|
db.session.add(proposal)
|
|
db.session.commit()
|
|
proposal_id = proposal.id
|
|
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal_id),
|
|
data=json.dumps(test_comment),
|
|
content_type='application/json'
|
|
)
|
|
self.assertStatus(comment_res, 201)
|
|
|
|
test_reply_copy = test_reply.copy()
|
|
test_reply_copy["parentCommentId"] = comment_res.json["id"]
|
|
reply_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal_id),
|
|
data=json.dumps(test_reply_copy),
|
|
content_type='application/json'
|
|
)
|
|
self.assertStatus(reply_res, 201)
|
|
self.assertEqual(
|
|
reply_res.json["parentCommentId"],
|
|
comment_res.json["id"]
|
|
)
|
|
|
|
def test_invalid_parent_comment_id_create_reply(self):
|
|
self.login_default_user()
|
|
proposal = Proposal(status=ProposalStatus.LIVE)
|
|
db.session.add(proposal)
|
|
db.session.commit()
|
|
proposal_id = proposal.id
|
|
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal_id),
|
|
data=json.dumps(test_comment),
|
|
content_type='application/json'
|
|
)
|
|
self.assertStatus(comment_res, 201)
|
|
|
|
test_reply_copy = test_reply.copy()
|
|
test_reply_copy["parentCommentId"] = comment_res.json["id"] + 1
|
|
reply_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal_id),
|
|
data=json.dumps(test_reply_copy),
|
|
content_type='application/json'
|
|
)
|
|
self.assertStatus(reply_res, 400)
|
|
|
|
def test_create_new_proposal_comment_fails_with_no_verification(self):
|
|
self.login_default_user()
|
|
self.mark_user_not_verified()
|
|
|
|
proposal = Proposal(
|
|
status="LIVE"
|
|
)
|
|
db.session.add(proposal)
|
|
db.session.commit()
|
|
proposal_id = proposal.id
|
|
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal_id),
|
|
data=json.dumps(test_comment),
|
|
content_type='application/json'
|
|
)
|
|
|
|
self.assertStatus(comment_res, 403)
|
|
|
|
def test_create_new_proposal_comment_fails_with_large_comment(self):
|
|
self.login_default_user()
|
|
|
|
proposal = Proposal(
|
|
status="LIVE"
|
|
)
|
|
db.session.add(proposal)
|
|
db.session.commit()
|
|
proposal_id = proposal.id
|
|
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal_id),
|
|
data=json.dumps(test_comment_large),
|
|
content_type='application/json'
|
|
)
|
|
|
|
self.assertStatus(comment_res, 400)
|
|
|
|
def test_create_new_proposal_comment_fails_with_silenced_user(self):
|
|
self.login_default_user()
|
|
self.user.set_silenced(True)
|
|
|
|
proposal = Proposal(
|
|
status="LIVE"
|
|
)
|
|
db.session.add(proposal)
|
|
db.session.commit()
|
|
proposal_id = proposal.id
|
|
|
|
comment_res = self.app.post(
|
|
"/api/v1/proposals/{}/comments".format(proposal_id),
|
|
data=json.dumps(test_comment),
|
|
content_type='application/json'
|
|
)
|
|
|
|
self.assertStatus(comment_res, 403)
|
|
self.assertIn('silenced', comment_res.json['message'])
|
|
|
|
def test_like_comment(self):
|
|
proposal = Proposal(status=ProposalStatus.LIVE)
|
|
db.session.add(proposal)
|
|
|
|
comment = Comment(
|
|
proposal_id=proposal.id,
|
|
user_id=self.other_user.id,
|
|
parent_comment_id=None,
|
|
content=test_comment["comment"]
|
|
)
|
|
comment_id = comment.id
|
|
db.session.add(comment)
|
|
db.session.commit()
|
|
|
|
# comment not found
|
|
resp = self.app.put(
|
|
f"/api/v1/comment/123456789/like",
|
|
data=json.dumps({"isLiked": True}),
|
|
content_type="application/json",
|
|
)
|
|
self.assert401(resp)
|
|
|
|
# not logged in
|
|
resp = self.app.put(
|
|
f"/api/v1/comment/{comment_id}/like",
|
|
data=json.dumps({"isLiked": True}),
|
|
content_type="application/json",
|
|
)
|
|
self.assert401(resp)
|
|
|
|
# logged in
|
|
self.login_default_user()
|
|
resp = self.app.put(
|
|
f"/api/v1/comment/{comment_id}/like",
|
|
data=json.dumps({"isLiked": True}),
|
|
content_type="application/json",
|
|
)
|
|
|
|
self.assertStatus(resp, 201)
|
|
self.assertEqual(resp.json["authedLiked"], True)
|
|
self.assertEqual(resp.json["likesCount"], 1)
|
|
comment = Comment.query.get(comment_id)
|
|
self.assertTrue(self.user in comment.likes)
|
|
|
|
# test unliking a proposal
|
|
resp = self.app.put(
|
|
f"/api/v1/comment/{comment.id}/like",
|
|
data=json.dumps({"isLiked": False}),
|
|
content_type="application/json",
|
|
)
|
|
self.assertStatus(resp, 201)
|
|
self.assertEqual(resp.json["authedLiked"], False)
|
|
self.assertEqual(resp.json["likesCount"], 0)
|
|
comment = Comment.query.get(comment_id)
|
|
self.assertTrue(self.user not in comment.likes)
|