import { parseJsx } from '../__tests__/utils' import { printAst, transformSource, type TransformSourceArgs } from '../utils' import { migrateStringProp } from './migrateStringProp' const transformTopping = (oldValue: string): string => { switch (oldValue) { case 'butter': return 'jam' default: return 'blueberries' } } const testMigrateStringProp = (sourceFile: TransformSourceArgs['sourceFile']): string => { const tagsMap = new Map([ [ 'Pancakes', { importModuleName: '@kaizen/components', tagName: 'Pancakes', originalName: 'Pancakes', }, ], ]) return transformSource({ sourceFile, transformers: [migrateStringProp('toppingOld', 'toppingNew', transformTopping)(tagsMap)], }) } describe('migrateStringProp()', () => { describe('replaces old prop name and value with new prop name and value', () => { it('applies to self closing elements', () => { const inputAst = parseJsx( 'export const TestComponent = () => ', ) const outputAst = parseJsx('export const TestComponent = () => ') expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) it('applies to JSX opening elements', () => { const inputAst = parseJsx( 'export const TestComponent = () => Hello', ) const outputAst = parseJsx( 'export const TestComponent = () => Hello', ) expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) }) it('handles multiple attributes and replaces only the provided prop', () => { const inputAst = parseJsx( 'export const TestComponent = () => ', ) const outputAst = parseJsx( 'export const TestComponent = () => ', ) expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) it('transforms multiple components', () => { const inputAst = parseJsx(` export const TestComponent = () => (
) `) const outputAst = parseJsx(` export const TestComponent = () => (
) `) expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) it('transforms arbitrary braces', () => { const inputAst = parseJsx(` export const TestComponent = () => (
) `) const outputAst = parseJsx(` export const TestComponent = () => (
) `) expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) it('does not add new prop if old prop is not defined', () => { const inputAst = parseJsx('export const TestComponent = () => ') const outputAst = parseJsx('export const TestComponent = () => ') expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) it('does not add new prop if new prop already exists', () => { const inputAst = parseJsx('export const TestComponent = () => ') const outputAst = parseJsx('export const TestComponent = () => ') expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) it('does not modify old prop using variables', () => { const inputAst = parseJsx('export const TestComponent = () => ') const outputAst = parseJsx('export const TestComponent = () => ') expect(testMigrateStringProp(inputAst)).toEqual(printAst(outputAst)) }) })