import * as React from 'react'; import Testkit from './testkit'; import Option from '../AutoExample/components/option'; const testkit = new Testkit() as any; // TODO: all of this should be a browser tests (puppeteer, cypress etc) and not enzyme. // it's too much mocking and simulation, not a real deal // TODO: yes, some test are skipped because the whole StoryPage is undergoing grand refactora describe('StoryPage', () => { describe('readme and description', () => { it('should render readme', () => { const readme = 'hello readme'; testkit.when.created({ metadata: { readme } }); expect(testkit.get.readme()).toMatch(readme); }); it('should render description from source', () => { const description = 'hello source'; testkit.when.created({ metadata: { description } }); expect(testkit.get.readme()).toMatch(description); }); it('should prioritize readme', () => { const readme = 'hello readme'; const description = 'hello source'; testkit.when.created({ metadata: { description, readme } }); expect(testkit.get.readme()).toMatch(readme); }); it('should render displayName only once', () => { const displayName = 'batman'; const readme = '# ``'; const description = '# ``'; testkit.when.created({ metadata: { displayName, readme, description } }); expect(testkit.get.readme()).toEqual('# ``'); }); }); describe('given `exampleImport`', () => { it('should render it', () => { const exampleImport = 'hello there'; testkit.when.created({ exampleImport }); expect(testkit.get.import()).toMatch(exampleImport); }); }); describe('given config with `importFormat`', () => { it('should format and render it in story', () => { const config = { importFormat: "hey %moduleName, what's your name, %moduleName?", moduleName: 'dork', }; testkit.when.created({ config }); expect(testkit.get.import()).toMatch("hey dork, what's your name, dork?"); }); it('should allow any other config name to be used', () => { const config = { importFormat: 'good %daytime, %person, where is my %thing at?', daytime: 'evening', person: 'Homer', thing: 'money', }; testkit.when.created({ config }); expect(testkit.get.import()).toMatch( 'good evening, Homer, where is my money at?', ); }); it('should replace %componentName with metadata.displayName', () => { const props = { config: { importFormat: "import {%componentName} from '%moduleName/%componentName';", moduleName: 'wix-ui-core', }, metadata: { displayName: 'BesterestestComponent', props: {}, }, }; testkit.when.created(props); expect(testkit.get.import()).toMatch( "import {BesterestestComponent} from 'wix-ui-core/BesterestestComponent';", ); }); }); describe.skip('given explicit displayName', () => { it('should show it instead of using one from `metadata`', () => { const props = { metadata: { props: {}, }, config: {}, displayName: 'well hello there', }; testkit.when.created(props); expect(testkit.get.readme()).toMatch(//); expect(testkit.get.import()).toMatch(/well hello there/); }); }); describe.skip('given both displayName and description', () => { it('should concatenate the displayName as title to the description', () => { const props = { metadata: { props: {}, description: 'This component is lit AF', }, config: {}, displayName: 'well hello there', }; testkit.when.created(props); expect(testkit.get.readme()).toBe( '# ``\nThis component is lit AF', ); }); }); describe('`hiddenProps`', () => { it('should filter props from interactive list', () => { testkit.when.created({ metadata: { props: { hiddenProp: { type: { name: 'string' } }, visibleProp: { type: { name: 'string' } }, }, }, hiddenProps: ['hiddenProp'], }); expect(testkit.get.autoExample().find(Option).length).toEqual(1); }); }); describe('code example', () => { it('should show displayName without HOC', () => { const component = ({ children }) =>
{children}
; // eslint-disable-line react/prop-types component.displayName = 'someHOC(componentName)'; const IShouldBeTheName = () => null; const props = { component, componentProps: { children: (
), }, exampleProps: { children: [], }, }; testkit.when.created(props); expect(testkit.get.codeBlock().prop('source')).toEqual(`\`\`\`js
\`\`\``); }); it('should not be rendered given `codeExample: false`', () => { testkit.when.created({ component: () => '', codeExample: false, }); expect(testkit.get.codeBlock().length).toEqual(0); }); }); describe('API tab', () => { it('Should render API markdown', () => { testkit.when.created({ activeTabId: 'API', component: () => '', codeExample: false, metadata: { props: {}, readmeApi: 'data for markdown', displayName: 'Component', }, }); testkit.openTab('API'); expect(testkit.get.api.markdown().length).toBe(1); }); }); describe('Testkit tab', () => { it('Should render both testkit markdown and auto generated testkit docs', () => { testkit.when.created({ activeTabId: 'Testkit', component: () => '', codeExample: false, metadata: { props: {}, readmeTestkit: 'data for markdown', displayName: 'Component', drivers: [ { file: 'component.driver.js', descriptor: [ { name: 'click', args: [], type: 'function', }, ], }, { file: 'component.pupeteer.driver.js', descriptor: [ { name: 'element', args: [], type: 'function', }, ], }, ], }, }); testkit.openTab('Testkit'); expect(testkit.get.testkit.markdown().length).toBe(1); expect(testkit.get.testkit.autoGenerated().length).toBe(1); }); }); });