From daa05592306d83f4f5ffd46291a4174570564621 Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Tue, 2 Jul 2019 14:51:31 -0700 Subject: [PATCH 1/9] adds test for creating new integration --- .../test_organization_developer_settings.py | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tests/acceptance/test_organization_developer_settings.py diff --git a/tests/acceptance/test_organization_developer_settings.py b/tests/acceptance/test_organization_developer_settings.py new file mode 100644 index 000000000000..59539a0af1fb --- /dev/null +++ b/tests/acceptance/test_organization_developer_settings.py @@ -0,0 +1,58 @@ +from __future__ import absolute_import + +from sentry.testutils import AcceptanceTestCase + + +class OrganizationIntegrationAcceptanceTestCase(AcceptanceTestCase): + def setUp(self): + super(OrganizationIntegrationAcceptanceTestCase, self).setUp() + self.user = self.create_user('foo@example.com') + self.org = self.create_organization( + name='Rowdy Tiger', + owner=None, + ) + self.team = self.create_team(organization=self.org, name='Mariachi Band') + self.project = self.create_project( + organization=self.org, + teams=[self.team], + name='Bengal', + ) + self.create_member( + user=self.user, + organization=self.org, + role='owner', + teams=[self.team], + ) + self.login_as(self.user) + + def load_page(self, url): + self.browser.get(url) + self.browser.wait_until_not('.loading-indicator') + + +class OrganizationIntegrationSettingsTest(OrganizationIntegrationAcceptanceTestCase): + """ + As a develop, I can create an integration, install it, and uninstall it + """ + + def setUp(self): + super(OrganizationIntegrationSettingsTest, self).setUp() + self.org_developer_settings_path = u'/settings/{}/developer-settings/'.format( + self.organization.slug) + + def test_create_new_integration(self): + with self.feature('organizations:sentry-apps'): + + self.load_page(self.org_developer_settings_path) + + self.browser.click('[aria-label="Create New Integration"]') + + self.browser.element('input[name="name"]').send_keys('Tesla') + self.browser.element('input[name="author"]').send_keys('Elon Musk') + self.browser.element('input[name="webhookUrl"]').send_keys('https://tesla.com/webhook') + + self.browser.click('[aria-label="Save Changes"]') + + self.browser.wait_until('.ref-success') + + assert self.browser.find_element_by_link_text('Tesla') From a81b718cca8f5b343c7e2917d930f2ae6e349d7d Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Wed, 3 Jul 2019 13:32:46 -0700 Subject: [PATCH 2/9] adding acceptance tests for installing sentry apps --- .../sentryApplicationRow.jsx | 2 +- .../test_organization_developer_settings.py | 38 ++---- .../test_organization_integration.py | 27 ---- .../test_organization_sentry_app.py | 115 ++++++++++++++++++ 4 files changed, 124 insertions(+), 58 deletions(-) create mode 100644 tests/acceptance/test_organization_sentry_app.py diff --git a/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx b/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx index 249b5afbe8ca..b5c22cc54c06 100644 --- a/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx +++ b/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx @@ -107,7 +107,7 @@ export default class SentryApplicationRow extends React.PureComponent { const isInstalled = this.isInstalled; return ( - + diff --git a/tests/acceptance/test_organization_developer_settings.py b/tests/acceptance/test_organization_developer_settings.py index 59539a0af1fb..10f871277177 100644 --- a/tests/acceptance/test_organization_developer_settings.py +++ b/tests/acceptance/test_organization_developer_settings.py @@ -3,43 +3,21 @@ from sentry.testutils import AcceptanceTestCase -class OrganizationIntegrationAcceptanceTestCase(AcceptanceTestCase): - def setUp(self): - super(OrganizationIntegrationAcceptanceTestCase, self).setUp() - self.user = self.create_user('foo@example.com') - self.org = self.create_organization( - name='Rowdy Tiger', - owner=None, - ) - self.team = self.create_team(organization=self.org, name='Mariachi Band') - self.project = self.create_project( - organization=self.org, - teams=[self.team], - name='Bengal', - ) - self.create_member( - user=self.user, - organization=self.org, - role='owner', - teams=[self.team], - ) - self.login_as(self.user) - - def load_page(self, url): - self.browser.get(url) - self.browser.wait_until_not('.loading-indicator') - - -class OrganizationIntegrationSettingsTest(OrganizationIntegrationAcceptanceTestCase): +class OrganizationIntegrationAcceptanceTest(AcceptanceTestCase): """ - As a develop, I can create an integration, install it, and uninstall it + As a developer, I can create an integration, install it, and uninstall it """ def setUp(self): - super(OrganizationIntegrationSettingsTest, self).setUp() + super(OrganizationIntegrationAcceptanceTest, self).setUp() + self.login_as(self.user) self.org_developer_settings_path = u'/settings/{}/developer-settings/'.format( self.organization.slug) + def load_page(self, url): + self.browser.get(url) + self.browser.wait_until_not('.loading-indicator') + def test_create_new_integration(self): with self.feature('organizations:sentry-apps'): diff --git a/tests/acceptance/test_organization_integration.py b/tests/acceptance/test_organization_integration.py index 3e5a248369db..123d9e6d1d47 100644 --- a/tests/acceptance/test_organization_integration.py +++ b/tests/acceptance/test_organization_integration.py @@ -12,34 +12,7 @@ class OrganizationIntegrationAcceptanceTestCase(AcceptanceTestCase): def setUp(self): super(OrganizationIntegrationAcceptanceTestCase, self).setUp() - self.user = self.create_user('foo@example.com') - self.org = self.create_organization( - name='Rowdy Tiger', - owner=None, - ) - self.team = self.create_team(organization=self.org, name='Mariachi Band') - self.project = self.create_project( - organization=self.org, - teams=[self.team], - name='Bengal', - ) - self.create_member( - user=self.user, - organization=self.org, - role='owner', - teams=[self.team], - ) - self.model = Integration.objects.create( - provider='example', - external_id='example', - name='Test Integration', - metadata={ - 'domain_name': 'example-test.com', - }, - ) - self.org_integration = self.model.add_organization(self.org, self.user) self.login_as(self.user) - self.integration_settings_path = 'sentry-api-0-organization-integrations' def load_page(self, url): diff --git a/tests/acceptance/test_organization_sentry_app.py b/tests/acceptance/test_organization_sentry_app.py new file mode 100644 index 000000000000..6028709f1ee3 --- /dev/null +++ b/tests/acceptance/test_organization_sentry_app.py @@ -0,0 +1,115 @@ +from __future__ import absolute_import + +from exam import mock + + +from sentry.testutils import AcceptanceTestCase +from tests.acceptance.page_objects.organization_integration_settings import ( + OrganizationIntegrationSettingsPage +) + + +class OrganizationSentryAppAcceptanceTestCase(AcceptanceTestCase): + """ + As a user(type?), I can setup, configure, and remove a sentry app. + """ + + def setUp(self): + super(OrganizationSentryAppAcceptanceTestCase, self).setUp() + self.user = self.create_user('foo@example.com') + self.org = self.create_organization( + name='Tesla', + owner=None, + ) + self.team = self.create_team(organization=self.org, name='Tesla Motors') + self.project = self.create_project( + organization=self.org, + teams=[self.team], + name='Model S', + ) + self.create_member( + user=self.user, + organization=self.org, + role='owner', + teams=[self.team], + ) + + self.sentry_app = self.create_sentry_app( + name='Tesla App', + published=True, + organization=self.org + ) + + self.login_as(self.user) + + self.org_integration_settings_path = u'/settings/{}/integrations/'.format( + self.org.slug) + + self.provider = mock.Mock() + self.provider.key = 'tesla-app' + self.provider.name = 'Tesla App' + + def load_page(self, url): + self.browser.get(url) + self.browser.wait_until_not('.loading-indicator') + + def test_install_sentry_app(self): + self.load_page(self.org_integration_settings_path) + + org_settings_page = OrganizationIntegrationSettingsPage( + browser=self.browser + ) + + provider_element = org_settings_page.get_provider(self.provider) + + # assert installation rather than upgrade button + assert provider_element.install_button.label == 'Install' + assert provider_element.install_button.icon_href == '#icon-circle-add' + + provider_element.install_button.click() + self.browser.wait_until(org_settings_page.modal_selector) + + self.browser.click('.modal-dialog [aria-label="Install"]') + + self.browser.wait_until('.ref-success') + + # provider_element might be rerendered + provider_element = org_settings_page.get_provider(self.provider) + + # assert we see the uninstall option + assert provider_element.install_button.label == 'Uninstall' + assert provider_element.install_button.icon_href == '#icon-trash' + + def test_uninstall_sentry_app(self): + # add the installation + self.installation = self.create_sentry_app_installation( + slug=self.sentry_app.slug, + organization=self.org, + user=self.user, + ) + + self.load_page(self.org_integration_settings_path) + + org_settings_page = OrganizationIntegrationSettingsPage( + browser=self.browser + ) + + provider_element = org_settings_page.get_provider(self.provider) + + # assert we see the uninstall option + assert provider_element.install_button.label == 'Uninstall' + assert provider_element.install_button.icon_href == '#icon-trash' + + provider_element.install_button.click() + self.browser.wait_until(org_settings_page.modal_selector) + + self.browser.click('.modal-dialog [aria-label="Confirm"]') + + self.browser.wait_until('.ref-success') + + # provider_element might be rerendered + provider_element = org_settings_page.get_provider(self.provider) + + # assert we see the install option now + assert provider_element.install_button.label == 'Install' + assert provider_element.install_button.icon_href == '#icon-circle-add' From 8f0e31ea4a9f88b950761aa1b54f155c45b651af Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Wed, 3 Jul 2019 13:56:42 -0700 Subject: [PATCH 3/9] update snapshot --- .../__snapshots__/sentryAppInstallations.spec.jsx.snap | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/js/spec/views/settings/organizationIntegrations/__snapshots__/sentryAppInstallations.spec.jsx.snap b/tests/js/spec/views/settings/organizationIntegrations/__snapshots__/sentryAppInstallations.spec.jsx.snap index 82f9c67f7546..6c9cf9a10784 100644 --- a/tests/js/spec/views/settings/organizationIntegrations/__snapshots__/sentryAppInstallations.spec.jsx.snap +++ b/tests/js/spec/views/settings/organizationIntegrations/__snapshots__/sentryAppInstallations.spec.jsx.snap @@ -111,14 +111,17 @@ exports[`Sentry App Installations when Apps exist displays all Apps owned by the showPublishStatus={false} >
From 1f6177ad55946f263942d329ddfbab87d732dc1e Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Wed, 3 Jul 2019 14:27:56 -0700 Subject: [PATCH 4/9] remove space --- .../organizationDeveloperSettings/sentryApplicationRow.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx b/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx index b5c22cc54c06..fa316923f8a3 100644 --- a/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx +++ b/src/sentry/static/sentry/app/views/settings/organizationDeveloperSettings/sentryApplicationRow.jsx @@ -107,7 +107,7 @@ export default class SentryApplicationRow extends React.PureComponent { const isInstalled = this.isInstalled; return ( - + From 42761ebe559e063d11d0a8f12c7f8ce08ae9ff4f Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Fri, 5 Jul 2019 09:29:12 -0700 Subject: [PATCH 5/9] change URL in test --- tests/acceptance/test_organization_developer_settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/test_organization_developer_settings.py b/tests/acceptance/test_organization_developer_settings.py index 10f871277177..d46ab678d835 100644 --- a/tests/acceptance/test_organization_developer_settings.py +++ b/tests/acceptance/test_organization_developer_settings.py @@ -27,7 +27,8 @@ def test_create_new_integration(self): self.browser.element('input[name="name"]').send_keys('Tesla') self.browser.element('input[name="author"]').send_keys('Elon Musk') - self.browser.element('input[name="webhookUrl"]').send_keys('https://tesla.com/webhook') + self.browser.element('input[name="webhookUrl"]').send_keys( + 'https://example.com/webhook') self.browser.click('[aria-label="Save Changes"]') From 5162cb6ba39765c3860b34196355b4d58e2c0e56 Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Fri, 5 Jul 2019 11:46:48 -0700 Subject: [PATCH 6/9] update PR from comments --- .vscode/settings.json | 4 ++-- tests/acceptance/test_organization_developer_settings.py | 4 ++-- tests/acceptance/test_organization_sentry_app.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index cc49fae44879..d905297e1eb4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -61,7 +61,7 @@ "python.pythonPath": "${workspaceFolder}/.venv/bin/python", // test discovery is sluggish and the UI around running // tests is often in your way and misclicked - "python.testing.pyTestEnabled": false, + "python.testing.pytestEnabled": false, "python.testing.unittestEnabled": false, "python.testing.nosetestsEnabled": false, "editor.tabSize": 4, @@ -69,5 +69,5 @@ "python.linting.enabled": true, "python.linting.flake8Path": "${workspaceFolder}/.venv/bin/flake8", "python.linting.pep8Path": "${workspaceFolder}/.venv/bin/pep8", - "python.testing.pyTestPath": "${workspaceFolder}/.venv/bin/pytest" + "python.testing.pytestPath": "${workspaceFolder}/.venv/bin/pytest" } diff --git a/tests/acceptance/test_organization_developer_settings.py b/tests/acceptance/test_organization_developer_settings.py index d46ab678d835..5096ac9de46e 100644 --- a/tests/acceptance/test_organization_developer_settings.py +++ b/tests/acceptance/test_organization_developer_settings.py @@ -3,13 +3,13 @@ from sentry.testutils import AcceptanceTestCase -class OrganizationIntegrationAcceptanceTest(AcceptanceTestCase): +class OrganizationDeveloperSettingsAcceptanceTest(AcceptanceTestCase): """ As a developer, I can create an integration, install it, and uninstall it """ def setUp(self): - super(OrganizationIntegrationAcceptanceTest, self).setUp() + super(OrganizationDeveloperSettingsAcceptanceTest, self).setUp() self.login_as(self.user) self.org_developer_settings_path = u'/settings/{}/developer-settings/'.format( self.organization.slug) diff --git a/tests/acceptance/test_organization_sentry_app.py b/tests/acceptance/test_organization_sentry_app.py index 6028709f1ee3..e367305abf50 100644 --- a/tests/acceptance/test_organization_sentry_app.py +++ b/tests/acceptance/test_organization_sentry_app.py @@ -11,7 +11,7 @@ class OrganizationSentryAppAcceptanceTestCase(AcceptanceTestCase): """ - As a user(type?), I can setup, configure, and remove a sentry app. + As a user, I can install and uninstall a Sentry App """ def setUp(self): From 0ff9c7117a04829e699e2440a24f1d9e0fccf7b7 Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Mon, 8 Jul 2019 10:32:22 -0700 Subject: [PATCH 7/9] handles new popup for sentry app install --- tests/acceptance/test_organization_sentry_app.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/acceptance/test_organization_sentry_app.py b/tests/acceptance/test_organization_sentry_app.py index e367305abf50..c930db206aa5 100644 --- a/tests/acceptance/test_organization_sentry_app.py +++ b/tests/acceptance/test_organization_sentry_app.py @@ -69,6 +69,9 @@ def test_install_sentry_app(self): provider_element.install_button.click() self.browser.wait_until(org_settings_page.modal_selector) + # need to press install twice + self.browser.click('.modal-dialog [aria-label="Install"]') + self.browser.wait_until('.modal-dialog') self.browser.click('.modal-dialog [aria-label="Install"]') self.browser.wait_until('.ref-success') From f53ef51b03bb37280deec26ab1370be90201195f Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Mon, 8 Jul 2019 11:42:48 -0700 Subject: [PATCH 8/9] handles new popup for sentry app install --- tests/acceptance/test_organization_sentry_app.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/acceptance/test_organization_sentry_app.py b/tests/acceptance/test_organization_sentry_app.py index c930db206aa5..fec06709ecff 100644 --- a/tests/acceptance/test_organization_sentry_app.py +++ b/tests/acceptance/test_organization_sentry_app.py @@ -67,12 +67,13 @@ def test_install_sentry_app(self): assert provider_element.install_button.icon_href == '#icon-circle-add' provider_element.install_button.click() - self.browser.wait_until(org_settings_page.modal_selector) # need to press install twice - self.browser.click('.modal-dialog [aria-label="Install"]') - self.browser.wait_until('.modal-dialog') - self.browser.click('.modal-dialog [aria-label="Install"]') + install_selecter = '.modal-dialog [aria-label="Install"]' + self.browser.wait_until(install_selecter) + self.browser.click(install_selecter) + self.browser.wait_until(install_selecter) + self.browser.click(install_selecter) self.browser.wait_until('.ref-success') From a88c61e357f69192d8821b3a08a8ee299b7d5409 Mon Sep 17 00:00:00 2001 From: Stephen Cefali Date: Mon, 8 Jul 2019 12:02:03 -0700 Subject: [PATCH 9/9] revert vscode changes --- .vscode/settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d905297e1eb4..cc49fae44879 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -61,7 +61,7 @@ "python.pythonPath": "${workspaceFolder}/.venv/bin/python", // test discovery is sluggish and the UI around running // tests is often in your way and misclicked - "python.testing.pytestEnabled": false, + "python.testing.pyTestEnabled": false, "python.testing.unittestEnabled": false, "python.testing.nosetestsEnabled": false, "editor.tabSize": 4, @@ -69,5 +69,5 @@ "python.linting.enabled": true, "python.linting.flake8Path": "${workspaceFolder}/.venv/bin/flake8", "python.linting.pep8Path": "${workspaceFolder}/.venv/bin/pep8", - "python.testing.pytestPath": "${workspaceFolder}/.venv/bin/pytest" + "python.testing.pyTestPath": "${workspaceFolder}/.venv/bin/pytest" }