375 lines
15 KiB
Python
375 lines
15 KiB
Python
from regluit.core import models
|
|
from regluit.payment.models import Transaction, PaymentResponse, Receiver
|
|
from regluit.payment.manager import PaymentManager
|
|
from regluit.payment.paypal import IPN_PREAPPROVAL_STATUS_ACTIVE, IPN_PAY_STATUS_INCOMPLETE, IPN_PAY_STATUS_COMPLETED
|
|
|
|
import django
|
|
from django.conf import settings
|
|
|
|
from selenium import selenium, webdriver
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.common.exceptions import NoSuchElementException
|
|
import unittest, time, re
|
|
|
|
import logging
|
|
import os
|
|
|
|
# PayPal developer sandbox
|
|
from regluit.payment.tests import loginSandbox, paySandbox, payAmazonSandbox
|
|
|
|
def setup_selenium():
|
|
# Set the display window for our xvfb
|
|
os.environ['DISPLAY'] = ':99'
|
|
|
|
def set_test_logging():
|
|
|
|
# Setup debug logging to our console so we can watch
|
|
defaultLogger = logging.getLogger('')
|
|
defaultLogger.addHandler(logging.StreamHandler())
|
|
defaultLogger.setLevel(logging.DEBUG)
|
|
|
|
# Set the selenium logger to info
|
|
sel = logging.getLogger("selenium")
|
|
sel.setLevel(logging.INFO)
|
|
|
|
|
|
|
|
class GoogleWebDriverTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
setup_selenium()
|
|
self.verificationErrors = []
|
|
# This is an empty array where we will store any verification errors
|
|
# we find in our tests
|
|
|
|
self.selenium = webdriver.Firefox()
|
|
set_test_logging()
|
|
|
|
def test_google_rc(self):
|
|
sel = self.selenium
|
|
sel.get("https://www.google.com/")
|
|
search_box = sel.find_elements_by_xpath("//input[@type='text']")
|
|
search_box[0].send_keys("Bach")
|
|
search_box[0].submit()
|
|
time.sleep(3)
|
|
try:
|
|
sel.find_element_by_xpath("//a[contains(@href,'wikipedia')]")
|
|
except NoSuchElementException, e:
|
|
self.verificationErrors.append(str(e))
|
|
|
|
def tearDown(self):
|
|
self.selenium.quit()
|
|
self.assertEqual([], self.verificationErrors)
|
|
|
|
def run_google_rc():
|
|
"""
|
|
"""
|
|
|
|
from selenium import selenium
|
|
import unittest, time, re
|
|
|
|
class google_rc(unittest.TestCase):
|
|
def setUp(self):
|
|
self.verificationErrors = []
|
|
self.selenium = selenium("localhost", 4444, "*firefox", "https://www.google.com/")
|
|
self.selenium.start()
|
|
|
|
def test_google_rc(self):
|
|
sel = self.selenium
|
|
sel.open("/")
|
|
sel.type("//input[@type='text']", "Bach")
|
|
sel.click("name=btnG")
|
|
time.sleep(3)
|
|
try: self.failUnless(sel.is_text_present("Wikipedia"))
|
|
except AssertionError, e: self.verificationErrors.append(str(e))
|
|
|
|
def tearDown(self):
|
|
self.selenium.stop()
|
|
self.assertEqual([], self.verificationErrors)
|
|
|
|
testcases = [google_rc]
|
|
suites = unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(testcase) for testcase in testcases])
|
|
unittest.TextTestRunner().run(suites)
|
|
|
|
def run_google_wd():
|
|
"""
|
|
A google example using WebDriver
|
|
"""
|
|
|
|
testcases = [GoogleWebDriverTest]
|
|
suites = unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(testcase) for testcase in testcases])
|
|
unittest.TextTestRunner().run(suites)
|
|
|
|
|
|
# from selenium import webdriver
|
|
# driver = webdriver.Remote(desired_capabilities=webdriver.DesiredCapabilities.HTMLUNITWITHJS)
|
|
# driver.get("http://google.com")
|
|
|
|
|
|
|
|
pm = PaymentManager()
|
|
|
|
def campaign_display():
|
|
|
|
campaigns_with_active_transactions = models.Campaign.objects.filter(transaction__status=IPN_PREAPPROVAL_STATUS_ACTIVE)
|
|
campaigns_with_incomplete_transactions = models.Campaign.objects.filter(transaction__status=IPN_PAY_STATUS_INCOMPLETE)
|
|
campaigns_with_completed_transactions = models.Campaign.objects.filter(transaction__status=IPN_PAY_STATUS_COMPLETED)
|
|
|
|
print "campaigns with active transactions", campaigns_with_active_transactions
|
|
print "campaigns with incomplete transactions", campaigns_with_incomplete_transactions
|
|
print "campaigns with completed transactions", campaigns_with_completed_transactions
|
|
|
|
def campaigns_active():
|
|
return models.Campaign.objects.filter(transaction__status=IPN_PREAPPROVAL_STATUS_ACTIVE)
|
|
|
|
def campaigns_incomplete():
|
|
return models.Campaign.objects.filter(transaction__status=IPN_PAY_STATUS_INCOMPLETE)
|
|
|
|
def campaigns_completed():
|
|
return models.Campaign.objects.filter(transaction__status=IPN_PAY_STATUS_COMPLETED)
|
|
|
|
def execute_campaigns(clist):
|
|
return [pm.execute_campaign(c) for c in clist]
|
|
|
|
def finish_campaigns(clist):
|
|
return [pm.finish_campaign(c) for c in clist]
|
|
|
|
def drop_all_transactions():
|
|
PaymentResponse.objects.all().delete()
|
|
Receiver.objects.all().delete()
|
|
Transaction.objects.all().delete()
|
|
|
|
# go through all Campaigns and set the self.left = self.target
|
|
for c in models.Campaign.objects.all():
|
|
c.left = c.target
|
|
c.save()
|
|
|
|
def recipient_status(clist):
|
|
return [[[(r.email, r.txn_id, r.status, r.amount) for r in t.receiver_set.all()] for t in c.transaction_set.all()] for c in clist]
|
|
|
|
# by the time we've executed a campaign, we should have r.status = 'COMPLETED' for primary but None for secondary
|
|
# [[[r.status for r in t.receiver_set.all()] for t in c.transaction_set.all()] for c in campaigns_incomplete()]
|
|
|
|
# [[[r.status for r in t.receiver_set.all()] for t in c.transaction_set.all()] for c in campaigns_completed()]
|
|
|
|
# res = [pm.finish_campaign(c) for c in campaigns_incomplete()]
|
|
|
|
|
|
def support_campaign(unglue_it_url = settings.LIVE_SERVER_TEST_URL, do_local=True, backend='amazon', browser='firefox'):
|
|
"""
|
|
programatically fire up selenium to make a Pledge
|
|
do_local should be True only if you are running support_campaign on db tied to LIVE_SERVER_TEST_URL
|
|
"""
|
|
|
|
django.db.transaction.enter_transaction_management()
|
|
|
|
UNGLUE_IT_URL = unglue_it_url
|
|
USER = settings.UNGLUEIT_TEST_USER
|
|
PASSWORD = settings.UNGLUEIT_TEST_PASSWORD
|
|
|
|
setup_selenium()
|
|
|
|
if browser == 'firefox':
|
|
sel = webdriver.Firefox()
|
|
elif browser == 'chrome':
|
|
sel = webdriver.Chrome(executable_path='/Users/raymondyee/C/src/Gluejar/regluit/test/chromedriver')
|
|
elif browser == 'htmlunit':
|
|
# HTMLUNIT with JS -- not successful
|
|
sel = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.HTMLUNITWITHJS)
|
|
else:
|
|
sel = webdriver.Firefox()
|
|
|
|
time.sleep(10)
|
|
|
|
# find a campaign to pledge to
|
|
if backend == 'paypal':
|
|
loginSandbox(sel)
|
|
time.sleep(2)
|
|
|
|
print "now opening unglue.it"
|
|
|
|
#sel.get("http://www.google.com")
|
|
sel.get(UNGLUE_IT_URL)
|
|
|
|
# long wait because sel is slow after PayPal
|
|
sign_in_link = WebDriverWait(sel, 100).until(lambda d : d.find_element_by_xpath("//span[contains(text(),'Sign In')]/.."))
|
|
sign_in_link.click()
|
|
|
|
# enter unglue.it login info
|
|
input_username = WebDriverWait(sel,20).until(lambda d : d.find_element_by_css_selector("input#id_username"))
|
|
input_username.send_keys(USER)
|
|
sel.find_element_by_css_selector("input#id_password").send_keys(PASSWORD)
|
|
sel.find_element_by_css_selector("input[value*='sign in']").click()
|
|
|
|
# click on biggest campaign list
|
|
# I have no idea why selenium thinks a is not displayed....so that's why I'm going up one element.
|
|
# http://stackoverflow.com/a/6141678/7782
|
|
biggest_campaign_link = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("li > a[href*='/campaigns/ending']"))
|
|
biggest_campaign_link.click()
|
|
time.sleep(1)
|
|
|
|
# pull up one of the campaigns to pledge to
|
|
# for now, take the first book and click on the link to get to the work page
|
|
work_links = WebDriverWait(sel,10).until(lambda d: d.find_elements_by_css_selector("div.book-list div.title a"))
|
|
work_links[0].click()
|
|
|
|
support_button = WebDriverWait(sel,10).until(lambda d: d.find_element_by_css_selector("input[value*='Support']"))
|
|
support_button.click()
|
|
|
|
# just click Pledge button without filling out amount -- should have the form validation spot the error
|
|
pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Pledge']"))
|
|
pledge_button.click()
|
|
# check to see whether there is an error
|
|
error_messages = WebDriverWait(sel,20).until(lambda d: d.find_elements_by_css_selector("ul.errorlist"))
|
|
if len(error_messages):
|
|
print "yes: Error in just hitting pledge button as expected"
|
|
else:
|
|
print "ooops: there should be an error message when pledge button hit"
|
|
|
|
# fill out a premium -- the first one for now
|
|
premium_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector('input[type="radio"][value="1"]'))
|
|
premium_button.click()
|
|
|
|
print "making $10 pledge"
|
|
|
|
# now we have to replace the current preapproval amount with 10
|
|
sel.execute_script("""document.getElementById("id_preapproval_amount").value="10";""")
|
|
# must also pick a premium level -- otherwise there will not be a pledge_button -- let's pick the first premium ($1)
|
|
premium_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector('input[type="radio"][value="1"]'))
|
|
premium_button.click()
|
|
|
|
pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Pledge']"))
|
|
pledge_button.click()
|
|
|
|
# grab the URL where sel is now?
|
|
|
|
if backend == 'paypal':
|
|
print "Now trying to pay PayPal", sel.current_url
|
|
paySandbox(None, sel, sel.current_url, authorize=True, already_at_url=True, sleep_time=5)
|
|
elif backend == 'amazon':
|
|
payAmazonSandbox(sel)
|
|
|
|
# should be back on a pledge complete page
|
|
print sel.current_url, re.search(r"/pledge/complete",sel.current_url)
|
|
|
|
time.sleep(2)
|
|
django.db.transaction.commit()
|
|
|
|
# time out to simulate an IPN -- update all the transactions
|
|
if do_local:
|
|
django.db.transaction.enter_transaction_management()
|
|
pm = PaymentManager()
|
|
print pm.checkStatus()
|
|
transaction0 = Transaction.objects.all()[0]
|
|
print "transaction amount:{0}, transaction premium:{1}".format(transaction0.amount, transaction0.premium.id)
|
|
django.db.transaction.commit()
|
|
|
|
|
|
django.db.transaction.enter_transaction_management()
|
|
|
|
# I have no idea what the a[href*="/work/"] is not displayed....so that's why I'm going up one element.
|
|
work_url = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector('p > a[href*="/work/"]'))
|
|
work_url.click()
|
|
|
|
# change_pledge
|
|
print "clicking Modify Pledge button"
|
|
change_pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Modify Pledge']"))
|
|
change_pledge_button.click()
|
|
|
|
# enter a new pledge, which is less than the previous amount and therefore doesn't require a new PayPal transaction
|
|
print "changing pledge to $5 -- should not need to go to PayPal"
|
|
preapproval_amount_input = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input#id_preapproval_amount"))
|
|
preapproval_amount_input.clear() # get rid of existing pledge
|
|
preapproval_amount_input.send_keys("5")
|
|
pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Modify Pledge']"))
|
|
pledge_button.click()
|
|
|
|
# return to the Work page again
|
|
work_url = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector('p > a[href*="/work/"]'))
|
|
work_url.click()
|
|
change_pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Modify Pledge']"))
|
|
change_pledge_button.click()
|
|
|
|
# enter a new pledge, which is more than the previous amount and therefore requires a new PayPal transaction
|
|
preapproval_amount_input = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input#id_preapproval_amount"))
|
|
preapproval_amount_input.clear() # get rid of existing pledge
|
|
preapproval_amount_input.send_keys("25")
|
|
pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Modify Pledge']"))
|
|
pledge_button.click()
|
|
if backend == 'paypal':
|
|
paySandbox(None, sel, sel.current_url, authorize=True, already_at_url=True, sleep_time=5)
|
|
elif backend == 'amazon':
|
|
payAmazonSandbox(sel)
|
|
|
|
# wait a bit to allow PayPal sandbox to be update the status of the Transaction
|
|
time.sleep(10)
|
|
django.db.transaction.commit()
|
|
|
|
# time out to simulate an IPN -- update all the transactions
|
|
if do_local:
|
|
django.db.transaction.enter_transaction_management()
|
|
pm = PaymentManager()
|
|
print pm.checkStatus()
|
|
django.db.transaction.commit()
|
|
|
|
django.db.transaction.enter_transaction_management()
|
|
|
|
# now go back to the work page, hit modify pledge, and then the cancel link
|
|
work_url = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector('p > a[href*="/work/"]'))
|
|
work_url.click()
|
|
change_pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Modify Pledge']"))
|
|
change_pledge_button.click()
|
|
cancel_url = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector('a[href*="/pledge/cancel"]'))
|
|
cancel_url.click()
|
|
|
|
# hit the confirm cancellation button
|
|
cancel_pledge_button = WebDriverWait(sel,20).until(lambda d: d.find_element_by_css_selector("input[value*='Confirm Pledge Cancellation']"))
|
|
cancel_pledge_button.click()
|
|
|
|
django.db.transaction.commit()
|
|
|
|
# Why is the status of the new transaction not being updated?
|
|
|
|
# force a db lookup -- see whether there are 1 or 2 transactions
|
|
# they should both be cancelled
|
|
if do_local:
|
|
transactions = list(Transaction.objects.all())
|
|
print "number of transactions", Transaction.objects.count()
|
|
|
|
print "transactions before pm.checkStatus"
|
|
print [(t.id, t.type, t.preapproval_key, t.status, t.premium, t.amount) for t in Transaction.objects.all()]
|
|
|
|
print "checkStatus:", pm.checkStatus(transactions=transactions)
|
|
|
|
|
|
yield sel
|
|
#sel.quit()
|
|
|
|
def successful_campaign_signal():
|
|
"""fire off a success_campaign signal and send notifications"""
|
|
import regluit
|
|
from notification.engine import send_all
|
|
c = regluit.core.models.Campaign.objects.get(id=3)
|
|
regluit.core.signals.successful_campaign.send(sender=None, campaign=c)
|
|
send_all()
|
|
|
|
|
|
def berkeley_search():
|
|
sel = webdriver.Firefox()
|
|
sel.get("http://berkeley.edu")
|
|
search = WebDriverWait(sel,5).until(lambda d: d.find_element_by_css_selector('input[id="search_text"]'))
|
|
search.send_keys("quantum computing")
|
|
|
|
return sel
|
|
|
|
# wait for a bit and then highlight the text and fill it out with "Bach" instead
|
|
# I was looking at using XPath natively in Firefox....
|
|
# https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript#Within_an_HTML_Document
|
|
# document.evaluate('//input[@id="search_text"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ).snapshotItem(0);
|
|
|
|
def suites():
|
|
testcases = [GoogleWebDriverTest]
|
|
suites = unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(testcase) for testcase in testcases])
|
|
|
|
|