blob: 5a1a0f0b1cfe939e075a7d7ff9ae6c3900ca87f5 [file] [log] [blame]
# Copyright (C) 2019 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 resultsdbpy.controller.commit import Commit
from resultsdbpy.model.mock_cassandra_context import MockCassandraContext
from resultsdbpy.model.mock_repository import MockStashRepository, MockSVNRepository
from resultsdbpy.model.wait_for_docker_test_case import WaitForDockerTestCase
from resultsdbpy.view.view_routes_unittest import WebSiteTestCase
from selenium.webdriver.support.select import Select
class CommitViewUnittest(WebSiteTestCase):
def register_all_commits(self, client):
for repo in [MockStashRepository.safari(), MockSVNRepository.webkit()]:
for commits in repo.commits.values():
for commit in commits:
self.assertEqual(200, client.post(self.URL + '/api/commits/register', data=Commit.Encoder().default(commit)).status_code)
def unpack_commit_table(self, commit_table):
headers = commit_table.find_elements_by_tag_name('th')
repos = [header.text for header in headers if header.text]
indecies = [1 for _ in range(len(headers))]
commits = {repo: [] for repo in repos}
rows = commit_table.find_element_by_tag_name('tbody').find_elements_by_tag_name('tr')
for row in rows:
indecies = [i - 1 for i in indecies]
cells = row.find_elements_by_tag_name('td')
i = 0
for cell in cells:
while i < len(indecies) and indecies[i] != 0:
i += 1
self.assertLess(i, len(indecies))
indecies[i] = int(cell.get_attribute('rowspan') or 1)
if i == 0 or not cell.text:
continue
commits[repos[i - 1]].append(cell)
return commits
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_drawer(self, driver, **kwargs):
driver.get(self.URL + '/commits')
time.sleep(.2)
self.assertNotIn('hidden', driver.find_element_by_class_name('sidebar').get_attribute('class'))
self.toggle_drawer(driver, assert_displayed=False)
self.toggle_drawer(driver, assert_displayed=True)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_commit_table(self, driver, client, **kwargs):
self.register_all_commits(client)
driver.get(self.URL + '/commits')
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
self.assertEqual(2, len(commits.keys()))
self.assertIn('safari', commits)
self.assertIn('webkit', commits)
self.assertEqual(5, len(commits['safari']))
self.assertEqual(5, len(commits['webkit']))
rows = commit_table.find_element_by_tag_name('tbody').find_elements_by_tag_name('tr')
self.assertNotEqual(
rows[1].find_elements_by_tag_name('td')[0].text,
rows[2].find_elements_by_tag_name('td')[0].text,
)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_commit(self, driver, client, **kwargs):
self.register_all_commits(client)
driver.get(self.URL + '/commits')
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
links = commits['safari'][0].find_elements_by_tag_name('a')
for link in links:
if link.text != 'More Info':
link.click()
break
time.sleep(.5)
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
self.assertEqual(2, len(commits.keys()))
self.assertIn('safari', commits)
self.assertIn('webkit', commits)
self.assertEqual(1, len(commits['safari']))
self.assertEqual(5, len(commits['webkit']))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_radar_strings(self, driver, client, **kwargs):
self.register_all_commits(client)
driver.get(self.URL + '/commits?id=336610a4')
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
changelog = commits['safari'][0].find_element_by_tag_name('div')
radar = '<rdar://problem/99999999>'
self.assertEqual(changelog.text[:len(radar)], radar)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_range_slider(self, driver, client, **kwargs):
self.register_all_commits(client)
driver.get(self.URL + '/commits')
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
self.assertEqual(2, len(commits.keys()))
self.assertIn('safari', commits)
self.assertIn('webkit', commits)
self.assertEqual(5, len(commits['safari']))
self.assertEqual(5, len(commits['webkit']))
controls = self.find_input_with_name(driver, 'Limit:').find_elements_by_tag_name('input')
self.assertEqual(3, len(controls))
input = [control for control in controls if control.get_attribute('type') == 'number'][0]
self.assertIsNotNone(input)
input.clear()
input.send_keys('3')
self.toggle_drawer(driver, assert_displayed=False)
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
self.assertEqual(2, len(commits.keys()))
self.assertIn('safari', commits)
self.assertIn('webkit', commits)
self.assertEqual(3, len(commits['safari']))
self.assertEqual(3, len(commits['webkit']))
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_one_line_switch(self, driver, client, **kwargs):
self.register_all_commits(client)
driver.get(self.URL + '/commits?id=7be40842')
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
line_1 = u'Change 4 \u2014 (Part 2) description.'
line_2 = 'Reviewed by person.'
commits = self.unpack_commit_table(commit_table)
changelog = commits['safari'][0].find_element_by_tag_name('div')
self.assertEqual(line_1, changelog.text)
controls = self.find_input_with_name(driver, 'One-line:').find_elements_by_tag_name('span')
self.assertEqual(1, len(controls))
input = [control for control in controls if control.get_attribute('class') == 'slider'][0]
self.assertIsNotNone(input)
input.click()
self.toggle_drawer(driver, assert_displayed=False)
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
changelog = commits['safari'][0].find_element_by_tag_name('div')
self.assertEqual(line_1 + line_2, changelog.text)
@WaitForDockerTestCase.mock_if_no_docker(mock_redis=FakeStrictRedis, mock_cassandra=MockCassandraContext)
@WebSiteTestCase.decorator()
def test_branch_selection(self, driver, client, **kwargs):
self.register_all_commits(client)
driver.get(self.URL + '/commits')
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
self.assertEqual(2, len(commits.keys()))
self.assertIn('safari', commits)
self.assertIn('webkit', commits)
self.assertEqual(5, len(commits['safari']))
self.assertEqual(5, len(commits['webkit']))
controls = self.find_input_with_name(driver, 'Branch').find_elements_by_tag_name('select')
self.assertEqual(1, len(controls))
Select(controls[0]).select_by_visible_text('safari-606-branch')
self.toggle_drawer(driver, assert_displayed=False)
while not driver.find_elements_by_class_name('commit-table'):
time.sleep(.1)
commit_table = driver.find_element_by_class_name('commit-table')
commits = self.unpack_commit_table(commit_table)
self.assertEqual(2, len(commits.keys()))
self.assertIn('safari', commits)
self.assertIn('webkit', commits)
self.assertEqual(2, len(commits['safari']))
self.assertEqual(2, len(commits['webkit']))