import ts from 'typescript' import { parseJsx } from '../__tests__/utils' import { createJsxElementWithChildren, printAst } from '../utils' import { transformV1ButtonAttributes } from './transformV1ButtonAttributes' export const mockedTransformer = (kaioComponentName: string) => (context: ts.TransformationContext) => (rootNode: ts.Node): ts.Node => { const visit = (node: ts.Node): ts.Node => { if (ts.isJsxSelfClosingElement(node)) { const { targetComponentName, newAttributes, childrenValue } = transformV1ButtonAttributes( node, kaioComponentName, ) return createJsxElementWithChildren(targetComponentName, newAttributes, childrenValue) } return ts.visitEachChild(node, visit, context) } return ts.visitNode(rootNode, visit) } const transformInput = ( sourceFile: ts.SourceFile, kaioComponentName: string = 'Button', ): string => { const result = ts.transform(sourceFile, [mockedTransformer(kaioComponentName)]) const transformedSource = result.transformed[0] as ts.SourceFile return printAst(transformedSource) } describe('transformV1ButtonAttributes()', () => { it('changes label to children', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('replaces IconButton with Button and changes label to children and adds hasHiddenLabel', () => { const inputAst = parseJsx('') const outputAst = parseJsx( '', ) expect(transformInput(inputAst, 'IconButton')).toEqual(printAst(outputAst)) }) it('replaces V1 Buttons with LinkButton if href exists', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) describe('transform existing props', () => { it('changes onClick to onPress', () => { const inputAst = parseJsx('', ) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes reversed to isReversed', () => { const inputAst = parseJsx(` <> `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes classNameOverride to className', () => { const inputAst = parseJsx('', ) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes data-automation-id to data-testid', () => { const inputAst = parseJsx('', ) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes disabled to isDisabled', () => { const inputAst = parseJsx(` <> `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes newTabAndIUnderstandTheAccessibilityImplications to target="_blank" and rel="noopener noreferrer"', () => { const inputAst = parseJsx( '') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes default (undefined) for IconButton to variant tertiary', () => { const inputAst = parseJsx('') const outputAst = parseJsx( '', ) expect(transformInput(inputAst, 'IconButton')).toEqual(printAst(outputAst)) }) it('changes primary to variant primary', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes secondary to variant tertiary', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('removes destructive', () => { const inputAst = parseJsx(` <> `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) }) describe('transform size', () => { it('changes default (undefined) to large', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes small to medium', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('changes regular to large', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('does not change a non-string value', () => { const inputAst = parseJsx('') expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) }) }) })