Skip to content

Commit dbda6e4

Browse files
authored
tests(acceptance): Add tests for resolving issues in Issues Li… (#14069)
Also refactor slightly to use page object
1 parent 0ffd317 commit dbda6e4

File tree

9 files changed

+96
-33
lines changed

9 files changed

+96
-33
lines changed

src/sentry/static/sentry/app/components/checkbox.jsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import React from 'react';
2-
import classNames from 'classnames';
32

43
class Checkbox extends React.Component {
54
static defaultProps = {
65
checked: false,
76
};
87

98
render() {
10-
const {className, ...otherProps} = this.props;
11-
const cx = classNames('chk-select', className);
12-
return <input type="checkbox" className={cx} {...otherProps} />;
9+
return <input type="checkbox" {...this.props} />;
1310
}
1411
}
1512

src/sentry/static/sentry/app/components/eventOrGroupHeader.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class EventOrGroupHeader extends React.Component {
5959
return (
6060
<Wrapper
6161
{...props}
62+
data-test-id={data.status === 'resolved' ? 'resolved-issue' : null}
6263
style={data.status === 'resolved' ? {textDecoration: 'line-through'} : null}
6364
>
6465
{!hideLevel && level && (

src/sentry/static/sentry/app/components/stream/groupCheckBox.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import PropTypes from 'prop-types';
22
import React from 'react';
3-
import createReactClass from 'create-react-class';
43
import Reflux from 'reflux';
4+
import createReactClass from 'create-react-class';
55

6-
import SelectedGroupStore from 'app/stores/selectedGroupStore';
6+
import {t} from 'app/locale';
77
import Checkbox from 'app/components/checkbox';
8+
import SelectedGroupStore from 'app/stores/selectedGroupStore';
89

910
const GroupCheckBox = createReactClass({
1011
displayName: 'GroupCheckBox',
@@ -29,7 +30,7 @@ const GroupCheckBox = createReactClass({
2930
}
3031
},
3132

32-
shouldComponentUpdate(nextProps, nextState) {
33+
shouldComponentUpdate(_nextProps, nextState) {
3334
return nextState.isSelected !== this.state.isSelected;
3435
},
3536

@@ -50,6 +51,7 @@ const GroupCheckBox = createReactClass({
5051
render() {
5152
return (
5253
<Checkbox
54+
aria-label={t('Select Issue')}
5355
value={this.props.id}
5456
checked={this.state.isSelected}
5557
onChange={this.onSelect}

tests/acceptance/page_objects/base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ def __init__(self, browser):
1111
def driver(self):
1212
return self.browser.driver
1313

14+
def wait_until_loaded(self):
15+
self.browser.wait_until_not('.loading-indicator')
16+
1417

1518
class BaseElement(object):
1619
def __init__(self, element):
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from __future__ import absolute_import
2+
3+
from .base import BasePage
4+
5+
6+
class IssueListPage(BasePage):
7+
def __init__(self, browser, client):
8+
super(IssueListPage, self).__init__(browser)
9+
self.client = client
10+
11+
def visit_issue_list(self, org):
12+
self.browser.get(u'/organizations/{}/issues/'.format(org))
13+
self.wait_until_loaded()
14+
15+
def wait_for_stream(self):
16+
self.browser.wait_until('.event-issue-header', timeout=20)
17+
18+
def select_issue(self, position):
19+
self.browser.click(u'[data-test-id="group"]:nth-child({})'.format(position))
20+
21+
def resolve_issues(self):
22+
self.browser.click('[aria-label="Resolve"]')
23+
self.browser.click('[data-test-id="confirm-modal"]')
24+
25+
def wait_for_resolved_issue(self):
26+
self.browser.wait_until('[data-test-id="resolved-issue"]')
27+
28+
def find_resolved_issues(self):
29+
return self.browser.find_elements_by_css_selector(
30+
'[data-test-id="resolved-issue"]')

tests/acceptance/test_organization_group_index.py

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from django.utils import timezone
77

88
from sentry.testutils import AcceptanceTestCase, SnubaTestCase
9+
from tests.acceptance.page_objects.issue_list import IssueListPage
10+
911
from mock import patch
1012

1113

@@ -32,25 +34,9 @@ def setUp(self):
3234
name='Sumatra',
3335
)
3436
self.login_as(self.user)
35-
self.path = u'/organizations/{}/issues/'.format(self.org.slug)
36-
37-
def test_with_onboarding(self):
38-
self.project.update(first_event=None)
39-
self.browser.get(self.path)
40-
self.wait_until_loaded()
41-
self.browser.wait_until_test_id('awaiting-events')
42-
self.browser.snapshot('organization issues onboarding')
37+
self.page = IssueListPage(self.browser, self.client)
4338

44-
def test_with_no_results(self):
45-
self.project.update(first_event=timezone.now())
46-
self.browser.get(self.path)
47-
self.wait_until_loaded()
48-
self.browser.wait_until_test_id('empty-state')
49-
self.browser.snapshot('organization issues no results')
50-
51-
@patch('django.utils.timezone.now')
52-
def test_with_results(self, mock_now):
53-
mock_now.return_value = datetime.utcnow().replace(tzinfo=pytz.utc)
39+
def create_issues(self):
5440
self.store_event(
5541
data={
5642
'event_id': 'a' * 32,
@@ -69,15 +55,60 @@ def test_with_results(self, mock_now):
6955
},
7056
project_id=self.project.id
7157
)
72-
self.browser.get(self.path)
73-
self.wait_until_loaded()
74-
self.browser.wait_until('.event-issue-header')
58+
59+
def test_with_onboarding(self):
60+
self.project.update(first_event=None)
61+
self.page.visit_issue_list(self.org.slug)
62+
self.browser.wait_until_test_id('awaiting-events')
63+
self.browser.snapshot('organization issues onboarding')
64+
65+
def test_with_no_results(self):
66+
self.project.update(first_event=timezone.now())
67+
self.page.visit_issue_list(self.org.slug)
68+
self.browser.wait_until_test_id('empty-state')
69+
self.browser.snapshot('organization issues no results')
70+
71+
@patch('django.utils.timezone.now')
72+
def test_with_results(self, mock_now):
73+
mock_now.return_value = datetime.utcnow().replace(tzinfo=pytz.utc)
74+
self.create_issues()
75+
self.page.visit_issue_list(self.org.slug)
76+
self.page.wait_for_stream()
7577
self.browser.snapshot('organization issues with issues')
7678

7779
groups = self.browser.find_elements_by_class_name('event-issue-header')
7880
assert len(groups) == 2
7981
assert 'oh snap' in groups[0].text
8082
assert 'oh no' in groups[1].text
8183

82-
def wait_until_loaded(self):
83-
self.browser.wait_until_not('.loading')
84+
@patch('django.utils.timezone.now')
85+
def test_resolve_issues(self, mock_now):
86+
mock_now.return_value = datetime.utcnow().replace(tzinfo=pytz.utc)
87+
self.create_issues()
88+
self.page.visit_issue_list(self.org.slug)
89+
self.page.wait_for_stream()
90+
91+
self.page.select_issue(1)
92+
self.page.select_issue(2)
93+
self.page.resolve_issues()
94+
self.page.wait_for_resolved_issue()
95+
resolved_groups = self.page.find_resolved_issues()
96+
97+
assert len(resolved_groups) == 2
98+
99+
@patch('django.utils.timezone.now')
100+
def test_resolve_issues_multi_projects(self, mock_now):
101+
mock_now.return_value = datetime.utcnow().replace(tzinfo=pytz.utc)
102+
self.create_issues()
103+
104+
with self.feature('organizations:global-views'):
105+
self.page.visit_issue_list(self.org.slug)
106+
self.page.wait_for_stream()
107+
108+
self.page.select_issue(1)
109+
self.page.select_issue(2)
110+
self.page.resolve_issues()
111+
self.page.wait_for_resolved_issue()
112+
resolved_groups = self.page.find_resolved_issues()
113+
114+
assert len(resolved_groups) == 2

tests/js/spec/components/__snapshots__/checkbox.spec.jsx.snap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
exports[`Checkbox renders 1`] = `
44
<input
55
checked={false}
6-
className="chk-select"
76
type="checkbox"
87
/>
98
`;

tests/js/spec/views/organizationGroupDetails/__snapshots__/groupSimilar.spec.jsx.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,6 @@ exports[`Issues Similar View renders with mocked data 1`] = `
658658
>
659659
<input
660660
checked={false}
661-
className="chk-select"
662661
id="271"
663662
onChange={[Function]}
664663
type="checkbox"
@@ -845,6 +844,7 @@ exports[`Issues Similar View renders with mocked data 1`] = `
845844
size="normal"
846845
>
847846
<Link
847+
data-test-id="resolved-issue"
848848
onlyActiveOnIndex={false}
849849
style={
850850
Object {
@@ -859,6 +859,7 @@ exports[`Issues Similar View renders with mocked data 1`] = `
859859
}
860860
>
861861
<a
862+
data-test-id="resolved-issue"
862863
onClick={[Function]}
863864
style={
864865
Object {

tests/js/spec/views/settings/organizationDeveloperSettings/__snapshots__/subscriptionBox.spec.jsx.snap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ exports[`SubscriptionBox renders resource checkbox 1`] = `
8989
>
9090
<input
9191
checked={false}
92-
className="chk-select"
9392
disabled={false}
9493
id="issue"
9594
onChange={[Function]}

0 commit comments

Comments
 (0)