aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/apps/issues
diff options
context:
space:
mode:
Diffstat (limited to 'server/sonar-web/src/main/js/apps/issues')
-rw-r--r--server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx24
-rw-r--r--server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx10
-rw-r--r--server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap9
3 files changed, 39 insertions, 4 deletions
diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx
index 6ad0277f98f..0fd57eb1956 100644
--- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx
+++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx
@@ -18,9 +18,12 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Alert } from 'sonar-ui-common/components/ui/Alert';
import DeferredSpinner from 'sonar-ui-common/components/ui/DeferredSpinner';
+import { translate } from 'sonar-ui-common/helpers/l10n';
import { getDuplications } from '../../../api/components';
import { getIssueFlowSnippets } from '../../../api/issues';
+import throwGlobalError from '../../../app/utils/throwGlobalError';
import DuplicationPopup from '../../../components/SourceViewer/components/DuplicationPopup';
import {
filterDuplicationBlocksByLine,
@@ -59,6 +62,7 @@ interface State {
issuePopup?: { issue: string; name: string };
linePopup?: T.LinePopup & { component: string };
loading: boolean;
+ notAccessible: boolean;
}
export default class CrossComponentSourceViewerWrapper extends React.PureComponent<Props, State> {
@@ -66,7 +70,8 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone
state: State = {
components: {},
duplicationsByLine: {},
- loading: true
+ loading: true,
+ notAccessible: false
};
componentDidMount() {
@@ -122,9 +127,12 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone
}
}
},
- () => {
+ (response: Response) => {
+ if (response.status !== 403) {
+ throwGlobalError(response);
+ }
if (this.mounted) {
- this.setState({ loading: false });
+ this.setState({ loading: false, notAccessible: response.status === 403 });
}
}
);
@@ -197,7 +205,7 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone
};
render() {
- const { loading } = this.state;
+ const { loading, notAccessible } = this.state;
if (loading) {
return (
@@ -207,6 +215,14 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone
);
}
+ if (notAccessible) {
+ return (
+ <Alert className="spacer-top" variant="warning">
+ {translate('code_viewer.no_source_code_displayed_due_to_security')}
+ </Alert>
+ );
+ }
+
const { components, duplications, duplicationsByLine, linePopup } = this.state;
const issuesByComponent = issuesByComponentAndLine(this.props.issues);
const locationsByComponent = groupLocationsByComponent(this.props.locations, components);
diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx
index 2dcfa8f3ee9..318e6646d6b 100644
--- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx
+++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx
@@ -66,6 +66,16 @@ it('Should fetch data', async () => {
expect(getIssueFlowSnippets).toBeCalledWith('foo');
});
+it('Should handle no access rights', async () => {
+ (getIssueFlowSnippets as jest.Mock).mockRejectedValueOnce({ status: 403 });
+
+ const wrapper = shallowRender();
+ await waitAndUpdate(wrapper);
+
+ expect(wrapper.state().notAccessible).toBe(true);
+ expect(wrapper).toMatchSnapshot();
+});
+
it('should handle issue popup', () => {
const wrapper = shallowRender();
// open
diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap
index 5f6913c5ace..c6362cb8a71 100644
--- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap
+++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap
@@ -1,5 +1,14 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`Should handle no access rights 1`] = `
+<Alert
+ className="spacer-top"
+ variant="warning"
+>
+ code_viewer.no_source_code_displayed_due_to_security
+</Alert>
+`;
+
exports[`should handle duplication popup 1`] = `
<Context.Consumer>
[Function]