Skip to content

Commit

Permalink
Bug 1519995 - Perfherder graphs react conversion part 3 (#5286)
Browse files Browse the repository at this point in the history
Create components to handle graph controls, legend and graph container
Convert graph functionalty to react and replace jquery.flot with Victory
  • Loading branch information
sarah-clements committed Sep 9, 2019
1 parent 07c8059 commit 47b53c1
Show file tree
Hide file tree
Showing 43 changed files with 2,537 additions and 1,928 deletions.
2 changes: 1 addition & 1 deletion .neutrinorc.js
Expand Up @@ -150,7 +150,7 @@ module.exports = {
neutrino.config.performance
.hints('error')
.maxAssetSize(2 * 1024 * 1024)
.maxEntrypointSize(2.1 * 1024 * 1024);
.maxEntrypointSize(2.2 * 1024 * 1024);
}
},
],
Expand Down
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -74,7 +74,8 @@
"taskcluster-client-web": "8.1.1",
"taskcluster-lib-scopes": "10.0.2",
"webpack": "4.39.3",
"webpack-cli": "3.3.8"
"webpack-cli": "3.3.8",
"victory": "32.3.3"
},
"devDependencies": {
"@neutrinojs/eslint": "9.0.0-rc.3",
Expand Down
70 changes: 1 addition & 69 deletions tests/selenium/pages/perfherder.py
@@ -1,27 +1,12 @@
from pypom import Region
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

from .base import (Base,
Modal)
from .base import Base


class Perfherder(Base):
URL_TEMPLATE = '/perf.html'

_add_test_data_locator = (By.ID, 'add-test-data-button')
_test_series_locator = (By.CSS_SELECTOR, 'tr[ng-repeat*="series"]')

@property
def loaded(self):
return self.is_element_displayed(By.CSS_SELECTOR, '#graph canvas')

def add_test_data(self):
self.find_element(*self._add_test_data_locator).click()
self.wait.until(lambda _: self.PerformanceTestChooserModal(self).is_displayed)

return self.PerformanceTestChooserModal(self)

@property
def tool_tip(self):
return self.GraphTooltip(self)
Expand All @@ -31,59 +16,6 @@ def switch_to_treeherder(self):
from pages.treeherder import Treeherder
return Treeherder(self.driver, self.base_url).wait_for_page_to_load()

def series_list(self):
return [self.Series(self, element)
for element in self.find_elements(*self._test_series_locator)]

class PerformanceTestChooserModal(Modal):
_selct_frammework_locator = (By.CSS_SELECTOR, 'select[ng-model="selectedFramework"]')
_selct_project_locator = (By.CSS_SELECTOR, 'select[ng-model="selectedProject"]')
_selct_platform_locator = (By.CSS_SELECTOR, 'select[ng-model="selectedPlatform"]')
_selct_test_signature_locator = (By.CSS_SELECTOR, 'select[ng-model="selectedTestSignatures"]')
_select_test_to_add_locator = (By.CSS_SELECTOR, 'select[ng-model="selectedTestsToAdd"]')

_select_test_button_locator = (By.ID, 'select-test')
_add_button_locator = (By.CSS_SELECTOR, 'div.modal-footer > button')

def select_test(self, perf_datum):
select_frammework = Select(self.find_element(*self._selct_frammework_locator))
select_frammework.select_by_visible_text(perf_datum.signature.framework.name)

select_project = Select(self.find_element(*self._selct_project_locator))
select_project.select_by_visible_text(perf_datum.repository.name)

select_platform = Select(self.find_element(*self._selct_platform_locator))
select_platform.select_by_visible_text(perf_datum.signature.platform.platform)

select_test_signature = Select(self.find_element(*self._selct_test_signature_locator))
select_test_signature.select_by_value(perf_datum.signature.signature_hash)

self.find_element(*self._select_test_button_locator).click()

self.find_element(*self._add_button_locator).click()

class Series(Region):
_signature_locator = (By.CSS_SELECTOR, 'div.signature')
_test_name_locator = (By.ID, 'test-name')
_project_name_locator = (By.ID, 'project-name')
_platform_locator = (By.ID, 'platform')

@property
def signature_text(self):
return self.find_element(*self._signature_locator).text

@property
def test_name_text(self):
return self.find_element(*self._test_name_locator).text

@property
def project_name_text(self):
return self.find_element(*self._project_name_locator).text

@property
def platform_text(self):
return self.find_element(*self._platform_locator).text

class GraphTooltip(Region):
_root_locator = (By.ID, "graph-tooltip")
_series_locator = (By.ID, "tt-series")
Expand Down
45 changes: 23 additions & 22 deletions tests/selenium/test_perfherder.py
Expand Up @@ -3,39 +3,40 @@
from pages.perfherder import Perfherder


@pytest.mark.skip(reason="Needs to be updated to work with react or replaced with react-testing-library")
def test_add_test_data(base_url, selenium):
'''This tests that we can click the add test data button'''
page = Perfherder(selenium, base_url).open()
page.add_test_data()
# FIXME: Add more coverage.

# TODO update to work with TestDataModal component
# def test_load_test_data(base_url, selenium, test_perf_data):
# """
# Test that user is able to select test data from the "test chooser" and
# the correct test data is displayed
# """

# test_data = test_perf_data.first()
@pytest.mark.skip(reason="Needs to be updated to work with react or replaced with react-testing-library")
def test_load_test_data(base_url, selenium, test_perf_data):
"""
Test that user is able to select test data from the "test chooser" and
the correct test data is displayed
"""

# perf_page = Perfherder(selenium, base_url).open()
# select_test_modal = perf_page.add_test_data()
test_data = test_perf_data.first()

perf_page = Perfherder(selenium, base_url).open()
select_test_modal = perf_page.add_test_data()

# select_test_modal.select_test(test_data)
select_test_modal.select_test(test_data)

# # We expect to see a signature in our series list to the side after selecting
# # it in the chooser
# test_signatures = perf_page.series_list()
# We expect to see a signature in our series list to the side after selecting
# it in the chooser
test_signatures = perf_page.series_list()

# assert len(test_signatures) == 1
# assert test_signatures[0].test_name_text == "%s %s %s %s" % (test_data.signature.suite,
# test_data.signature.test,
# test_data.signature.extra_options.split(' ')[1],
# test_data.signature.extra_options.split(' ')[0])
assert len(test_signatures) == 1
assert test_signatures[0].test_name_text == "%s %s %s %s" % (test_data.signature.suite,
test_data.signature.test,
test_data.signature.extra_options.split(' ')[1],
test_data.signature.extra_options.split(' ')[0])

# assert test_signatures[0].project_name_text == test_data.repository.name
# assert test_signatures[0].platform_text == test_data.signature.platform.platform
# assert test_signatures[0].signature_text == test_data.signature.signature_hash
assert test_signatures[0].project_name_text == test_data.repository.name
assert test_signatures[0].platform_text == test_data.signature.platform.platform
assert test_signatures[0].signature_text == test_data.signature.signature_hash


@pytest.mark.skip(reason="Test started failing after updating mozlog, but still fails after revert.")
Expand Down
47 changes: 47 additions & 0 deletions tests/ui/mock/performance_signature_formatted.json
@@ -0,0 +1,47 @@
[
{
"id": 1647494,
"name": "a11yr opt e10s stylo",
"testName": "a11yr",
"suite": "a11yr",
"test": null,
"signature": "fcefb979eac44d057f9c05434580ce7845f4c2d6",
"hasSubtests": true,
"parentSignature": null,
"projectName": "mozilla-central",
"platform": "linux64",
"options": ["opt", "e10s", "stylo"],
"frameworkId": 1,
"lowerIsBetter": true
},
{
"id": 1660552,
"name": "about_preferences_basic opt e10s stylo",
"testName": "about_preferences_basic",
"suite": "about_preferences_basic",
"test": null,
"signature": "9db5c2909418068b3004ea3911675ee3e6e5f6da",
"hasSubtests": true,
"parentSignature": null,
"projectName": "mozilla-central",
"platform": "linux64",
"options": ["opt", "e10s", "stylo"],
"frameworkId": 1,
"lowerIsBetter": true
},
{
"id": 1648571,
"name": "basic_compositor_video opt e10s stylo",
"testName": "basic_compositor_video",
"suite": "basic_compositor_video",
"test": null,
"signature": "aaf7d0091b502d1596c9791a47cb25efeda8a5ff",
"hasSubtests": true,
"parentSignature": null,
"projectName": "mozilla-central",
"platform": "linux64",
"options": ["opt", "e10s", "stylo"],
"frameworkId": 1,
"lowerIsBetter": true
}
]
47 changes: 47 additions & 0 deletions tests/ui/mock/performance_signature_formatted2.json
@@ -0,0 +1,47 @@
[
{
"id": 1538924,
"name": "a11yr opt e10s stylo",
"testName": "a11yr",
"suite": "a11yr",
"test": null,
"signature": "0195bad4939abd449c7df2e378d2d48ddd44b850",
"hasSubtests": true,
"parentSignature": null,
"projectName": "mozilla-central",
"platform": "windows7-32",
"options": ["opt", "e10s", "stylo"],
"frameworkId": 1,
"lowerIsBetter": true
},
{
"id": 1660572,
"name": "about_preferences_basic opt e10s stylo",
"testName": "about_preferences_basic",
"suite": "about_preferences_basic",
"test": null,
"signature": "d8a13b9a6582e86e134cc8394e133d662821edab",
"hasSubtests": true,
"parentSignature": null,
"projectName": "mozilla-central",
"platform": "windows7-32",
"options": ["opt", "e10s", "stylo"],
"frameworkId": 1,
"lowerIsBetter": true
},
{
"id": 1538908,
"name": "basic_compositor_video opt e10s stylo",
"testName": "basic_compositor_video",
"suite": "basic_compositor_video",
"test": null,
"signature": "4627f0409136a69d4f10c0615b7b34a62bfbdb38",
"hasSubtests": true,
"parentSignature": null,
"projectName": "mozilla-central",
"platform": "windows7-32",
"options": ["opt", "e10s", "stylo"],
"frameworkId": 1,
"lowerIsBetter": true
}
]
60 changes: 60 additions & 0 deletions tests/ui/mock/performance_summary.json
@@ -0,0 +1,60 @@
[
{
"signature_id": 1647494,
"framework_id": 1,
"signature_hash": "fcefb979eac44d057f9c05434580ce7845f4c2d6",
"platform": "linux64",
"test": "",
"suite": "a11yr",
"lower_is_better": true,
"has_subtests": true,
"values": [],
"name": "a11yr opt e10s stylo",
"parent_signature": null,
"job_ids": [],
"repository_name": "mozilla-central",
"repository_id": 1,
"data": [
{
"job_id": 260889536,
"id": 887236036,
"value": 212.40805982905135,
"push_timestamp": "2019-08-09T21:56:59",
"push_id": 530260,
"revision": "2909b0a1eb06cc34ce0a11544e5e6826aba87c06"
},
{
"job_id": 260895760,
"id": 887279300,
"value": 211.24042970178886,
"push_timestamp": "2019-08-09T21:57:48",
"push_id": 530261,
"revision": "3afb892abb74c6d281f3e66431408cbb2e16b8c4"
},
{
"job_id": 260976940,
"id": 887616827,
"value": 211.97006831947064,
"push_timestamp": "2019-08-10T21:28:45",
"push_id": 530471,
"revision": "462d2d4ba0516adc69de20372b16931cef20de9e"
},
{
"job_id": 260977399,
"id": 887619689,
"value": 214.94212187528396,
"push_timestamp": "2019-08-10T21:31:07",
"push_id": 530472,
"revision": "c53f789ffabb03c04b1b20252aea9331301bfa02"
},
{
"job_id": 261015918,
"id": 887831038,
"value": 215.0925727552894,
"push_timestamp": "2019-08-11T09:56:40",
"push_id": 530521,
"revision": "e8fe8b0af1a7a0c64d28b4e08a9c5509d916759f"
}
]
}
]
8 changes: 3 additions & 5 deletions tests/ui/perfherder/alerts_test.jsx
Expand Up @@ -155,9 +155,9 @@ const testAlertSummaries = [
summary_id: 20239,
related_summary_id: null,
manually_created: false,
classifier: 'mozilla-ldap/sclements@mozilla.com',
classifier: 'mozilla-ldap/user@mozilla.com',
starred: false,
classifier_email: 'sclements@mozilla.com',
classifier_email: 'user@mozilla.com',
},
],
related_alerts: [],
Expand Down Expand Up @@ -428,6 +428,4 @@ test('selecting the alert summary checkbox then deselecting one alert only updat
});

// TODO should write tests for alert summary dropdown menu actions performed in StatusDropdown
// (adding notes or marking as 'fixed', etc), however there was difficulty trying to simulate
// user actions of clicking the dropdown menu and then a dropdown item, due to a JSDOM/popper.js
// issue used (reactstrap uses popper.js): https://github.com/FezVrasta/popper.js/issues/478
// (adding notes or marking as 'fixed', etc)

0 comments on commit 47b53c1

Please sign in to comment.