storybook/code/lib/store/src/inferControls.test.ts
Norbert de Langen c2bbe43d02
stage0
2022-07-21 11:24:07 +02:00

133 lines
4.0 KiB
TypeScript

import { expect } from '@jest/globals';
import { logger } from '@storybook/client-logger';
import { StoryContextForEnhancers } from '@storybook/csf';
import { argTypesEnhancers } from './inferControls';
const getStoryContext = (overrides: any = {}): StoryContextForEnhancers => ({
id: '',
title: '',
kind: '',
name: '',
story: '',
initialArgs: {},
argTypes: {
label: { control: 'text' },
labelName: { control: 'text' },
borderWidth: { control: { type: 'number', min: 0, max: 10 } },
},
...overrides,
parameters: {
__isArgsStory: true,
...overrides.parameters,
},
});
const [inferControls] = argTypesEnhancers;
describe('inferControls', () => {
describe('with custom matchers', () => {
let warnSpy: jest.SpyInstance;
beforeEach(() => {
warnSpy = jest.spyOn(logger, 'warn');
warnSpy.mockImplementation(() => {});
});
afterEach(() => {
warnSpy.mockRestore();
});
it('should return color type when using color matcher', () => {
// passing a string, should return control type color
const inferredControls = inferControls(
getStoryContext({
argTypes: {
background: {
type: {
name: 'string',
},
name: 'background',
},
},
parameters: {
controls: {
matchers: {
color: /background/,
},
},
},
})
);
expect(inferredControls.background.control.type).toEqual('color');
});
it('should return inferred type when using color matcher but arg passed is not a string', () => {
const sampleTypes = [
{
name: 'object',
value: {
rgb: {
name: 'number',
},
},
},
{ name: 'number' },
{ name: 'boolean' },
];
sampleTypes.forEach((type) => {
const inferredControls = inferControls(
getStoryContext({
argTypes: {
background: {
// passing an object which is unsupported
// should ignore color control and infer the type instead
type,
name: 'background',
},
},
parameters: {
controls: {
matchers: {
color: /background/,
},
},
},
})
);
expect(warnSpy).toHaveBeenCalled();
expect(inferredControls.background.control.type).toEqual(type.name);
});
});
});
it('should return argTypes as is when no exclude or include is passed', () => {
const controls = inferControls(getStoryContext());
expect(Object.keys(controls)).toEqual(['label', 'labelName', 'borderWidth']);
});
it('should return filtered argTypes when include is passed', () => {
const [includeString, includeArray, includeRegex] = [
inferControls(getStoryContext({ parameters: { controls: { include: 'label' } } })),
inferControls(getStoryContext({ parameters: { controls: { include: ['label'] } } })),
inferControls(getStoryContext({ parameters: { controls: { include: /label*/ } } })),
];
expect(Object.keys(includeString)).toEqual(['label', 'labelName']);
expect(Object.keys(includeArray)).toEqual(['label']);
expect(Object.keys(includeRegex)).toEqual(['label', 'labelName']);
});
it('should return filtered argTypes when exclude is passed', () => {
const [excludeString, excludeArray, excludeRegex] = [
inferControls(getStoryContext({ parameters: { controls: { exclude: 'label' } } })),
inferControls(getStoryContext({ parameters: { controls: { exclude: ['label'] } } })),
inferControls(getStoryContext({ parameters: { controls: { exclude: /label*/ } } })),
];
expect(Object.keys(excludeString)).toEqual(['borderWidth']);
expect(Object.keys(excludeArray)).toEqual(['labelName', 'borderWidth']);
expect(Object.keys(excludeRegex)).toEqual(['borderWidth']);
});
});