diff --git a/packages/core-components/src/layout/Sidebar/MobileSidebar.test.tsx b/packages/core-components/src/layout/Sidebar/MobileSidebar.test.tsx
new file mode 100644
index 0000000000..6f6463a3dc
--- /dev/null
+++ b/packages/core-components/src/layout/Sidebar/MobileSidebar.test.tsx
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2020 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { mockBreakpoint, renderInTestApp } from '@backstage/test-utils';
+import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
+import HomeIcon from '@material-ui/icons/Home';
+import LayersIcon from '@material-ui/icons/Layers';
+import LibraryBooks from '@material-ui/icons/LibraryBooks';
+import { fireEvent } from '@testing-library/react';
+import React from 'react';
+import { Sidebar } from './Bar';
+import { SidebarItem } from './Items';
+import { MobileSidebar } from './MobileSidebar';
+import { SidebarGroup } from './SidebarGroup';
+
+const MobileSidebarWithGroups = () => (
+
+ Header
+ } label="Menu">
+
+
+
+
+ Content
+ More Content
+ } label="Create" to="#" />
+
+
+);
+
+const MobileSidebarWithoutGroups = () => (
+
+
+
+
+
+);
+
+describe('', () => {
+ beforeEach(() => {
+ mockBreakpoint({ matches: true });
+ });
+
+ it('should render MobileSidebar on smaller screens', async () => {
+ const { getByTestId } = await renderInTestApp(
+
+
+ ,
+ );
+ expect(getByTestId('mobile-sidebar-root')).toBeVisible();
+ });
+
+ it('should render only SidebarGroups inside MobileSidebar', async () => {
+ const { findAllByRole, getByTestId, findByText } = await renderInTestApp(
+ ,
+ );
+ expect(getByTestId('mobile-sidebar-root').children.length).toBe(2);
+ expect((await findAllByRole('button')).length).toBe(2);
+ expect(await findByText('Menu')).toBeValid();
+ expect(await findByText('Create')).toBeValid();
+ });
+
+ it('should render default MobileSidebar when there are no SidebarGroups', async () => {
+ const { findAllByRole, getByTestId } = await renderInTestApp(
+ ,
+ );
+ expect(getByTestId('mobile-sidebar-root').children.length).toBe(1);
+ const defaultSidebarGroup = await findAllByRole('button');
+ expect(defaultSidebarGroup.length).toBe(1);
+ });
+
+ it('should render OverlayMenu displaying SidebarItems', async () => {
+ const { findByText, getByRole } = await renderInTestApp(
+ ,
+ );
+ const menuButton = await findByText('Menu');
+ fireEvent.click(menuButton);
+ expect(getByRole('heading', { name: 'Menu' })).toBeVisible();
+ expect(getByRole('link', { name: 'Home' })).toBeVisible();
+ expect(getByRole('link', { name: 'Explore' })).toBeVisible();
+ expect(getByRole('link', { name: 'Docs' })).toBeVisible();
+ });
+});
diff --git a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
index 93fc4d58c5..881a933efd 100644
--- a/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
+++ b/packages/core-components/src/layout/Sidebar/MobileSidebar.tsx
@@ -43,6 +43,7 @@ const useStyles = makeStyles(theme => ({
left: 0,
right: 0,
zIndex: 1000,
+ // SidebarDivider color
borderTop: '1px solid #383838',
},
@@ -165,7 +166,10 @@ export const MobileSidebar = ({ children }: React.PropsWithChildren<{}>) => {
onClose={() => setSelectedMenuItemIndex(-1)}
/>
)}
-
+
{sidebarGroups}
diff --git a/packages/core-components/src/layout/Sidebar/SidebarGroup.test.tsx b/packages/core-components/src/layout/Sidebar/SidebarGroup.test.tsx
new file mode 100644
index 0000000000..664495067c
--- /dev/null
+++ b/packages/core-components/src/layout/Sidebar/SidebarGroup.test.tsx
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2020 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { mockBreakpoint, renderInTestApp } from '@backstage/test-utils';
+import HomeIcon from '@material-ui/icons/Home';
+import LayersIcon from '@material-ui/icons/Layers';
+import LibraryBooks from '@material-ui/icons/LibraryBooks';
+import { fireEvent } from '@testing-library/react';
+import React from 'react';
+import { SidebarItem } from './Items';
+import { MobileSidebarContext } from './MobileSidebar';
+import { SidebarGroup } from './SidebarGroup';
+
+const SidebarGroupWithItems = () => (
+ } label="Menu">
+
+
+
+
+);
+
+describe('', () => {
+ it('should render Items in BottomNavigationAciton on small screens', async () => {
+ mockBreakpoint({ matches: true });
+ const { findByRole, container } = await renderInTestApp(
+ ,
+ );
+ expect(container.childNodes.length).toBe(1);
+ expect(await findByRole('button')).toBeVisible();
+ });
+
+ it('should render Items without wrapper on bigger screens', async () => {
+ mockBreakpoint({ matches: false });
+ const { container } = await renderInTestApp();
+ expect(container.childNodes.length).toBe(3);
+ });
+
+ it('should trigger update of MobileSidebarContext', async () => {
+ mockBreakpoint({ matches: true });
+ const value = {
+ selectedMenuItemIndex: -1,
+ setSelectedMenuItemIndex: jest.fn(),
+ };
+ const { findByRole } = await renderInTestApp(
+
+
+ ,
+ );
+ const group = await findByRole('button');
+ fireEvent.click(group);
+ expect(value.setSelectedMenuItemIndex).toHaveBeenCalled();
+ });
+});