This repository has been archived on 2025-11-04. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
csmb-housewars/tests/test_user_entry_create.py

231 lines
10 KiB
Python

from django.urls import reverse
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.expected_conditions import visibility_of
from webdriver_manager.chrome import ChromeDriverManager
from housewars.models import House, Activity, UserEntry
class UserEntryCreatePageTest(StaticLiveServerTestCase):
def setUp(self):
# Headless chrome driver test setup
options = ChromeOptions()
options.add_argument('--headless')
options.add_argument('--start-maximized')
options.add_argument('--disable-gpu')
self.browser = Chrome(
ChromeDriverManager().install(), options=options)
self.url = self.live_server_url + reverse('housewars:signup')
# Initial data setup
self.house = House.objects.create(name='Hawk')
self.activity30 = Activity.objects.create(
name='Dodgeball', time=30, default_quota=5)
self.activity60 = Activity.objects.create(
name='Volleyball', time=60, default_quota=5)
self.hidden = Activity.objects.create(
name='Hidden', time=30, default_quota=1)
def tearDown(self):
self.browser.close()
def test_valid_form_submission(self):
self.browser.get(self.url)
# Wait until browser loads page before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'header')))
# Fill in form with valid inputs
self.browser.find_element(By.ID, 'first-name').send_keys('Test')
self.browser.find_element(By.ID, 'last-name').send_keys('User')
self.browser.find_element(
By.ID, 'email').send_keys('test.user@slps.org')
Select(self.browser.find_element(By.ID, 'grade')
).select_by_visible_text('9th/Freshman')
Select(self.browser.find_element(By.ID, 'house')
).select_by_visible_text('Hawk')
self.browser.find_element(By.ID, 'submit').click()
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'activity1')))
Select(self.browser.find_element(By.ID, 'activity1')
).select_by_visible_text('Dodgeball - 30 min')
Select(self.browser.find_element(By.ID, 'activity2')
).select_by_visible_text('Dodgeball - 30 min')
self.browser.find_element(By.ID, 'submit').click()
# Verify signup is successful
success_text = self.browser.find_element(
By.CSS_SELECTOR, 'div.alert.alert-success').text
self.assertEquals(success_text, 'Your signup has been submitted.')
# Verify that activity detail cards are present
activity_confirm = self.browser.find_elements(
By.CSS_SELECTOR, 'div.alert.alert-success')
self.assertEquals(len(activity_confirm), 3)
def test_invalid_email(self):
self.browser.get(self.live_server_url)
# Wait until browser loads page before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'header')))
# Fill in form with valid inputs except email
self.browser.find_element(By.ID, 'first-name').send_keys('Test')
self.browser.find_element(By.ID, 'last-name').send_keys('User')
self.browser.find_element(
By.ID, 'email').send_keys('test.user@gmail.com')
Select(self.browser.find_element(By.ID, 'grade')
).select_by_visible_text('9th/Freshman')
Select(self.browser.find_element(By.ID, 'house')
).select_by_visible_text('Hawk')
self.browser.find_element(By.ID, 'submit').click()
# Verify that there is a domain error on submit
error_text = self.browser.find_element(
By.CSS_SELECTOR, 'div.alert.alert-danger').text
self.assertEquals(error_text, 'Please use your school email.')
def test_used_email(self):
UserEntry.objects.create(first_name='Test', last_name='User', email='test.user@slps.org', grade=9, house=self.house,
activity1=self.activity30, activity2=self.activity30)
self.browser.get(self.live_server_url)
# Wait until browser loads page before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'header')))
# Fill in form with valid inputs and duplicate email
self.browser.find_element(By.ID, 'first-name').send_keys('Test')
self.browser.find_element(By.ID, 'last-name').send_keys('User')
self.browser.find_element(
By.ID, 'email').send_keys('test.user@slps.org')
Select(self.browser.find_element(By.ID, 'grade')
).select_by_visible_text('9th/Freshman')
Select(self.browser.find_element(By.ID, 'house')
).select_by_visible_text('Hawk')
self.browser.find_element(By.ID, 'submit').click()
# Verify that duplicate error shows up on submit
error_text = self.browser.find_element(
By.CSS_SELECTOR, 'div.alert.alert-danger').text
self.assertEquals(
error_text, 'A signup with this email already exists, if you want to change your signups, please email ipatino3341@slps.org.')
def test_invalid_activities_are_not_visible(self):
UserEntry.objects.create(first_name='Test', last_name='User', email='user.exist@slps.org', grade=9, house=self.house,
activity1=self.hidden, activity2=self.activity30)
self.browser.get(self.live_server_url)
# Wait until browser loads page before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'header')))
# Fill in form with valid inputs
self.browser.find_element(By.ID, 'first-name').send_keys('Test')
self.browser.find_element(By.ID, 'last-name').send_keys('User')
self.browser.find_element(
By.ID, 'email').send_keys('test.user@slps.org')
Select(self.browser.find_element(By.ID, 'grade')
).select_by_visible_text('9th/Freshman')
Select(self.browser.find_element(By.ID, 'house')
).select_by_visible_text('Hawk')
self.browser.find_element(By.ID, 'submit').click()
# Wait until browser loads next step of form before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'activity1')))
activity1 = Select(self.browser.find_element(By.ID, 'activity1'))
activity2 = Select(self.browser.find_element(By.ID, 'activity2'))
# Assert that full activity is not shown
self.assertRaises(NoSuchElementException,
activity1.select_by_visible_text, 'Hidden - 30 min')
# Asser that 60 minute activity is not shown in second slot
self.assertRaises(NoSuchElementException,
activity2.select_by_visible_text, 'Volleyball - 60 min')
# Assert that valid activities are still shown in slot
activity1.select_by_visible_text('Volleyball - 60 min')
activity2.select_by_visible_text('Hidden - 30 min')
def test_full_activity_shows_for_other_houses(self):
House.objects.create(name='Snowy')
UserEntry.objects.create(first_name='Test', last_name='User', email='user.exist@slps.org', grade=9, house=self.house,
activity1=self.hidden, activity2=self.hidden)
self.browser.get(self.url)
# Wait until browser loads page before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'header')))
# Fill in form with valid inputs and separate house
self.browser.find_element(By.ID, 'first-name').send_keys('Test')
self.browser.find_element(By.ID, 'last-name').send_keys('User')
self.browser.find_element(
By.ID, 'email').send_keys('test.user@slps.org')
Select(self.browser.find_element(By.ID, 'grade')
).select_by_visible_text('9th/Freshman')
Select(self.browser.find_element(By.ID, 'house')
).select_by_visible_text('Snowy')
self.browser.find_element(By.ID, 'submit').click()
# Wait until browser loads next form step before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'activity1')))
# Verify that full activity is still showing for other house
activity1 = Select(self.browser.find_element(By.ID, 'activity1'))
activity2 = Select(self.browser.find_element(By.ID, 'activity2'))
activity1.select_by_visible_text('Hidden - 30 min')
activity2.select_by_visible_text('Hidden - 30 min')
def test_activities_gt_allowed_time(self):
self.browser.get(self.url)
# Wait until browser loads page before continuing
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'header')))
# Fill in form with valid inputs
self.browser.find_element(By.ID, 'first-name').send_keys('Test')
self.browser.find_element(By.ID, 'last-name').send_keys('User')
self.browser.find_element(
By.ID, 'email').send_keys('test.user@slps.org')
Select(self.browser.find_element(By.ID, 'grade')
).select_by_visible_text('9th/Freshman')
Select(self.browser.find_element(By.ID, 'house')
).select_by_visible_text('Hawk')
self.browser.find_element(By.ID, 'submit').click()
WebDriverWait(self.browser, timeout=5).until(
visibility_of(self.browser.find_element(By.ID, 'activity1')))
Select(self.browser.find_element(By.ID, 'activity1')
).select_by_visible_text('Volleyball - 60 min')
Select(self.browser.find_element(By.ID, 'activity2')
).select_by_visible_text('Dodgeball - 30 min')
self.browser.find_element(By.ID, 'submit').click()
# Verify error
error_text = self.browser.find_element(
By.CSS_SELECTOR, 'div.alert.alert-danger').text
self.assertEquals(
error_text, 'Please pick activities adding up to one hour.')