// TODO: better tests. these are way too generic. import { parse } from 'svelte/compiler' import { collectFormatCalls, collectMessageDefinitions, collectMessages, extractMessages, } from '../../src/cli/extract' describe('collecting format calls', () => { test('returns nothing if there are no script tag', () => { const ast = parse(`
Hey
`) const calls = collectFormatCalls(ast) expect(calls).toHaveLength(0) }) test('returns nothing if there are no imports', () => { const ast = parse(``) const calls = collectFormatCalls(ast) expect(calls).toHaveLength(0) }) test('returns nothing if there are no format imports', () => { const ast = parse( `` ) const calls = collectFormatCalls(ast) expect(calls).toHaveLength(0) }) test('collects all format calls in the instance script', () => { const ast = parse(``) const calls = collectFormatCalls(ast) expect(calls).toHaveLength(2) expect(calls[0]).toMatchObject({ type: 'CallExpression' }) expect(calls[1]).toMatchObject({ type: 'CallExpression' }) }) test('collects all format calls with renamed imports', () => { const ast = parse(``) const calls = collectFormatCalls(ast) expect(calls).toHaveLength(3) expect(calls[0]).toMatchObject({ type: 'CallExpression' }) expect(calls[1]).toMatchObject({ type: 'CallExpression' }) expect(calls[2]).toMatchObject({ type: 'CallExpression' }) }) }) describe('collecting message definitions', () => { test('returns nothing if there are no imports from the library', () => { const ast = parse( `` ) expect(collectMessageDefinitions(ast)).toHaveLength(0) }) test('gets all message definition objects', () => { const ast = parse(``) const definitions = collectMessageDefinitions(ast) expect(definitions).toHaveLength(4) expect(definitions[0]).toMatchObject({ type: 'ObjectExpression' }) expect(definitions[1]).toMatchObject({ type: 'ObjectExpression' }) expect(definitions[2]).toMatchObject({ type: 'ObjectExpression' }) expect(definitions[3]).toMatchObject({ type: 'ObjectExpression' }) }) }) describe('collecting messages', () => { test('collects all messages in both instance and html ASTs', () => { const markup = `
{$_('msg_1')}
{$_({id: 'msg_2'})}
{$_('msg_3', { default: 'Message'})}
` const messages = collectMessages(markup) expect(messages).toHaveLength(7) expect(messages).toEqual( expect.arrayContaining([ expect.objectContaining({ meta: { id: 'foo' } }), expect.objectContaining({ meta: { id: 'msg_1' } }), expect.objectContaining({ meta: { id: 'msg_2' } }), expect.objectContaining({ meta: { id: 'msg_3', default: 'Message' } }), expect.objectContaining({ meta: { id: 'page.title' } }), expect.objectContaining({ meta: { id: 'disabled', default: 'Disabled' }, }), expect.objectContaining({ meta: { id: 'enabled', default: 'Enabled' }, }), ]) ) }) }) describe('messages extraction', () => { test('returns a object built based on all found message paths', () => { const markup = `

{$_.title('title')}

{$_({ id: 'subtitle'})}

` const dict = extractMessages(markup) expect(dict).toMatchObject({ title: '', subtitle: '' }) }) test('creates deep nested properties', () => { const markup = `

{$_.title('home.page.title')}

{$_({ id: 'home.page.subtitle'})}

` const dict = extractMessages(markup) expect(dict).toMatchObject({ home: { page: { title: '', subtitle: '' } }, list: ['', '', ''], }) }) test('creates a shallow dictionary', () => { const markup = `

{$_.title('home.page.title')}

{$_({ id: 'home.page.subtitle'})}

` const dict = extractMessages(markup, { shallow: true }) expect(dict).toMatchObject({ 'home.page.title': '', 'home.page.subtitle': '', 'list.0': '', 'list.1': '', 'list.2': '', }) }) test('allow to pass a initial dictionary and only append non-existing props', () => { const markup = `

{$_.title('home.page.title')}

{$_({ id: 'home.page.subtitle'})}

` const dict = extractMessages(markup, { overwrite: false, accumulator: { home: { page: { title: 'Page title', }, }, }, }) expect(dict).toMatchObject({ home: { page: { title: 'Page title', subtitle: '', }, }, list: ['', '', ''], }) }) test('allow to pass a initial dictionary and only append shallow non-existing props', () => { const markup = `

{$_.title('home.page.title')}

{$_({ id: 'home.page.subtitle'})}

` const dict = extractMessages(markup, { overwrite: false, shallow: true, accumulator: { 'home.page.title': 'Page title', }, }) expect(dict).toMatchObject({ 'home.page.title': 'Page title', 'home.page.subtitle': '', }) }) })