]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-14181 Fix SSF-136
authorWouter Admiraal <wouter.admiraal@sonarsource.com>
Fri, 27 Nov 2020 10:48:41 +0000 (11:48 +0100)
committersonartech <sonartech@sonarsource.com>
Wed, 2 Dec 2020 20:06:26 +0000 (20:06 +0000)
server/sonar-web/src/main/js/apps/overview/meta/MetaLink.tsx
server/sonar-web/src/main/js/apps/overview/meta/__tests__/MetaLink-test.tsx
server/sonar-web/src/main/js/apps/overview/meta/__tests__/__snapshots__/MetaLink-test.tsx.snap

index aff3dd000552b148f392b5d475e8a7c89d0c82f2..fedfca02bd4e56132a5f72be7cdae4714a51021a 100644 (file)
@@ -51,12 +51,13 @@ export default class MetaLink extends React.PureComponent<Props, State> {
   render() {
     const { iconOnly, link } = this.props;
     const linkTitle = getLinkName(link);
+    const isValid = isValidUri(link.url);
     return (
       <li>
         <a
           className="link-with-icon"
-          href={link.url}
-          onClick={!isValidUri(link.url) ? this.handleClick : undefined}
+          href={isValid ? link.url : undefined}
+          onClick={isValid ? undefined : this.handleClick}
           rel="nofollow noreferrer noopener"
           target="_blank"
           title={linkTitle}>
index e7b0ad368d041294fbb3cf3bfa52350ae6d0fa7b..71ae08d586bd4c744216cc1cc90a4597c9cda659 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import * as React from 'react';
 import { shallow } from 'enzyme';
-import MetaLink from '../MetaLink';
+import * as React from 'react';
+import { ClearButton } from '../../../../components/ui/buttons';
 import { click } from '../../../../helpers/testUtils';
+import MetaLink from '../MetaLink';
 
-it('should match snapshot', () => {
-  const link = {
-    id: '1',
-    name: 'Foo',
-    url: 'http://example.com',
-    type: 'foo'
-  };
-
-  expect(shallow(<MetaLink link={link} />)).toMatchSnapshot();
-  expect(shallow(<MetaLink iconOnly={true} link={link} />)).toMatchSnapshot();
-});
-
-it('should render dangerous links as plaintext', () => {
-  const link = {
-    id: '1',
-    name: 'Dangerous',
-    url: 'javascript:alert("hi")',
-    type: 'dangerous'
-  };
+const DANGEROUS_LINK = {
+  id: '1',
+  name: 'Dangerous',
+  url: 'javascript:alert("hi")',
+  type: 'dangerous'
+};
 
-  expect(shallow(<MetaLink link={link} />)).toMatchSnapshot();
+it('should match snapshot', () => {
+  expect(shallowRender()).toMatchSnapshot('default');
+  expect(shallowRender({ iconOnly: true })).toMatchSnapshot('icon only');
+  const wrapper = shallowRender({ link: DANGEROUS_LINK });
+  expect(wrapper).toMatchSnapshot('dangerous link, collapsed');
+  wrapper.setState({ expanded: true });
+  expect(wrapper).toMatchSnapshot('dangerous link, expanded');
 });
 
-it('should expand and collapse dangerous link', () => {
-  const link = {
-    id: '1',
-    name: 'Dangerous',
-    url: 'javascript:alert("hi")',
-    type: 'dangerous'
-  };
-
-  const wrapper = shallow(<MetaLink link={link} />);
-  expect(wrapper).toMatchSnapshot();
+it('should expand and collapse dangerous links', () => {
+  const wrapper = shallowRender({ link: DANGEROUS_LINK });
+  expect(wrapper.state().expanded).toBe(false);
 
   // expand
   click(wrapper.find('a'));
-  expect(wrapper).toMatchSnapshot();
+  expect(wrapper.state().expanded).toBe(true);
 
   // collapse
   click(wrapper.find('a'));
-  expect(wrapper).toMatchSnapshot();
+  expect(wrapper.state().expanded).toBe(false);
 
   // collapse with button
-  click(wrapper.find('a'));
-  expect(wrapper.state('expanded')).toBe(true);
-  click(wrapper.find('ClearButton'));
-  expect(wrapper.state('expanded')).toBe(false);
+  wrapper.setState({ expanded: true });
+  click(wrapper.find(ClearButton));
+  expect(wrapper.state().expanded).toBe(false);
 });
+
+function shallowRender(props: Partial<MetaLink['props']> = {}) {
+  return shallow<MetaLink>(
+    <MetaLink
+      link={{
+        id: '1',
+        name: 'Foo',
+        url: 'http://example.com',
+        type: 'foo'
+      }}
+      {...props}
+    />
+  );
+}
index 773b22685c1e003111c96ff816b08e97a4eb9081..31c9deade9bc64758af1598a90935531876c125d 100644 (file)
@@ -1,10 +1,9 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`should expand and collapse dangerous link 1`] = `
+exports[`should match snapshot: dangerous link, collapsed 1`] = `
 <li>
   <a
     className="link-with-icon"
-    href="javascript:alert(\\"hi\\")"
     onClick={[Function]}
     rel="nofollow noreferrer noopener"
     target="_blank"
@@ -19,11 +18,10 @@ exports[`should expand and collapse dangerous link 1`] = `
 </li>
 `;
 
-exports[`should expand and collapse dangerous link 2`] = `
+exports[`should match snapshot: dangerous link, expanded 1`] = `
 <li>
   <a
     className="link-with-icon"
-    href="javascript:alert(\\"hi\\")"
     onClick={[Function]}
     rel="nofollow noreferrer noopener"
     target="_blank"
@@ -53,26 +51,7 @@ exports[`should expand and collapse dangerous link 2`] = `
 </li>
 `;
 
-exports[`should expand and collapse dangerous link 3`] = `
-<li>
-  <a
-    className="link-with-icon"
-    href="javascript:alert(\\"hi\\")"
-    onClick={[Function]}
-    rel="nofollow noreferrer noopener"
-    target="_blank"
-    title="Dangerous"
-  >
-    <ProjectLinkIcon
-      className="little-spacer-right"
-      type="dangerous"
-    />
-    Dangerous
-  </a>
-</li>
-`;
-
-exports[`should match snapshot 1`] = `
+exports[`should match snapshot: default 1`] = `
 <li>
   <a
     className="link-with-icon"
@@ -90,7 +69,7 @@ exports[`should match snapshot 1`] = `
 </li>
 `;
 
-exports[`should match snapshot 2`] = `
+exports[`should match snapshot: icon only 1`] = `
 <li>
   <a
     className="link-with-icon"
@@ -106,22 +85,3 @@ exports[`should match snapshot 2`] = `
   </a>
 </li>
 `;
-
-exports[`should render dangerous links as plaintext 1`] = `
-<li>
-  <a
-    className="link-with-icon"
-    href="javascript:alert(\\"hi\\")"
-    onClick={[Function]}
-    rel="nofollow noreferrer noopener"
-    target="_blank"
-    title="Dangerous"
-  >
-    <ProjectLinkIcon
-      className="little-spacer-right"
-      type="dangerous"
-    />
-    Dangerous
-  </a>
-</li>
-`;