Add draft, publish, and update tests for proposals.
This commit is contained in:
parent
e40d046dd4
commit
c05bd6ab43
|
@ -68,7 +68,18 @@ class BaseUserConfig(BaseTestConfig):
|
|||
class BaseProposalCreatorConfig(BaseUserConfig):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.proposal = Proposal.create(status="DRAFT")
|
||||
self.proposal = Proposal.create(
|
||||
status="DRAFT",
|
||||
title=test_proposal["title"],
|
||||
content=test_proposal["content"],
|
||||
brief=test_proposal["brief"],
|
||||
category=test_proposal["category"],
|
||||
target=test_proposal["target"],
|
||||
payout_address=test_proposal["payoutAddress"],
|
||||
trustees=test_proposal["trustees"][0],
|
||||
deadline_duration=test_proposal["deadlineDuration"],
|
||||
vote_duration=test_proposal["voteDuration"]
|
||||
)
|
||||
self.proposal.team.append(self.user)
|
||||
db.session.add(self.proposal)
|
||||
|
||||
|
|
|
@ -2,127 +2,90 @@ import json
|
|||
from mock import patch
|
||||
|
||||
from grant.proposal.models import Proposal
|
||||
from grant.user.models import SocialMedia, Avatar
|
||||
from ..config import BaseUserConfig
|
||||
from ..config import BaseProposalCreatorConfig
|
||||
from ..test_data import test_proposal, test_user
|
||||
|
||||
|
||||
class TestAPI(BaseUserConfig):
|
||||
class TestAPI(BaseProposalCreatorConfig):
|
||||
def test_create_new_draft(self):
|
||||
resp = self.app.post(
|
||||
"/api/v1/proposals/drafts",
|
||||
data=json.dumps({}),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
self.assertEqual(resp.status_code, 201)
|
||||
self.assertStatus(resp, 201)
|
||||
|
||||
proposal_db = Proposal.query.filter_by(id=resp.json['proposalId'])
|
||||
self.assertIsNotNone(proposal_db)
|
||||
|
||||
@patch('grant.web3.proposal.validate_contribution_tx', return_value=True)
|
||||
def test_create_proposal_contribution(self, mock_validate_contribution_tx):
|
||||
proposal_res = self.app.post(
|
||||
"/api/v1/proposals/drafts",
|
||||
data=json.dumps(test_proposal),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
def test_no_auth_create_new_draft(self):
|
||||
resp = self.app.post(
|
||||
"/api/v1/proposals/drafts"
|
||||
)
|
||||
proposal_json = proposal_res.json
|
||||
proposal_id = proposal_json["proposalId"]
|
||||
self.assert401(resp)
|
||||
|
||||
contribution = {
|
||||
"txId": "0x12345",
|
||||
"fromAddress": "0x23456",
|
||||
"amount": "1.2345"
|
||||
}
|
||||
def test_update_proposal_draft(self):
|
||||
new_title = "Updated!"
|
||||
new_proposal = test_proposal.copy()
|
||||
new_proposal["title"] = new_title
|
||||
|
||||
contribution_res = self.app.post(
|
||||
"/api/v1/proposals/{}/contributions".format(proposal_id),
|
||||
data=json.dumps(contribution),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
res = contribution_res.json
|
||||
exp = contribution
|
||||
|
||||
def eq(k):
|
||||
self.assertEqual(exp[k], res[k])
|
||||
eq("txId")
|
||||
eq("fromAddress")
|
||||
eq("amount")
|
||||
self.assertEqual(proposal_id, res["proposalId"])
|
||||
|
||||
@patch('grant.web3.proposal.validate_contribution_tx', return_value=True)
|
||||
def test_get_proposal_contribution(self, mock_validate_contribution_tx):
|
||||
proposal_res = self.app.post(
|
||||
"/api/v1/proposals/drafts",
|
||||
data=json.dumps(test_proposal),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
proposal_json = proposal_res.json
|
||||
proposal_id = proposal_json["proposalId"]
|
||||
|
||||
contribution = {
|
||||
"txId": "0x12345",
|
||||
"fromAddress": "0x23456",
|
||||
"amount": "1.2345"
|
||||
}
|
||||
|
||||
self.app.post(
|
||||
"/api/v1/proposals/{}/contributions".format(proposal_id),
|
||||
data=json.dumps(contribution),
|
||||
resp = self.app.put(
|
||||
"/api/v1/proposals/{}".format(self.proposal.id),
|
||||
data=json.dumps(new_proposal),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
|
||||
contribution_res = self.app.get(
|
||||
"/api/v1/proposals/{0}/contributions/{1}".format(proposal_id, contribution["txId"])
|
||||
self.assert200(resp)
|
||||
self.assertEqual(resp.json["title"], new_title)
|
||||
self.assertEqual(self.proposal.title, new_title)
|
||||
|
||||
def test_no_auth_update_proposal_draft(self):
|
||||
new_title = "Updated!"
|
||||
new_proposal = test_proposal.copy()
|
||||
new_proposal["title"] = new_title
|
||||
|
||||
resp = self.app.put(
|
||||
"/api/v1/proposals/{}".format(self.proposal.id),
|
||||
data=json.dumps(new_proposal),
|
||||
content_type='application/json'
|
||||
)
|
||||
res = contribution_res.json
|
||||
exp = contribution
|
||||
self.assert401(resp)
|
||||
|
||||
def eq(k):
|
||||
self.assertEqual(exp[k], res[k])
|
||||
eq("txId")
|
||||
eq("fromAddress")
|
||||
eq("amount")
|
||||
self.assertEqual(proposal_id, res["proposalId"])
|
||||
def test_invalid_proposal_update_proposal_draft(self):
|
||||
new_title = "Updated!"
|
||||
new_proposal = test_proposal.copy()
|
||||
new_proposal["title"] = new_title
|
||||
|
||||
@patch('grant.web3.proposal.validate_contribution_tx', return_value=True)
|
||||
def test_get_proposal_contributions(self, mock_validate_contribution_tx):
|
||||
proposal_res = self.app.post(
|
||||
"/api/v1/proposals/drafts",
|
||||
data=json.dumps(test_proposal),
|
||||
resp = self.app.put(
|
||||
"/api/v1/proposals/12345",
|
||||
data=json.dumps(new_proposal),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
proposal_json = proposal_res.json
|
||||
proposal_id = proposal_json["proposalId"]
|
||||
self.assert404(resp)
|
||||
|
||||
contribution = {
|
||||
"txId": "0x12345",
|
||||
"fromAddress": "0x23456",
|
||||
"amount": "1.2345"
|
||||
}
|
||||
|
||||
self.app.post(
|
||||
"/api/v1/proposals/{}/contributions".format(proposal_id),
|
||||
data=json.dumps(contribution),
|
||||
def test_publish_proposal_draft(self):
|
||||
resp = self.app.put(
|
||||
"/api/v1/proposals/{}/publish".format(self.proposal.id),
|
||||
data=json.dumps({ "contractAddress": "0x0" }),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
self.assert200(resp)
|
||||
|
||||
contributions_res = self.app.get(
|
||||
"/api/v1/proposals/{0}/contributions".format(proposal_id)
|
||||
def test_no_auth_publish_proposal_draft(self):
|
||||
resp = self.app.put(
|
||||
"/api/v1/proposals/{}/publish".format(self.proposal.id),
|
||||
data=json.dumps({ "contractAddress": "0x0" }),
|
||||
content_type='application/json'
|
||||
)
|
||||
res = contributions_res.json[0]
|
||||
exp = contribution
|
||||
self.assert401(resp)
|
||||
|
||||
def eq(k):
|
||||
self.assertEqual(exp[k], res[k])
|
||||
eq("txId")
|
||||
eq("fromAddress")
|
||||
eq("amount")
|
||||
self.assertEqual(proposal_id, res["proposalId"])
|
||||
def test_invalid_proposal_publish_proposal_draft(self):
|
||||
resp = self.app.put(
|
||||
"/api/v1/proposals/12345/publish",
|
||||
data=json.dumps({ "contractAddress": "0x0" }),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
self.assert404(resp)
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
import json
|
||||
from mock import patch
|
||||
|
||||
from grant.proposal.models import Proposal
|
||||
from grant.user.models import SocialMedia, Avatar
|
||||
from ..config import BaseUserConfig
|
||||
from ..test_data import test_proposal, test_user
|
||||
|
||||
|
||||
class TestAPI(BaseUserConfig):
|
||||
@patch('grant.web3.proposal.validate_contribution_tx', return_value=True)
|
||||
def test_create_proposal_contribution(self, mock_validate_contribution_tx):
|
||||
proposal_res = self.app.post(
|
||||
"/api/v1/proposals/drafts",
|
||||
data=json.dumps(test_proposal),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
proposal_json = proposal_res.json
|
||||
proposal_id = proposal_json["proposalId"]
|
||||
|
||||
contribution = {
|
||||
"txId": "0x12345",
|
||||
"fromAddress": "0x23456",
|
||||
"amount": "1.2345"
|
||||
}
|
||||
|
||||
contribution_res = self.app.post(
|
||||
"/api/v1/proposals/{}/contributions".format(proposal_id),
|
||||
data=json.dumps(contribution),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
res = contribution_res.json
|
||||
exp = contribution
|
||||
|
||||
def eq(k):
|
||||
self.assertEqual(exp[k], res[k])
|
||||
eq("txId")
|
||||
eq("fromAddress")
|
||||
eq("amount")
|
||||
self.assertEqual(proposal_id, res["proposalId"])
|
||||
|
||||
@patch('grant.web3.proposal.validate_contribution_tx', return_value=True)
|
||||
def test_get_proposal_contribution(self, mock_validate_contribution_tx):
|
||||
proposal_res = self.app.post(
|
||||
"/api/v1/proposals/drafts",
|
||||
data=json.dumps(test_proposal),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
proposal_json = proposal_res.json
|
||||
proposal_id = proposal_json["proposalId"]
|
||||
|
||||
contribution = {
|
||||
"txId": "0x12345",
|
||||
"fromAddress": "0x23456",
|
||||
"amount": "1.2345"
|
||||
}
|
||||
|
||||
self.app.post(
|
||||
"/api/v1/proposals/{}/contributions".format(proposal_id),
|
||||
data=json.dumps(contribution),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
|
||||
contribution_res = self.app.get(
|
||||
"/api/v1/proposals/{0}/contributions/{1}".format(proposal_id, contribution["txId"])
|
||||
)
|
||||
res = contribution_res.json
|
||||
exp = contribution
|
||||
|
||||
def eq(k):
|
||||
self.assertEqual(exp[k], res[k])
|
||||
eq("txId")
|
||||
eq("fromAddress")
|
||||
eq("amount")
|
||||
self.assertEqual(proposal_id, res["proposalId"])
|
||||
|
||||
@patch('grant.web3.proposal.validate_contribution_tx', return_value=True)
|
||||
def test_get_proposal_contributions(self, mock_validate_contribution_tx):
|
||||
proposal_res = self.app.post(
|
||||
"/api/v1/proposals/drafts",
|
||||
data=json.dumps(test_proposal),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
proposal_json = proposal_res.json
|
||||
proposal_id = proposal_json["proposalId"]
|
||||
|
||||
contribution = {
|
||||
"txId": "0x12345",
|
||||
"fromAddress": "0x23456",
|
||||
"amount": "1.2345"
|
||||
}
|
||||
|
||||
self.app.post(
|
||||
"/api/v1/proposals/{}/contributions".format(proposal_id),
|
||||
data=json.dumps(contribution),
|
||||
headers=self.headers,
|
||||
content_type='application/json'
|
||||
)
|
||||
|
||||
contributions_res = self.app.get(
|
||||
"/api/v1/proposals/{0}/contributions".format(proposal_id)
|
||||
)
|
||||
res = contributions_res.json[0]
|
||||
exp = contribution
|
||||
|
||||
def eq(k):
|
||||
self.assertEqual(exp[k], res[k])
|
||||
eq("txId")
|
||||
eq("fromAddress")
|
||||
eq("amount")
|
||||
self.assertEqual(proposal_id, res["proposalId"])
|
|
@ -75,8 +75,8 @@ test_other_user = {
|
|||
milestones = [
|
||||
{
|
||||
"title": "All the money straightaway",
|
||||
"description": "cool stuff with it",
|
||||
"date": "June 2019",
|
||||
"content": "cool stuff with it",
|
||||
"dateEstimated": "Fri, 30 Nov 2018 01:42:23 GMT",
|
||||
"payoutPercent": "100",
|
||||
"immediatePayout": False
|
||||
}
|
||||
|
@ -87,20 +87,16 @@ test_proposal = {
|
|||
"crowdFundContractAddress": "0x20000",
|
||||
"content": "## My Proposal",
|
||||
"title": "Give Me Money",
|
||||
"brief": "$$$",
|
||||
"milestones": milestones,
|
||||
"category": random.choice(CATEGORIES)
|
||||
"category": random.choice(CATEGORIES),
|
||||
"target": "123.456",
|
||||
"payoutAddress": test_team[0]["accountAddress"],
|
||||
"trustees": [test_team[0]["accountAddress"]],
|
||||
"deadlineDuration": 100,
|
||||
"voteDuration": 100
|
||||
}
|
||||
|
||||
milestones = [
|
||||
{
|
||||
"title": "All the money straightaway",
|
||||
"description": "cool stuff with it",
|
||||
"date": "June 2019",
|
||||
"payoutPercent": "100",
|
||||
"immediatePayout": False
|
||||
}
|
||||
]
|
||||
|
||||
test_comment_message = {
|
||||
"sig": "0x08d5922e48e44229a764d85000558ac9a603ee2ce6a4439a211de4c64a7c3e782efeea90d63760dafb155af53c1dadcec10dac682e1fff8df1b4f40f9fcf08891b",
|
||||
"data": {
|
||||
|
|
Loading…
Reference in New Issue