zcash-grant-system/backend/tests/config.py

207 lines
6.7 KiB
Python
Raw Permalink Normal View History

2018-12-14 11:36:22 -08:00
import json
2019-03-14 13:29:02 -07:00
from datetime import datetime
from datetime import timedelta
2019-01-22 21:35:22 -08:00
from flask_testing import TestCase
2019-03-14 13:29:02 -07:00
from mock import patch
from grant.app import create_app
CCRs (#86) * CCRs API / Models boilerplate * start on frontend * backendy things * Create CCR redux module, integrate API endpoints, create types * Fix/Cleanup API * Wire up CreateRequestDraftList * bounty->target * Add 'Create Request Flow' MVP * cleanup * Tweak filenames * Simplify migrations * fix migrations * CCR Staking MVP * tslint * Get Pending Requests into Profile * Remove staking requirement * more staking related removals * MVP Admin integration * Make RFP when CCR is accepted * Add pagination to CCRs in Admin Improve styles for Proposals * Hookup notifications Adjust copy * Simplify ccr->rfp relationship Add admin approval email Fixup copy * Show Message on RFP Detail Make Header CTAs change based on draft status Adjust proposal card style * Bugfix: Show header for non signed in users * Add 'create a request' to intro * Profile Created CCRs RFP CCR attribution * ignore * CCR Price in USD (#85) * init profile tipjar backend * init profile tipjar frontend * fix lint * implement tip jar block * fix wrapping, hide tip block on self * init backend proposal tipjar * init frontend proposal tipjar * add hide title, fix bug * uncomment rate limit * rename vars, use null check * allow address and view key to be unset * add api tests * fix tsc errors * fix lint * fix CopyInput styling * fix migrations * hide tipping in proposal if address not set * add tip address to create flow * redesign campaign block * fix typo * init backend changes * init admin changes * init frontend changes * fix backend tests * update campaign block * be - init rfp usd changes * admin - init rfp usd changes * fe - fully adapt api util functions to usd * fe - init rfp usd changes * adapt profile created to usd * misc usd changes * add tip jar to dedicated card * fix tipjar bug * use zf light logo * switch to zf grants logo * hide profile tip jar if address not set * add comment, run prettier * conditionally add info icon and tooltip to funding line * admin - disallow decimals in RFPs * fe - cover usd string edge case * add Usd as rfp bounty type * fix migration order * fix email bug * adapt CCRs to USD * implement CCR preview * fix tsc * Copy Updates and UX Tweaks (#87) * Add default structure to proposal content * Landing page copy * Hide contributors tab for v2 proposals * Minor UX tweaks for Liking/Following/Tipping * Copy for Tipping Tooltip, proposal explainer for review, and milestone day estimate notice. * Fix header styles bug and remove commented out styles. * Revert "like" / "unfollow" hyphenication * Comment out unused tests related to staking Increase PROPOSAL_TARGET_MAX in .env.example * Comment out ccr approval email send until ready * Adjust styles, copy. * fix proposal prune test (#88) * fix USD display in preview, fix non-unique key (#90) * Pre-stepper explainer for CCRs. * Tweak styles * Default content for CCRs * fix tsc * CCR approval and rejection emails * add back admin_approval_ccr email templates * Link ccr author name to profile in RFPs * copy tweaks * copy tweak * hookup mangle user command * Fix/add endif in jinja * fix tests * review * fix review
2019-12-05 17:01:02 -08:00
from grant.ccr.models import CCR
2019-03-14 13:29:02 -07:00
from grant.extensions import limiter
from grant.milestone.models import Milestone
from grant.proposal.models import Proposal
from grant.settings import PROPOSAL_STAKING_AMOUNT
2019-01-29 14:21:06 -08:00
from grant.task.jobs import ProposalReminder
2019-01-22 21:35:22 -08:00
from grant.user.models import User, SocialMedia, db, Avatar
from grant.utils.enums import ProposalStatus
CCRs (#86) * CCRs API / Models boilerplate * start on frontend * backendy things * Create CCR redux module, integrate API endpoints, create types * Fix/Cleanup API * Wire up CreateRequestDraftList * bounty->target * Add 'Create Request Flow' MVP * cleanup * Tweak filenames * Simplify migrations * fix migrations * CCR Staking MVP * tslint * Get Pending Requests into Profile * Remove staking requirement * more staking related removals * MVP Admin integration * Make RFP when CCR is accepted * Add pagination to CCRs in Admin Improve styles for Proposals * Hookup notifications Adjust copy * Simplify ccr->rfp relationship Add admin approval email Fixup copy * Show Message on RFP Detail Make Header CTAs change based on draft status Adjust proposal card style * Bugfix: Show header for non signed in users * Add 'create a request' to intro * Profile Created CCRs RFP CCR attribution * ignore * CCR Price in USD (#85) * init profile tipjar backend * init profile tipjar frontend * fix lint * implement tip jar block * fix wrapping, hide tip block on self * init backend proposal tipjar * init frontend proposal tipjar * add hide title, fix bug * uncomment rate limit * rename vars, use null check * allow address and view key to be unset * add api tests * fix tsc errors * fix lint * fix CopyInput styling * fix migrations * hide tipping in proposal if address not set * add tip address to create flow * redesign campaign block * fix typo * init backend changes * init admin changes * init frontend changes * fix backend tests * update campaign block * be - init rfp usd changes * admin - init rfp usd changes * fe - fully adapt api util functions to usd * fe - init rfp usd changes * adapt profile created to usd * misc usd changes * add tip jar to dedicated card * fix tipjar bug * use zf light logo * switch to zf grants logo * hide profile tip jar if address not set * add comment, run prettier * conditionally add info icon and tooltip to funding line * admin - disallow decimals in RFPs * fe - cover usd string edge case * add Usd as rfp bounty type * fix migration order * fix email bug * adapt CCRs to USD * implement CCR preview * fix tsc * Copy Updates and UX Tweaks (#87) * Add default structure to proposal content * Landing page copy * Hide contributors tab for v2 proposals * Minor UX tweaks for Liking/Following/Tipping * Copy for Tipping Tooltip, proposal explainer for review, and milestone day estimate notice. * Fix header styles bug and remove commented out styles. * Revert "like" / "unfollow" hyphenication * Comment out unused tests related to staking Increase PROPOSAL_TARGET_MAX in .env.example * Comment out ccr approval email send until ready * Adjust styles, copy. * fix proposal prune test (#88) * fix USD display in preview, fix non-unique key (#90) * Pre-stepper explainer for CCRs. * Tweak styles * Default content for CCRs * fix tsc * CCR approval and rejection emails * add back admin_approval_ccr email templates * Link ccr author name to profile in RFPs * copy tweaks * copy tweak * hookup mangle user command * Fix/add endif in jinja * fix tests * review * fix review
2019-12-05 17:01:02 -08:00
from .test_data import test_user, test_other_user, test_proposal, mock_blockchain_api_requests, test_ccr
class BaseTestConfig(TestCase):
def create_app(self):
app = create_app(['grant.settings', 'tests.settings'])
app.config.from_object('tests.settings')
limiter.enabled = False
return app
def setUp(self):
db.drop_all()
self.app = self.create_app().test_client()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
2018-12-14 11:36:22 -08:00
2018-11-27 11:07:09 -08:00
def assertStatus(self, response, status_code, message=None):
"""
Overrides TestCase's default to print out response JSON.
"""
2018-11-27 11:07:09 -08:00
message = message or 'HTTP Status %s expected but got %s. Response json: %s' \
2019-03-14 13:29:02 -07:00
% (status_code, response.status_code, response.json or response.data)
2018-11-27 11:07:09 -08:00
self.assertEqual(response.status_code, status_code, message)
assert_status = assertStatus
2018-12-14 11:36:22 -08:00
class BaseUserConfig(BaseTestConfig):
def setUp(self):
super(BaseUserConfig, self).setUp()
2018-12-17 10:33:33 -08:00
self._user = User.create(
email_address=test_user["emailAddress"],
2018-12-14 11:36:22 -08:00
password=test_user["password"],
display_name=test_user["displayName"],
title=test_user["title"],
)
2019-01-27 18:51:05 -08:00
self._user.email_verification.has_verified = True
db.session.add(self._user)
sm = SocialMedia(
service=test_user['socialMedias'][0]['service'],
username=test_user['socialMedias'][0]['username'],
user_id=self._user.id)
db.session.add(sm)
2018-12-17 10:33:33 -08:00
avatar = Avatar(image_url=test_user["avatar"]["link"], user_id=self._user.id)
db.session.add(avatar)
2018-12-14 11:36:22 -08:00
self.user_password = test_user["password"]
self._other_user = User.create(
2018-11-29 13:54:26 -08:00
email_address=test_other_user["emailAddress"],
2018-12-14 11:36:22 -08:00
password=test_other_user["password"],
2018-11-29 13:54:26 -08:00
display_name=test_other_user["displayName"],
title=test_other_user["title"]
)
self.other_user_password = test_other_user["password"]
db.session.commit()
2018-12-17 10:33:33 -08:00
self._user_id = self._user.id
self._other_user_id = self._other_user.id
2018-12-17 10:33:33 -08:00
# always return fresh (avoid detached instance issues)
@property
def user(self):
return User.query.filter_by(id=self._user_id).first()
@property
def other_user(self):
return User.query.filter_by(id=self._other_user_id).first()
2019-01-27 19:09:31 -08:00
def mark_user_not_verified(self, user=None):
if not user:
user = self.user
user.email_verification.has_verified = False
db.session.add(user)
db.session.commit()
2018-12-17 10:33:33 -08:00
def login_default_user(self, cust_pass=None):
return self.app.post(
2018-12-14 11:36:22 -08:00
"/api/v1/users/auth",
data=json.dumps({
"email": self.user.email_address,
2018-12-17 10:33:33 -08:00
"password": cust_pass or self.user_password
2018-12-14 11:36:22 -08:00
}),
content_type="application/json"
)
def login_other_user(self):
return self.app.post(
"/api/v1/users/auth",
data=json.dumps({
"email": self.other_user.email_address,
"password": self.other_user_password
}),
content_type="application/json"
)
def remove_default_user(self):
User.query.filter_by(id=self.user.id).delete()
db.session.commit()
2018-12-14 11:36:22 -08:00
class BaseProposalCreatorConfig(BaseUserConfig):
def setUp(self):
super().setUp()
2018-12-17 10:33:33 -08:00
self._proposal = Proposal.create(
status=ProposalStatus.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"],
deadline_duration=test_proposal["deadlineDuration"]
)
2018-12-17 10:33:33 -08:00
self._proposal.team.append(self.user)
db.session.add(self._proposal)
2019-03-14 13:29:02 -07:00
db.session.flush()
milestones = [
{
"title": "Milestone 1",
"content": "Content 1",
"days_estimated": "30",
2019-03-14 13:29:02 -07:00
"payout_percent": 50,
"immediate_payout": True
},
{
"title": "Milestone 2",
"content": "Content 2",
"days_estimated": "20",
2019-03-14 13:29:02 -07:00
"payout_percent": 50,
"immediate_payout": False
}
]
Milestone.make(milestones, self._proposal)
2018-11-29 13:54:26 -08:00
self._other_proposal = Proposal.create(status=ProposalStatus.DRAFT)
2018-12-17 10:33:33 -08:00
self._other_proposal.team.append(self.other_user)
db.session.add(self._other_proposal)
db.session.commit()
2018-12-17 10:33:33 -08:00
self._proposal_id = self._proposal.id
self._other_proposal_id = self._other_proposal.id
# always return fresh (avoid detached instance issues)
@property
def proposal(self):
return Proposal.query.filter_by(id=self._proposal_id).first()
@property
def other_proposal(self):
return Proposal.query.filter_by(id=self._other_proposal_id).first()
2019-01-29 14:21:06 -08:00
def make_proposal_reminder_task(self):
proposal_reminder = ProposalReminder(self.proposal.id)
proposal_reminder.make_task()
ZF Grants 2.1 (#496) * fix ccr pagination defaults * add ccr admin tests * add ccr user tests * checkpoint * fix tslint * request changes discussion flow mvp * admin - add discussion status * backend - add live drafts * admin - add live drafts * frontend - add live drafts * frontend - add edit discussion proposal * fix tsc * include DISCUSSION status in propsal listview * do not make live draft on admin request changes * hide live drafts from user proposal draft list * fix backend tests * add admin tests * add user tests * fix: liking, viewing discussion proposals, admin menu * admin - update hints for live drafts * fe - add better messaging when updating a proposal * be - fix like test * remove TODO comments * add new email types * fix storybook * add revision tab story * backend - implement proposal revisions * frontend - implement proposal revisions * update revision tab story * fix lint * remove set detection * email proposal followers on revision * restrict banner to team members only * misc bug fixes * update, add backend tests * add milestone title change to revision history story * fix milestones display in preview * allow archived proposals to be queried * implement archived proposal page * fix tsc * implement archived proposal get route * move styling into less * remove proposal archive parent id * handle archived proposal status * cleanup * remove contributions, switch to USD, implement quarters * use Qs to preserve formatting * handle edit only kyc * prevent ARCHIVED proposals from being sent to admin * display latest revision first * admin - proposal & ccr reject permanently * backend - proposal & ccr reject permanently * frontend - proposal & ccr reject permanently * fix tsc * use $ in milestone payout email * introduce custom filters to proposal listview * hide archive link on first revision * upgrade packages * add bech32 implementation * add z address validation with tests * fix tslint * use local address validation * fix tests, remove blockchain mock gets * add additional bad addresses * update briefs to include page break message * remove contributions routes, menu entry * disable countribution count admin stats * remove matching and pretty print in finance * fix tslint * separate out rejected permanently proposals * make removing proposals generic * allow linked tabs to be ignored * remove rejected permanently, bugfix * update preview link to point to rejected tab * implement rejected permanently tab, add tab message * refactor variable * fix tslint * fix tslint * send ccr reject permanently email on rejection * fix preview message * wire up proposal arbiter and rejected emails * disable tip jar in proposal and profile * sync ccr/proposal drafts on create form init * check invites on submit modal open * update team invite language * update team text when edit * fix ccr rejected permanently tag * text changes, email preview fix * display changes requested tag when in discussion with changes requested * enable social share on open for discussion proposals, update language * place sort below filter * derive filter from query string * use better filter names in query params * fix tslint * create snapshot of original proposal on first revision * clear invites between edits, account for additional changes not tracked in revisions * update tests * fix test * remove print * SameSite Fixes (#150) * QA Fixes 2 (#151) * set filters as query strings on change * remove rejected permanently tags * add dollar sign in financials legend * fix tsc * Copy Touchups (#152) * Email Fixes (#155) * fix ZEC in milestone payout emails * fix links in rejected permanently CCR/proposal emails * Poll for Team and Invite Changes in Create Flow (#153) * poll for team and invite changes in create flow * fix tslint Co-authored-by: Daniel Ternyak <dternyak@gmail.com> * pretty print payouts by quarter (#156) Co-authored-by: Daniel Ternyak <dternyak@gmail.com> * Remove Blockchain Module (#154) * remove blockchain route from backend, remove calls to node * revert blockchain_get removal * Add Tags to Proposal Cards (#157) * add tag to proposals and dynamically set v1 card height * listen on window resize * make card height props optional * set tag in bottom right, remove dynamic card resize, add dynamic tag resize * cleanup * cleanup Co-authored-by: Daniel Ternyak <dternyak@gmail.com> * Improve Frontend Address Validation (#158) Co-authored-by: Daniel Ternyak <dternyak@gmail.com> * Remove blockchain module (#162) * remove blockchain route from backend, remove calls to node * revert blockchain_get removal * Remove Blockchain App (#160) * remove blockchain app * remove blockchain app from travis Co-authored-by: Danny Skubak <skubakdj@gmail.com> * Proposal Edit Fixes (#161) * fe - display error if edit creation fails * be - restrict live draft publish Co-authored-by: Daniel Ternyak <dternyak@gmail.com> * Restrict Arbiter Assignment (#159) Co-authored-by: Daniel Ternyak <dternyak@gmail.com> * Email Copy updates * Remove Admin Financials Card * Hookup 'proposal_approved_without_funding' to admin email example * bump various package versions * Update yarn.lock files * Attach 'proposal_approved_without_funding' to backend example email * bump package versions Co-authored-by: Danny Skubak <skubakdj@gmail.com>
2020-04-07 19:56:32 -07:00
def stake_proposal(self):
# 1. submit
self.proposal.submit_for_approval()
# 2. get staking contribution
contribution = self.proposal.get_staking_contribution(self.user.id)
# 3. fake a confirmation
contribution.confirm(tx_id='tx', amount=str(PROPOSAL_STAKING_AMOUNT.normalize()))
db.session.add(contribution)
2019-02-21 10:43:20 -08:00
db.session.flush()
self.proposal.set_pending_when_ready()
CCRs (#86) * CCRs API / Models boilerplate * start on frontend * backendy things * Create CCR redux module, integrate API endpoints, create types * Fix/Cleanup API * Wire up CreateRequestDraftList * bounty->target * Add 'Create Request Flow' MVP * cleanup * Tweak filenames * Simplify migrations * fix migrations * CCR Staking MVP * tslint * Get Pending Requests into Profile * Remove staking requirement * more staking related removals * MVP Admin integration * Make RFP when CCR is accepted * Add pagination to CCRs in Admin Improve styles for Proposals * Hookup notifications Adjust copy * Simplify ccr->rfp relationship Add admin approval email Fixup copy * Show Message on RFP Detail Make Header CTAs change based on draft status Adjust proposal card style * Bugfix: Show header for non signed in users * Add 'create a request' to intro * Profile Created CCRs RFP CCR attribution * ignore * CCR Price in USD (#85) * init profile tipjar backend * init profile tipjar frontend * fix lint * implement tip jar block * fix wrapping, hide tip block on self * init backend proposal tipjar * init frontend proposal tipjar * add hide title, fix bug * uncomment rate limit * rename vars, use null check * allow address and view key to be unset * add api tests * fix tsc errors * fix lint * fix CopyInput styling * fix migrations * hide tipping in proposal if address not set * add tip address to create flow * redesign campaign block * fix typo * init backend changes * init admin changes * init frontend changes * fix backend tests * update campaign block * be - init rfp usd changes * admin - init rfp usd changes * fe - fully adapt api util functions to usd * fe - init rfp usd changes * adapt profile created to usd * misc usd changes * add tip jar to dedicated card * fix tipjar bug * use zf light logo * switch to zf grants logo * hide profile tip jar if address not set * add comment, run prettier * conditionally add info icon and tooltip to funding line * admin - disallow decimals in RFPs * fe - cover usd string edge case * add Usd as rfp bounty type * fix migration order * fix email bug * adapt CCRs to USD * implement CCR preview * fix tsc * Copy Updates and UX Tweaks (#87) * Add default structure to proposal content * Landing page copy * Hide contributors tab for v2 proposals * Minor UX tweaks for Liking/Following/Tipping * Copy for Tipping Tooltip, proposal explainer for review, and milestone day estimate notice. * Fix header styles bug and remove commented out styles. * Revert "like" / "unfollow" hyphenication * Comment out unused tests related to staking Increase PROPOSAL_TARGET_MAX in .env.example * Comment out ccr approval email send until ready * Adjust styles, copy. * fix proposal prune test (#88) * fix USD display in preview, fix non-unique key (#90) * Pre-stepper explainer for CCRs. * Tweak styles * Default content for CCRs * fix tsc * CCR approval and rejection emails * add back admin_approval_ccr email templates * Link ccr author name to profile in RFPs * copy tweaks * copy tweak * hookup mangle user command * Fix/add endif in jinja * fix tests * review * fix review
2019-12-05 17:01:02 -08:00
class BaseCCRCreatorConfig(BaseUserConfig):
def setUp(self):
super().setUp()
self._ccr = CCR.create(
status=ProposalStatus.DRAFT,
title=test_ccr["title"],
content=test_ccr["content"],
brief=test_ccr["brief"],
target=test_ccr["target"],
user_id=self.user.id
)
self._ccr_id = self._ccr.id
db.session.commit()
# always return fresh (avoid detached instance issues)
@property
def ccr(self):
return CCR.query.filter_by(id=self._ccr_id).first()