import os import time from django.contrib.staticfiles.testing import StaticLiveServerTestCase from selenium import webdriver from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.by import By from .container_commands import reset_database MAX_WAIT = 5 # Decorator fns def wait(fn): def modified_fn(*args, **kwargs): start_time = time.time() while True: try: return fn(*args, **kwargs) except (AssertionError, WebDriverException) as e: if time.time() - start_time > MAX_WAIT: raise e time.sleep(0.5) return modified_fn class FunctionalTest(StaticLiveServerTestCase): # Helper methods def setUp(self): self.browser = webdriver.Firefox() self.test_server = os.environ.get("TEST_SERVER") if self.test_server: self.live_server_url = 'http://' + self.test_server reset_database(self.test_server) def tearDown(self): self.browser.quit() @wait def wait_for(self, fn): return fn() def get_item_input_box(self): return self.browser.find_element(By.ID, "id_text") @wait def wait_for_row_in_list_table(self, row_text): rows = self.browser.find_elements(By.CSS_SELECTOR, "#id_list_table tr") self.assertIn(row_text, [row.text for row in rows]) @wait def wait_to_be_logged_in(self, email): self.browser.find_element(By.CSS_SELECTOR, "#id_logout"), navbar = self.browser.find_element(By.CSS_SELECTOR, ".navbar") self.assertIn(email, navbar.text) @wait def wait_to_be_logged_out(self, email): lambda: self.browser.find_element(By.CSS_SELECTOR, "input[name=email]"), navbar = self.browser.find_element(By.CSS_SELECTOR, ".navbar") self.assertNotIn(email, navbar.text)