blob: 6638503925b2c7dc67f710ba2ccd70a1fbdf3178 [file] [log] [blame]
# Copyright (C) 2019-2021 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import time
from fakeredis import FakeStrictRedis
from redis import StrictRedis
from resultsdbpy.controller.api_routes import APIRoutes
from resultsdbpy.flask_support.flask_testcase import FlaskTestCase
from resultsdbpy.model.cassandra_context import CassandraContext
from resultsdbpy.model.mock_cassandra_context import MockCassandraContext
from resultsdbpy.model.mock_model_factory import MockModelFactory
from resultsdbpy.model.model import Model
from resultsdbpy.model.repository import StashRepository, WebKitRepository
from resultsdbpy.model.wait_for_docker_test_case import WaitForDockerTestCase
from resultsdbpy.view.view_routes import ViewRoutes
class WebSiteTestCase(FlaskTestCase, WaitForDockerTestCase):
KEYSPACE = 'web_site_testcase_keyspace'
def toggle_drawer(self, driver, assert_displayed=None):
sidebar = driver.find_element_by_class_name('sidebar')
sidebar.find_elements_by_tag_name('button')[0].click()
time.sleep(.5)
if assert_displayed:
self.assertNotIn('hidden', sidebar.get_attribute('class'))
elif assert_displayed is False:
self.assertIn('hidden', sidebar.get_attribute('class'))
def find_input_with_name(self, driver, name):
control = [label.parent for label in driver.find_element_by_class_name('sidebar').find_elements_by_tag_name('div') if label.find_element_by_tag_name('label').text == name][0]
self.assertIsNotNone(control)
return control
@classmethod
def setup_webserver(cls, app, redis=StrictRedis, cassandra=CassandraContext):
with MockModelFactory.safari(), MockModelFactory.webkit():
cassandra.drop_keyspace(keyspace=cls.KEYSPACE)
redis_instance = redis()
model = Model(
redis=redis_instance, cassandra=cassandra(keyspace=cls.KEYSPACE, create_keyspace=True),
repositories=[
WebKitRepository(),
StashRepository('https://bitbucket.example.com/projects/SAFARI/repos/safari'),
],
)
api_routes = APIRoutes(model=model, import_name=__name__)
view_routes = ViewRoutes(model=model, controller=api_routes, import_name=__name__)
app.register_blueprint(api_routes)
app.register_blueprint(view_routes)
@classmethod
def decorator(cls):
return FlaskTestCase.run_with_selenium()
class WebSiteUnittest(WebSiteTestCase):
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_title(self, driver, **kwargs):
driver.get(self.URL)
self.assertEqual(driver.title, 'Results Database')
title = driver.find_element_by_class_name('title').find_element_by_tag_name('div')
self.assertEqual(title.text.lstrip().rstrip(), 'Results Database')
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_main(self, driver, **kwargs):
driver.get(self.URL)
content = driver.find_element_by_id('app').find_element_by_class_name('content')
self.assertIsNotNone(content)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_commit_link(self, driver, **kwargs):
driver.get(self.URL)
actions = driver.find_element_by_class_name('actions')
links = actions.find_elements_by_tag_name('a')
commit_link = None
for link in links:
if 'Commits' in link.text:
commit_link = link
break
self.assertIsNotNone(commit_link)
commit_link.click()
time.sleep(.1)
self.assertEqual(driver.title, 'Results Database: Commits')