import os import urllib.request from flask import url_for from flask_testing import LiveServerTestCase from selenium import webdriver from app import create_app from pdc_config import TestConfig from tests.common_db_feed import resources_to_instancedb class BaseFrontTestCase(LiveServerTestCase): def create_app(self): # # remove logging lines on test output import logging log = logging.getLogger('werkzeug') log.setLevel(logging.INFO) log.disabled = True os.environ['WERKZEUG_RUN_MAIN'] = 'true' # pass in test configurations self.app = create_app(TestConfig) self.db_path = resources_to_instancedb(self.app) self.app.config.update( # Specify the test database as the default in_memory wont work for web tests SQLALCHEMY_DATABASE_URI='sqlite:///' + self.db_path, # Change the port that the liveserver listens on as we dont want to conflict with running:5000 LIVESERVER_PORT=8943 ) self.app_context = self.app.app_context() self.app_context.push() return self.app def setUp(self): self.driver = self.create_chrome_driver() # db.create_all() def tearDown(self): # fs_utils.clean_dirs() # db.session.remove() # db.drop_all() self.app_context.pop() if os.path.exists(self.db_path): os.remove(self.db_path) self.driver.close() self.driver.quit() # noinspection PyMethodMayBeStatic def is_in_docker(self): """ Test if in docker. :return: True if running in docker, False otherwise. """ if os.path.exists('/proc/self/cgroup'): with open('/proc/self/cgroup') as f: content = f.read() return '/docker/' in content return False def create_chrome_driver(self): """ Create then return the chrome driver. :return: the chrome driver. """ from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless') # options.add_argument('--log-level=3') # options.add_experimental_option('excludeSwitches', ['enable-logging']) if self.is_in_docker(): options.add_argument("--no-sandbox") return webdriver.Chrome(options=options) class AccessTestCase(BaseFrontTestCase): def test_ping(self): self.assertEqual("http://localhost:8943", self.get_server_url()) def test_selenium_access(self): # On ouvre le navigateur avec l'adresse du serveur. self.driver.get(self.get_server_url()) # L'adresse dans l'url doit ĂȘtre celle que l'on attend. self.assertEqual(self.driver.current_url, 'http://localhost:8943/') def test_server_is_up_and_running(self): response = urllib.request.urlopen(self.get_server_url()) self.assertEqual(response.code, 200) def test_agents_page(self): target_url = self.get_server_url() + url_for('main.agents') self.driver.get(target_url) self.assertEqual(self.driver.current_url, 'http://localhost:8943/agents') def test_agent_page(self): agent_id = 60 target_url = self.get_server_url() + url_for('main.agent', agent_id=agent_id) self.driver.get(target_url) self.assertEqual(self.driver.current_url, f'http://localhost:8943/agent/{agent_id}') td_elmts = self.driver.find_elements_by_xpath("//table[@id='charge_table']/tbody/tr/td") self.assertEqual(260, len(td_elmts)) def test_projects_page(self): target_url = self.get_server_url() + url_for('main.projects') self.driver.get(target_url) self.assertEqual(self.driver.current_url, 'http://localhost:8943/projects') def test_project_page(self): project_id = 8 target_url = self.get_server_url() + url_for('main.project', project_id=project_id) self.driver.get(target_url) self.assertEqual(self.driver.current_url, f'http://localhost:8943/project/{project_id}') td_elmts = self.driver.find_elements_by_xpath("//table[@id='charge_table']/tbody/tr/td") self.assertEqual(1085, len(td_elmts))