import ts from 'typescript' import { parseJsx } from '../__tests__/utils' import { updateJsxElementWithNewProps } from './updateJsxElementWithNewProps' const printNode = (node: ts.Node, source: ts.SourceFile): string => { const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }) return printer.printNode(ts.EmitHint.Unspecified, node, source) } describe('updateJsxElementWithNewProps()', () => { it('adds a prop to a self closing element', () => { const source = parseJsx('') const jsxElement = source.statements[0] as ts.ExpressionStatement const newAttributes = [ ts.factory.createJsxAttribute( ts.factory.createIdentifier('topping'), ts.factory.createStringLiteral('butter'), ), ] const updatedNode = updateJsxElementWithNewProps(jsxElement.expression, newAttributes) const result = printNode(updatedNode, source) expect(result).toBe('') }) it('removes a prop to a self closing element', () => { const source = parseJsx('') const jsxElement = source.statements[0] as ts.ExpressionStatement const updatedNode = updateJsxElementWithNewProps(jsxElement.expression, []) const result = printNode(updatedNode, source) expect(result).toBe('') }) it('adds a prop to a JSX opening element', () => { const source = parseJsx('Hello') const jsxElement = source.statements[0] as ts.ExpressionStatement const node = (jsxElement.expression as ts.JsxElement).openingElement const newAttributes = [ ts.factory.createJsxAttribute( ts.factory.createIdentifier('topping'), ts.factory.createStringLiteral('butter'), ), ] const updatedNode = updateJsxElementWithNewProps(node, newAttributes) const result = printNode(updatedNode, source) expect(result).toBe('') }) it('removes a prop to a JSX opening element', () => { const source = parseJsx('Hello') const jsxElement = source.statements[0] as ts.ExpressionStatement const node = (jsxElement.expression as ts.JsxElement).openingElement const updatedNode = updateJsxElementWithNewProps(node, []) const result = printNode(updatedNode, source) expect(result).toBe('') }) })