diff --git a/src/sentry/static/sentry/app/routes.jsx b/src/sentry/static/sentry/app/routes.jsx index b597078f80b3be..5619cfa5eeddc8 100644 --- a/src/sentry/static/sentry/app/routes.jsx +++ b/src/sentry/static/sentry/app/routes.jsx @@ -60,6 +60,7 @@ import OrganizationTeams from './views/organizationTeams'; import ProjectAlertRules from './views/projectAlertRules'; import ProjectAlertRuleDetails from './views/projectAlertRuleDetails'; import ProjectAlertSettings from './views/projectAlertSettings'; +import ProjectEnvironments from './views/projectEnvironments'; import ProjectTags from './views/projectTags'; import ProjectChooser from './views/projectChooser'; import ProjectCspSettings from './views/projectCspSettings'; @@ -242,6 +243,12 @@ const projectSettingsRoutes = [ path="alerts/" component={errorHandler(ProjectAlertSettings)} />, + , , {t("You don't have any environments yet.")}; + }, + renderEnvironmentList(envs) { + return envs.map(env => {env.displayName}); + }, + render() { + let {environments} = this.state; + let {orgId, projectId} = this.props.params; + + return ( + + + + {t('Environments')} + + + } + /> + + {t('Environments')} + + {environments.length + ? this.renderEnvironmentList(environments) + : this.renderEmpty()} + + + + ); + }, +}); + +export default ProjectEnvironments; diff --git a/src/sentry/static/sentry/app/views/projectSettings/index.jsx b/src/sentry/static/sentry/app/views/projectSettings/index.jsx index 18c13d2ce553c8..2f41d59fac44bd 100644 --- a/src/sentry/static/sentry/app/views/projectSettings/index.jsx +++ b/src/sentry/static/sentry/app/views/projectSettings/index.jsx @@ -104,6 +104,9 @@ const ProjectSettings = createReactClass({ > {t('Alerts')} + + {t('Environments')} + {t('Tags')} {t('Issue Tracking')} diff --git a/tests/js/spec/views/__snapshots__/projectEnvironments.spec.jsx.snap b/tests/js/spec/views/__snapshots__/projectEnvironments.spec.jsx.snap new file mode 100644 index 00000000000000..884771a139a11e --- /dev/null +++ b/tests/js/spec/views/__snapshots__/projectEnvironments.spec.jsx.snap @@ -0,0 +1,483 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ProjectEnvironments render() renders empty message 1`] = ` +.glamor-4 { + font-size: 14px; + box-shadow: inset 0 -1px 0; + margin: -20px 0 30px; +} + +.glamor-2 { + box-sizing: border-box; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.glamor-0 { + font-size: 20px; + font-weight: bold; + margin: 20px 0; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} + +.glamor-17 { + background: #fff; + border: 1px solid; + margin-bottom: 30px; + position: relative; +} + +.glamor-13 { + border-bottom: 1px solid; + border-radius: 0 0; + text-transform: uppercase; + font-size: 13px; + line-height: 1; + padding: 15px 20px; +} + +.glamor-9 { + font-size: inherit; + text-transform: inherit; + margin: 0; +} + +.glamor-7 { + font-size: 12px; + font-weight: 600; + text-transform: uppercase; + margin-bottom: 20px; + font-size: inherit; + text-transform: inherit; + margin: 0; +} + +.glamor-15 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + padding: 18px; + font-size: 1.5em; + opacity: 0.4; + font-weight: bold; +} + + + + + + Environments + + + } + title="Manage Environments" + > + + + Environments + + + } + > + + + + + + + Manage Environments + + + + + + + + + + + + Environments + + + + + + + + + + + + + + + + + <_default + className="glamor-9 glamor-6" + > + + Environments + + + + + + + + + + + + You don't have any environments yet. + + + + + + + + +`; + +exports[`ProjectEnvironments render() renders environment list 1`] = ` +.glamor-4 { + font-size: 14px; + box-shadow: inset 0 -1px 0; + margin: -20px 0 30px; +} + +.glamor-2 { + box-sizing: border-box; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.glamor-0 { + font-size: 20px; + font-weight: bold; + margin: 20px 0; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} + +.glamor-19 { + background: #fff; + border: 1px solid; + margin-bottom: 30px; + position: relative; +} + +.glamor-13 { + border-bottom: 1px solid; + border-radius: 0 0; + text-transform: uppercase; + font-size: 13px; + line-height: 1; + padding: 15px 20px; +} + +.glamor-9 { + font-size: inherit; + text-transform: inherit; + margin: 0; +} + +.glamor-7 { + font-size: 12px; + font-weight: 600; + text-transform: uppercase; + margin-bottom: 20px; + font-size: inherit; + text-transform: inherit; + margin: 0; +} + +.glamor-15 { + box-sizing: border-box; + padding: 16px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + border-bottom: 1px solid; +} + +.glamor-15:last-child { + border: 0; +} + + + + + + Environments + + + } + title="Manage Environments" + > + + + Environments + + + } + > + + + + + + + Manage Environments + + + + + + + + + + + + Environments + + + + + + + + + + + + + + + + + <_default + className="glamor-9 glamor-6" + > + + Environments + + + + + + + + + + + + + + Production + + + + + + + + + + +`; diff --git a/tests/js/spec/views/projectEnvironments.spec.jsx b/tests/js/spec/views/projectEnvironments.spec.jsx new file mode 100644 index 00000000000000..870e5b20ad51c4 --- /dev/null +++ b/tests/js/spec/views/projectEnvironments.spec.jsx @@ -0,0 +1,49 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {mount} from 'enzyme'; + +import ProjectEnvironments from 'app/views/projectEnvironments'; + +import EnvironmentStore from 'app/stores/environmentStore'; + +describe('ProjectEnvironments', function() { + let org; + let project; + + beforeEach(function() { + org = TestStubs.Organization(); + project = TestStubs.Project(); + }); + + describe('render()', function() { + it('renders empty message', function() { + let wrapper = mount( + , + { + context: { + router: TestStubs.router(), + }, + childContextTypes: { + router: PropTypes.object, + }, + } + ); + + expect(wrapper).toMatchSnapshot(); + }); + + it('renders environment list', function() { + EnvironmentStore.loadInitialData([{id: 1, name: 'production'}]); + let wrapper = mount( + , + { + context: {router: TestStubs.router()}, + childContextTypes: { + router: PropTypes.object, + }, + } + ); + expect(wrapper).toMatchSnapshot(); + }); + }); +});