From 929c3d426c51982272dabf5b3e6472b4a155eb60 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Thu, 21 Sep 2017 10:37:47 +0200 Subject: [PATCH] SONAR-7024 show project specific dispatcher labels --- .../notifications/NotificationsList.js | 14 ++++- .../notifications/ProjectNotifications.js | 1 + .../__tests__/NotificationsList-test.js | 31 +++++++++++ .../NotificationsList-test.js.snap | 55 +++++++++++++++++++ .../ProjectNotifications-test.js.snap | 1 + .../resources/org/sonar/l10n/core.properties | 3 +- 6 files changed, 102 insertions(+), 3 deletions(-) diff --git a/server/sonar-web/src/main/js/apps/account/notifications/NotificationsList.js b/server/sonar-web/src/main/js/apps/account/notifications/NotificationsList.js index 2c90aee9251..af7a219e350 100644 --- a/server/sonar-web/src/main/js/apps/account/notifications/NotificationsList.js +++ b/server/sonar-web/src/main/js/apps/account/notifications/NotificationsList.js @@ -19,7 +19,7 @@ */ import React from 'react'; import Checkbox from '../../../components/controls/Checkbox'; -import { translate } from '../../../helpers/l10n'; +import { translate, hasMessage } from '../../../helpers/l10n'; /*:: import type { Notification, NotificationsState, @@ -33,6 +33,7 @@ export default class NotificationsList extends React.PureComponent { onRemove: (n: Notification) => void, channels: ChannelsState, checkboxId: (string, string) => string, + project?: boolean, types: TypesState, notifications: NotificationsState }; @@ -52,6 +53,15 @@ export default class NotificationsList extends React.PureComponent { } } + getDispatcherLabel(dispatcher /*: string */) { + const globalMessageKey = ['notification.dispatcher', dispatcher]; + const projectMessageKey = [...globalMessageKey, 'project']; + const shouldUseProjectMessage = this.props.project && hasMessage(...projectMessageKey); + return shouldUseProjectMessage + ? translate(...projectMessageKey) + : translate(...globalMessageKey); + } + render() { const { channels, checkboxId, types } = this.props; @@ -59,7 +69,7 @@ export default class NotificationsList extends React.PureComponent { {types.map(type => ( - {translate('notification.dispatcher', type)} + {this.getDispatcherLabel(type)} {channels.map(channel => ( `project-notification-${project.key}-${d}-${c}`} onAdd={n => this.handleAddNotification(n)} onRemove={n => this.handleRemoveNotification(n)} + project={true} /> ); diff --git a/server/sonar-web/src/main/js/apps/account/notifications/__tests__/NotificationsList-test.js b/server/sonar-web/src/main/js/apps/account/notifications/__tests__/NotificationsList-test.js index 6ad339b88eb..19ad4fa3f53 100644 --- a/server/sonar-web/src/main/js/apps/account/notifications/__tests__/NotificationsList-test.js +++ b/server/sonar-web/src/main/js/apps/account/notifications/__tests__/NotificationsList-test.js @@ -17,10 +17,18 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +/* eslint-disable import/first */ +jest.mock('../../../../helpers/l10n', () => { + const l10n = require.requireActual('../../../../helpers/l10n'); + l10n.hasMessage = jest.fn(); + return l10n; +}); + import React from 'react'; import { shallow } from 'enzyme'; import NotificationsList from '../NotificationsList'; import Checkbox from '../../../../components/controls/Checkbox'; +import { hasMessage } from '../../../../helpers/l10n'; const channels = ['channel1', 'channel2']; const types = ['type1', 'type2']; @@ -31,6 +39,10 @@ const notifications = [ ]; const checkboxId = (t, c) => `checkbox-io-${t}-${c}`; +beforeEach(() => { + hasMessage.mockImplementation(() => false).mockClear(); +}); + it('should match snapshot', () => { expect( shallow( @@ -46,6 +58,25 @@ it('should match snapshot', () => { ).toMatchSnapshot(); }); +it('renders project-specific labels', () => { + hasMessage.mockImplementation(() => true); + expect( + shallow( + + ) + ).toMatchSnapshot(); + expect(hasMessage).toBeCalledWith('notification.dispatcher', 'type1', 'project'); + expect(hasMessage).toBeCalledWith('notification.dispatcher', 'type2', 'project'); +}); + it('should call `onAdd` and `onRemove`', () => { const onAdd = jest.fn(); const onRemove = jest.fn(); diff --git a/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/NotificationsList-test.js.snap b/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/NotificationsList-test.js.snap index 8035cb42916..3ca417ef0a0 100644 --- a/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/NotificationsList-test.js.snap +++ b/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/NotificationsList-test.js.snap @@ -1,5 +1,60 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`renders project-specific labels 1`] = ` + + + + notification.dispatcher.type1.project + + + + + + + + + + + notification.dispatcher.type2.project + + + + + + + + + +`; + exports[`should match snapshot 1`] = ` diff --git a/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/ProjectNotifications-test.js.snap b/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/ProjectNotifications-test.js.snap index d7a5a2f3e76..3a5f1bb6f42 100644 --- a/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/ProjectNotifications-test.js.snap +++ b/server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/ProjectNotifications-test.js.snap @@ -74,6 +74,7 @@ exports[`should match snapshot 1`] = ` } onAdd={[Function]} onRemove={[Function]} + project={true} types={ Array [ "type1", diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index 469ebaa4fe6..6ed28db4edb 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -1862,7 +1862,8 @@ notification.dispatcher.NewIssues=New issues notification.dispatcher.NewAlerts=New quality gate status notification.dispatcher.NewFalsePositiveIssue=Issues resolved as false positive or won't fix notification.dispatcher.SQ-MyNewIssues=My new issues -notification.dispatcher.CeReportTaskFailure=Report processing failure +notification.dispatcher.CeReportTaskFailure=Background tasks in failure on my administered projects +notification.dispatcher.CeReportTaskFailure.project=Background tasks in failure #------------------------------------------------------------------------------ -- 2.39.5