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))
})
})