import time
from accounts.models import User
from organisations.models import Organisation
from payments.views.core import get_balance, org_balance
from payments.models import MemberTransaction, OrganisationTransaction
from selenium.webdriver.common.by import By
from tests.test_manager import CobaltTestManagerIntegration
"""
Common functions for payments.
"""
[docs]
def setup_auto_top_up(manager: CobaltTestManagerIntegration, user: User = None):
"""Selenium function to set up auto top up
Args:
manager: test_manager.Manager object for interacting with system
user: User object representing user to set up (optional)
"""
# login this user
if user:
manager.login_selenium_user(user)
# Go to auto top up screen
manager.driver.get(f"{manager.base_url}/payments/setup-autotopup")
# wait for iFrame to load the old fashioned way
time.sleep(3)
# Stripe fields are in an iFrame, we need to switch to that to find them
manager.driver.switch_to.frame(manager.driver.find_element(By.TAG_NAME, "iframe"))
# Enter details
manager.driver.find_element(By.CSS_SELECTOR, 'input[name="cardnumber"]').send_keys(
"4242424242424242"
)
manager.driver.find_element(By.CSS_SELECTOR, 'input[name="exp-date"]').send_keys(
"0235"
)
manager.driver.find_element(By.CSS_SELECTOR, 'input[name="cvc"]').send_keys("999")
# Switch back to main part of document
manager.driver.switch_to.default_content()
# Hit submit
manager.driver.find_element(By.ID, "submit").click()
# Give Stripe some time to come back to us
time.sleep(5)
# Login main user again
if user:
manager.login_selenium_user(manager.test_user)
[docs]
def stripe_manual_payment_screen(manager: CobaltTestManagerIntegration):
"""Enter details on manual payment screen to confirm payment"""
time.sleep(5)
manager.driver.switch_to.frame(manager.driver.find_element(By.TAG_NAME, "iframe"))
manager.driver.find_element(By.NAME, "cardnumber").click()
# send in blocks to slow down a little
manager.driver.find_element(By.NAME, "cardnumber").send_keys("4242")
manager.driver.find_element(By.NAME, "cardnumber").send_keys("4242")
manager.driver.find_element(By.NAME, "cardnumber").send_keys("4242")
manager.driver.find_element(By.NAME, "cardnumber").send_keys("4242")
time.sleep(1)
manager.driver.find_element(By.NAME, "exp-date").send_keys("12 / 28")
time.sleep(1)
manager.driver.find_element(By.NAME, "cvc").send_keys("422")
manager.driver.switch_to.default_content()
manager.driver.find_element(By.ID, "button-text").click()
# Give Stripe some time to come back to us
time.sleep(3)
[docs]
def check_last_transaction_for_user(
manager: CobaltTestManagerIntegration,
user: User,
tran_desc,
tran_amt,
test_name,
other_member=None,
test_description=None,
):
"""Check if last transaction is as expected"""
user_tran = (
MemberTransaction.objects.filter(member=user).order_by("-created_date").first()
)
if other_member:
if (
user_tran.description == tran_desc
and float(user_tran.amount) == tran_amt
and other_member == user_tran.other_member
):
test_result = True
else:
test_result = False
result = f"Expected {other_member}, {tran_amt} and '{tran_desc}'. Got {user_tran.other_member}, {user_tran.amount} and '{user_tran.description}'"
else:
if user_tran.description == tran_desc and float(user_tran.amount) == tran_amt:
test_result = True
else:
test_result = False
result = f"Expected {tran_amt} and '{tran_desc}'. Got {user_tran.amount} and '{user_tran.description}'"
manager.save_results(
status=test_result,
test_name=test_name,
output=result,
test_description=test_description,
)
[docs]
def check_balance_for_user(
manager: CobaltTestManagerIntegration,
user: User = None,
expected_balance=0,
test_name=None,
test_description=None,
):
"""Check and return balance"""
user_balance = get_balance(user)
test_result = user_balance == expected_balance
manager.save_results(
status=test_result,
test_name=test_name,
output=f"Expected ${expected_balance}, got ${user_balance}",
test_description=test_description,
)
return user_balance
[docs]
def check_balance_for_org(
manager: CobaltTestManagerIntegration,
org: Organisation,
expected_balance=0,
test_name=None,
test_description=None,
):
"""Check and return balance"""
organisation_balance = org_balance(org)
test_result = organisation_balance == expected_balance
manager.save_results(
status=test_result,
test_name=test_name,
output=f"Expected ${expected_balance}, got ${organisation_balance}",
test_description=test_description,
)
return organisation_balance
[docs]
def set_balance_for_member(member: User, balance: float):
last_transaction = (
MemberTransaction.objects.filter(member=member).order_by("-pk").first()
)
if last_transaction:
last_transaction.balance = balance
else:
last_transaction = MemberTransaction(
member=member,
balance=balance,
amount=balance,
description="Setting balance",
type="Refund",
)
last_transaction.save()
[docs]
def set_balance_for_org(org: Organisation, balance: float):
last_transaction = (
OrganisationTransaction.objects.filter(organisation=org).order_by("-pk").first()
)
if last_transaction:
last_transaction.balance = balance
else:
last_transaction = MemberTransaction(
org=org,
balance=balance,
amount=balance,
description="Setting balance",
type="Refund",
)
last_transaction.save()