diff --git a/jest.config.js b/jest.config.js index 58605dd824..2a7d9159c8 100644 --- a/jest.config.js +++ b/jest.config.js @@ -41,6 +41,6 @@ module.exports = { // Maybe point to a fixture? '@generated/.*': '/jest/emptyModule.js', // TODO maybe use "projects" + multiple configs if we plan to add tests to another theme? - '@theme/(.*)': '@docusaurus/theme-classic/lib-next/theme/$1', + '@theme/(.*)': '@docusaurus/theme-classic/src/theme/$1', }, }; diff --git a/packages/docusaurus-theme-classic/src/theme/Tabs/__tests__/index.test.tsx b/packages/docusaurus-theme-classic/src/theme/Tabs/__tests__/index.test.tsx index 48cede2080..6bcf0e7b21 100644 --- a/packages/docusaurus-theme-classic/src/theme/Tabs/__tests__/index.test.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Tabs/__tests__/index.test.tsx @@ -9,6 +9,8 @@ import React from 'react'; import renderer from 'react-test-renderer'; import Tabs from '../index'; import TabItem from '../../TabItem'; +import UserPreferencesProvider from '@theme/UserPreferencesProvider'; +import {ScrollControllerProvider} from '@docusaurus/theme-common'; describe('Tabs', () => { test('Should reject bad Tabs child', () => { @@ -54,53 +56,74 @@ describe('Tabs', () => { test('Should accept valid Tabs config', () => { expect(() => { renderer.create( - <> - - Tab 1 - Tab 2 - - - Tab 1 - - Tab 2 - - - - - Tab 1 - - - Tab 2 - - - - Tab 1 - Tab 2 - - - Tab 1 - Tab 2 - - - - Tab 1 - - - Tab 2 - - - , + + + + Tab 1 + Tab 2 + + + Tab 1 + + Tab 2 + + + + + Tab 1 + + + Tab 2 + + + + Tab 1 + Tab 2 + + + Tab 1 + Tab 2 + + + + Tab 1 + + + Tab 2 + + + + , ); - }).toMatchInlineSnapshot(`[Function]`); // This is just a check that the function returns. We don't care about the actual DOM. + }).not.toThrow(); // TODO Better Jest infrastructure to mock the Layout + }); + // https://github.com/facebook/docusaurus/issues/5729 + test('Should accept dynamic Tabs with number values', () => { + expect(() => { + const tabs = ['Apple', 'Banana', 'Carrot']; + renderer.create( + + + ({label: t, value: idx}))} + defaultValue={0}> + {tabs.map((t, idx) => ( + {t} + ))} + + + , + ); + }).not.toThrow(); }); }); diff --git a/packages/docusaurus-theme-classic/src/theme/Tabs/index.tsx b/packages/docusaurus-theme-classic/src/theme/Tabs/index.tsx index 91871dae86..343874ac09 100644 --- a/packages/docusaurus-theme-classic/src/theme/Tabs/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Tabs/index.tsx @@ -25,7 +25,7 @@ import styles from './styles.module.css'; // A very rough duck type, but good enough to guard against mistakes while // allowing customization function isTabItem(comp: ReactElement): comp is ReactElement { - return typeof comp.props.value === 'string'; + return typeof comp.props.value !== 'undefined'; } function TabsComponent(props: Props): JSX.Element { @@ -51,10 +51,7 @@ function TabsComponent(props: Props): JSX.Element { ); }); const values = - valuesProp ?? - children.map(({props: {value, label}}) => { - return {value, label}; - }); + valuesProp ?? children.map(({props: {value, label}}) => ({value, label})); const dup = duplicates(values, (a, b) => a.value === b.value); if (dup.length > 0) { throw new Error(