import { describe, expect, it } from '@jest/globals'
import parseI18n from '../src'
import locale from '../src/en.json'
import localeNested from '../src/en-nested.json'
import localeNestedMultiTyped from '../src/en-nested-multitype.json'
describe('test module', () => {
it('Readme - Vue example 1 - 42 messages', () => {
const result = parseI18n(
{
name: 'Joe',
count: 42,
},
{
format: {
the_label: "{name} has {count} {messages}"
},
override: {
the_label: {
options: {
count: ['no', '{count}'],
messages: ['messages', ''],
},
conditions: {
count: (props) => props.count === 0
}
}
}
}
)
expect(result).toStrictEqual({
the_label: 'Joe has 42 messages',
})
})
it('Readme - Vue example 2 - no message', () => {
const result = parseI18n({
name: 'Joe',
count: 0,
}, {
format: {
the_label: "{name} has {count} {messages}",
the_label2: "{a} has {b} {c}"
},
override: {
the_label: {
options: {
count: [`no`, '{count}'],
messages: ['messages', ''],
},
conditions: {
count: (props) => props.count === 0
}
}
}
})
expect(result).toStrictEqual({
the_label: 'Joe has no messages',
the_label2: '{a} has {b} {c}',
})
})
it('Readme - Vue example 3 - no message with html markup', () => {
const result = parseI18n({
name: 'Joe',
count: 0,
}, {
format: {
the_label: "{name} has {count} {messages}",
the_label2: "{a} has {b} {c}"
},
override: {
the_label: {
options: {
count: [`no`, '{count}'],
messages: ['messages', ''],
},
conditions: {
count: (props) => props.count === 0
}
}
}
})
expect(result).toStrictEqual({
the_label: 'Joe has no messages',
the_label2: '{a} has {b} {c}',
})
})
it('Readme - Vue example 4 - 42 messages without messages label so "messages" is displayed as {placeholder}', () => {
const result = parseI18n({
name: 'Joe',
count: 42,
}, {
format: {
the_label: "{name} has {count} {messages}"
},
override: {
the_label: {
options: {
count: ['no', '{count}'],
},
conditions: {
count: (props) => props.count === 0
}
}
}
})
expect(result).toStrictEqual({
the_label: 'Joe has 42 {messages}',
})
})
it('Readme - Greeting example 1 - condition: male + age > 20', () => {
const result = parseI18n({
greeting: {
isMale: true,
name: 'Joe',
age: 42
},
}, {
format: {
greeting: {
template: `Hello {isMale} {name} {age}`,
options: {
isMale: ['Sir', 'Madam'],
name: ['{name}', ''],
age: ['({age})', '']
},
conditions: {
isMale: (props) => props.isMale,
name: true,
age: (props) => props.isMale || props.age < 20,
}
}
}
})
expect(result).toStrictEqual({
greeting: 'Hello Sir Joe (42)',
})
})
it('Readme - Greeting example 2 - condition madam + age > 20', () => {
const result = parseI18n({
greeting: {
isMale: false,
name: 'Joelle',
age: 42,
},
}, {
format: {
greeting: {
template: `Hello {isMale} {name}{age}`,
options: {
isMale: ['Sir', 'Madam'],
name: ['{name}', ''],
age: [' ({age})', '']
},
conditions: {
isMale: (props) => props.isMale,
name: true,
age: (props) => props.isMale || props.age < 20,
}
}
}
})
expect(result).toStrictEqual({
greeting: 'Hello Madam Joelle',
})
})
it('Readme - Greeting example 3 - condition: madam + age < 20', () => {
const result = parseI18n({
greeting: {
isMale: false,
name: 'Joelle',
age: 18,
},
}, {
format: {
greeting: {
template: `Hello {isMale} {name}{age}`,
options: {
isMale: ['Sir', 'Madam'],
name: ['{name}', ''],
age: [' ({age})', '']
},
conditions: {
isMale: (props) => props.isMale,
name: true,
age: (props) => props.isMale || props.age < 20,
}
}
}
})
expect(result).toStrictEqual({
greeting: 'Hello Madam Joelle (18)',
})
})
it('locale file', () => {
const mockData = {
locale_greeting: {
name: 'Fatosh',
age: 37,
}
}
const result = parseI18n(mockData, {
format: locale,
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have {count} {messages}',
})
})
it('locale file in string', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 37,
}
}, {
format: JSON.stringify(locale) as any
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have {count} {messages}',
})
})
it('locale file with options and conditions override', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 27,
},
messages_notifications: {
count: 2,
}
}, {
format: locale,
override: {
locale_greeting: {
options: {
age: ['{age}', '31 plus'],
},
conditions: {
age: (props) => props.age < 30,
}
},
messages_notifications: {
options: {
messages: ['message', 'messages'],
},
conditions: {
messages: (props) => props.count === 1,
},
}
}
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (27)',
messages_notifications: 'You have 2 messages',
})
})
it('locale file with options and conditions override and default fallback', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 37,
},
messages_notifications: {
count: 2,
}
}, {
format: locale,
override: {
messages_notifications: {
options: {
messages: ['messages', 'message'],
},
conditions: {
messages: (props) => props.count > 1,
},
}
}
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have 2 messages',
})
})
it('locale file with options and conditions override and index returns', () => {
const result = parseI18n(
{
count: 22,
},
{
format: locale,
override: {
messages_notifications: {
options: {
count: ["no", "one", "{count}"],
messages: ["messages", "message", "+ messages"],
},
conditions: {
count: (props) => {
if (props.count === 0) {
return 0
} else if (props.count === 1) {
return 1
}
return 2
},
messages: (props) => {
if (props.count === 0) {
return 0
} else if (props.count === 1) {
return 1
}
return 2
},
},
},
}
}
)
expect(result).toStrictEqual({
locale_greeting: 'Hi {name} ({age})',
messages_notifications: 'You have 22 + messages',
})
})
it('locale file nested with specific data points', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 37,
},
error: {
unsaved_n: 10,
entity: 'DSA',
errorMessage: 'Some Error',
modal: {
close: {
unsaved_n: 22,
}
}
}
}, {
format: localeNested as any,
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have {count} {messages}',
error: {
load: 'Failed to load DSA due to \"Some Error\"',
modal: {
close: 'Closing blocked due to 22 unsaved input',
},
save: 'Failed to save DSA due to \"Some Error\"',
}
})
})
it('locale file nested with no specific data points with fallback', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 37,
unsaved_n: 10,
},
error: {
entity: 'DSA',
errorMessage: 'Some Error',
modal: {
close: {
// unsaved_n: null,
}
}
}
}, {
format: localeNested as any,
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have {count} {messages}',
error: {
load: 'Failed to load DSA due to \"Some Error\"',
modal: {
close: 'Closing blocked due to 10 unsaved input',
},
save: 'Failed to save DSA due to \"Some Error\"',
}
})
})
it('locale file nested with no specific data points without fallback', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 37,
unsaved_n: 10,
},
error: {
entity: 'DSA',
errorMessage: 'Some Error',
modal: {
close: {
unsaved_n: null,
}
}
}
}, {
format: localeNested as any,
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have {count} {messages}',
error: {
load: 'Failed to load DSA due to \"Some Error\"',
modal: {
close: 'Closing blocked due to {unsaved_n} unsaved input',
},
save: 'Failed to save DSA due to \"Some Error\"',
}
})
})
it('locale file nested with multitypes (arrays) with specific data', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 37,
unsaved_n: 10,
},
error: {
entity: 'DSA',
errorMessage: 'Some Error',
modal: {
close: {
unsaved_n: null,
}
},
popUps: {
name: '1',
age: 1,
count: 1
}
},
}, {
format: localeNestedMultiTyped as any,
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have 1 {messages}',
error: {
load: 'Failed to load DSA due to \"Some Error\"',
modal: {
close: 'Closing blocked due to {unsaved_n} unsaved input',
},
save: 'Failed to save DSA due to \"Some Error\"',
popUps: [
"Title popup name: 1",
"Title popup age: 1",
"Title popup count: 1",
]
}
})
})
it('locale file nested with multitypes (arrays) without specific data', () => {
const result = parseI18n({
locale_greeting: {
name: 'Fatosh',
age: 37,
unsaved_n: 10,
},
error: {
entity: 'DSA',
errorMessage: 'Some Error',
modal: {
close: {
unsaved_n: null,
}
},
popUps: {
name: '1',
// age: 1,
count: 1
}
},
popUps: {
name: '-1',
age: -1,
// count: -1
}
}, {
format: localeNestedMultiTyped as any,
})
expect(result).toStrictEqual({
locale_greeting: 'Hi Fatosh (37)',
messages_notifications: 'You have 1 {messages}',
error: {
load: 'Failed to load DSA due to \"Some Error\"',
modal: {
close: 'Closing blocked due to {unsaved_n} unsaved input',
},
save: 'Failed to save DSA due to \"Some Error\"',
popUps: [
"Title popup name: 1",
"Title popup age: -1",
"Title popup count: 1",
]
}
})
})
})