Skip to content

Commit 1d9e2c5

Browse files
authored
Merge pull request #458 from facultyai/dropdownmenuitem-external-link
Fix bug in DropdownMenuItem
2 parents 0d4c25c + f459b24 commit 1d9e2c5

File tree

8 files changed

+207
-1
lines changed

8 files changed

+207
-1
lines changed

src/components/__tests__/Badge.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,34 @@ describe('Badge', () => {
5959
expect(mockSetProps.mock.calls).toHaveLength(1);
6060
expect(mockSetProps.mock.calls[0][0].n_clicks).toBe(1);
6161
});
62+
63+
test('relative links are internal by default', () => {
64+
const badge = render(
65+
<Badge href="/relative">Clickable</Badge>
66+
);
67+
68+
const mockEventListener = jest.fn();
69+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
70+
window.scrollTo = jest.fn();
71+
72+
expect(mockEventListener.mock.calls).toHaveLength(0);
73+
userEvent.click(badge.getByText('Clickable'));
74+
expect(mockEventListener.mock.calls).toHaveLength(1);
75+
});
76+
77+
test('relative links are external with external_link=true', () => {
78+
const badge = render(
79+
<Badge href="/relative" external_link>
80+
Clickable
81+
</Badge>
82+
);
83+
84+
const mockEventListener = jest.fn();
85+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
86+
window.scrollTo = jest.fn();
87+
88+
expect(mockEventListener.mock.calls).toHaveLength(0);
89+
userEvent.click(badge.getByText('Clickable'));
90+
expect(mockEventListener.mock.calls).toHaveLength(0);
91+
});
6292
});

src/components/__tests__/Button.test.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,32 @@ describe('Button', () => {
113113

114114
expect(mockSetProps.mock.calls).toHaveLength(0);
115115
});
116+
117+
test('relative links are internal by default', () => {
118+
const button = render(<Button href="/relative">Clickable</Button>);
119+
120+
const mockEventListener = jest.fn();
121+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
122+
window.scrollTo = jest.fn();
123+
124+
expect(mockEventListener.mock.calls).toHaveLength(0);
125+
userEvent.click(button.getByText('Clickable'));
126+
expect(mockEventListener.mock.calls).toHaveLength(1);
127+
});
128+
129+
test('relative links are external with external_link=true', () => {
130+
const button = render(
131+
<Button href="/relative" external_link>
132+
Clickable
133+
</Button>
134+
);
135+
136+
const mockEventListener = jest.fn();
137+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
138+
window.scrollTo = jest.fn();
139+
140+
expect(mockEventListener.mock.calls).toHaveLength(0);
141+
userEvent.click(button.getByText('Clickable'));
142+
expect(mockEventListener.mock.calls).toHaveLength(0);
143+
});
116144
});

src/components/card/__tests__/CardLink.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,34 @@ describe('CardLink', () => {
4444

4545
expect(mockSetProps.mock.calls).toHaveLength(0);
4646
});
47+
48+
test('relative links are internal by default', () => {
49+
const cardLink = render(
50+
<CardLink href="/relative">Clickable</CardLink>
51+
);
52+
53+
const mockEventListener = jest.fn();
54+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
55+
window.scrollTo = jest.fn();
56+
57+
expect(mockEventListener.mock.calls).toHaveLength(0);
58+
userEvent.click(cardLink.getByText('Clickable'));
59+
expect(mockEventListener.mock.calls).toHaveLength(1);
60+
});
61+
62+
test('relative links are external with external_link=true', () => {
63+
const cardLink = render(
64+
<CardLink href="/relative" external_link>
65+
Clickable
66+
</CardLink>
67+
);
68+
69+
const mockEventListener = jest.fn();
70+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
71+
window.scrollTo = jest.fn();
72+
73+
expect(mockEventListener.mock.calls).toHaveLength(0);
74+
userEvent.click(cardLink.getByText('Clickable'));
75+
expect(mockEventListener.mock.calls).toHaveLength(0);
76+
});
4777
});

src/components/dropdownmenu/DropdownMenuItem.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ const DropdownMenuItem = props => {
1313
let {
1414
children,
1515
href,
16-
external_link,
1716
loading_state,
1817
target,
1918
disabled,

src/components/dropdownmenu/__tests__/DropdownMenuItem.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,36 @@ describe('DropdownMenuItem', () => {
2828
).not.toBe(null);
2929
});
3030

31+
test('relative links are internal by default', () => {
32+
const dropdownMenuItem = render(
33+
<DropdownMenuItem href="/relative">Clickable</DropdownMenuItem>
34+
);
35+
36+
const mockEventListener = jest.fn();
37+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
38+
window.scrollTo = jest.fn();
39+
40+
expect(mockEventListener.mock.calls).toHaveLength(0);
41+
userEvent.click(dropdownMenuItem.getByText('Clickable'));
42+
expect(mockEventListener.mock.calls).toHaveLength(1);
43+
});
44+
45+
test('relative links are external with external_link=true', () => {
46+
const dropdownMenuItem = render(
47+
<DropdownMenuItem href="/relative" external_link>
48+
Clickable
49+
</DropdownMenuItem>
50+
);
51+
52+
const mockEventListener = jest.fn();
53+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
54+
window.scrollTo = jest.fn();
55+
56+
expect(mockEventListener.mock.calls).toHaveLength(0);
57+
userEvent.click(dropdownMenuItem.getByText('Clickable'));
58+
expect(mockEventListener.mock.calls).toHaveLength(0);
59+
});
60+
3161
test('renders its content', () => {
3262
const dropdownMenuItem = render(
3363
<DropdownMenuItem>Some dropdown item content</DropdownMenuItem>

src/components/listgroup/__tests__/ListGroupItem.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,34 @@ describe('ListGroupItem', () => {
7878

7979
expect(mockSetProps.mock.calls).toHaveLength(0);
8080
});
81+
82+
test('relative links are internal by default', () => {
83+
const listGroupItem = render(
84+
<ListGroupItem href="/relative">Clickable</ListGroupItem>
85+
);
86+
87+
const mockEventListener = jest.fn();
88+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
89+
window.scrollTo = jest.fn();
90+
91+
expect(mockEventListener.mock.calls).toHaveLength(0);
92+
userEvent.click(listGroupItem.getByText('Clickable'));
93+
expect(mockEventListener.mock.calls).toHaveLength(1);
94+
});
95+
96+
test('relative links are external with external_link=true', () => {
97+
const listGroupItem = render(
98+
<ListGroupItem href="/relative" external_link>
99+
Clickable
100+
</ListGroupItem>
101+
);
102+
103+
const mockEventListener = jest.fn();
104+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
105+
window.scrollTo = jest.fn();
106+
107+
expect(mockEventListener.mock.calls).toHaveLength(0);
108+
userEvent.click(listGroupItem.getByText('Clickable'));
109+
expect(mockEventListener.mock.calls).toHaveLength(0);
110+
});
81111
});

src/components/nav/__tests__/NavLink.test.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,32 @@ describe('NavLink', () => {
6161

6262
expect(mockSetProps.mock.calls).toHaveLength(0);
6363
});
64+
65+
test('relative links are internal by default', () => {
66+
const navLink = render(<NavLink href="/relative">Clickable</NavLink>);
67+
68+
const mockEventListener = jest.fn();
69+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
70+
window.scrollTo = jest.fn();
71+
72+
expect(mockEventListener.mock.calls).toHaveLength(0);
73+
userEvent.click(navLink.getByText('Clickable'));
74+
expect(mockEventListener.mock.calls).toHaveLength(1);
75+
});
76+
77+
test('relative links are external with external_link=true', () => {
78+
const navLink = render(
79+
<NavLink href="/relative" external_link>
80+
Clickable
81+
</NavLink>
82+
);
83+
84+
const mockEventListener = jest.fn();
85+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
86+
window.scrollTo = jest.fn();
87+
88+
expect(mockEventListener.mock.calls).toHaveLength(0);
89+
userEvent.click(navLink.getByText('Clickable'));
90+
expect(mockEventListener.mock.calls).toHaveLength(0);
91+
});
6492
});

src/components/nav/__tests__/NavbarBrand.test.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import {render} from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
34
import NavbarBrand from '../NavbarBrand';
45

56
describe('NavbarBrand', () => {
@@ -28,4 +29,34 @@ describe('NavbarBrand', () => {
2829
} = render(<NavbarBrand href={href} />);
2930
expect(navbarBrand.getAttribute('href')).toBe(href);
3031
});
32+
33+
test('relative links are internal by default', () => {
34+
const navbarBrand = render(
35+
<NavbarBrand href="/relative">Clickable</NavbarBrand>
36+
);
37+
38+
const mockEventListener = jest.fn();
39+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
40+
window.scrollTo = jest.fn();
41+
42+
expect(mockEventListener.mock.calls).toHaveLength(0);
43+
userEvent.click(navbarBrand.getByText('Clickable'));
44+
expect(mockEventListener.mock.calls).toHaveLength(1);
45+
});
46+
47+
test('relative links are external with external_link=true', () => {
48+
const navbarBrand = render(
49+
<NavbarBrand href="/relative" external_link>
50+
Clickable
51+
</NavbarBrand>
52+
);
53+
54+
const mockEventListener = jest.fn();
55+
window.addEventListener('_dashprivate_pushstate', mockEventListener);
56+
window.scrollTo = jest.fn();
57+
58+
expect(mockEventListener.mock.calls).toHaveLength(0);
59+
userEvent.click(navbarBrand.getByText('Clickable'));
60+
expect(mockEventListener.mock.calls).toHaveLength(0);
61+
});
3162
});

0 commit comments

Comments
 (0)