Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
784 lines
24 KiB
Plaintext
784 lines
24 KiB
Plaintext
import { describe, expect, it } from 'vitest';
|
|
import { mergeLocalizedData } from './mergeLocalizedData.js';
|
|
describe('mergeLocalizedData', ()=>{
|
|
const selectedLocales = [
|
|
'en'
|
|
];
|
|
const configBlockReferences = [];
|
|
describe('simple fields', ()=>{
|
|
it('should merge localized field values for selected locales', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
localized: true
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
title: {
|
|
en: 'English Title',
|
|
es: 'Spanish Title',
|
|
de: 'German Title'
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
title: {
|
|
en: 'Updated English Title',
|
|
es: 'Updated Spanish Title'
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.title).toEqual({
|
|
en: 'Updated English Title',
|
|
es: 'Spanish Title',
|
|
de: 'German Title'
|
|
});
|
|
});
|
|
it('should keep doc value for non-localized fields', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
localized: false
|
|
}
|
|
];
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales: {
|
|
title: 'New Title'
|
|
},
|
|
docWithLocales: {
|
|
title: 'Old Title'
|
|
},
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.title).toBe('New Title');
|
|
const missingData = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales: {},
|
|
docWithLocales: {
|
|
title: 'Old Title'
|
|
},
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(missingData.title).toBe('Old Title');
|
|
const updatedData = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales: {
|
|
title: 'Updated Title'
|
|
},
|
|
docWithLocales: {},
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(updatedData.title).toBe('Updated Title');
|
|
});
|
|
});
|
|
describe('groups', ()=>{
|
|
it('should merge localized group with locale keys at top level', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'meta',
|
|
type: 'group',
|
|
localized: true,
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text'
|
|
},
|
|
{
|
|
name: 'description',
|
|
type: 'text'
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
meta: {
|
|
en: {
|
|
title: 'EN Title',
|
|
description: 'EN Desc'
|
|
},
|
|
es: {
|
|
title: 'ES Title',
|
|
description: 'ES Desc'
|
|
}
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
meta: {
|
|
en: {
|
|
title: 'Updated EN Title',
|
|
description: 'Updated EN Desc'
|
|
}
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.meta).toEqual({
|
|
en: {
|
|
title: 'Updated EN Title',
|
|
description: 'Updated EN Desc'
|
|
},
|
|
es: {
|
|
title: 'ES Title',
|
|
description: 'ES Desc'
|
|
}
|
|
});
|
|
});
|
|
it('should handle non-localized group with localized children', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'meta',
|
|
type: 'group',
|
|
localized: false,
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
localized: true
|
|
},
|
|
{
|
|
name: 'version',
|
|
type: 'number',
|
|
localized: false
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
meta: {
|
|
title: {
|
|
en: 'EN Title',
|
|
es: 'ES Title'
|
|
},
|
|
version: 1
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
meta: {
|
|
title: {
|
|
en: 'Updated EN Title'
|
|
},
|
|
version: 2
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.meta).toEqual({
|
|
title: {
|
|
en: 'Updated EN Title',
|
|
es: 'ES Title'
|
|
},
|
|
version: 2
|
|
});
|
|
});
|
|
});
|
|
describe('arrays', ()=>{
|
|
it('should merge localized array with locale keys at top level', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
localized: true,
|
|
fields: [
|
|
{
|
|
name: 'name',
|
|
type: 'text'
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
items: {
|
|
en: [
|
|
{
|
|
name: 'EN Item 1'
|
|
},
|
|
{
|
|
name: 'EN Item 2'
|
|
}
|
|
],
|
|
es: [
|
|
{
|
|
name: 'ES Item 1'
|
|
}
|
|
]
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
items: {
|
|
en: [
|
|
{
|
|
name: 'Updated EN Item 1'
|
|
},
|
|
{
|
|
name: 'Updated EN Item 2'
|
|
}
|
|
]
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.items).toEqual({
|
|
en: [
|
|
{
|
|
name: 'Updated EN Item 1'
|
|
},
|
|
{
|
|
name: 'Updated EN Item 2'
|
|
}
|
|
],
|
|
es: [
|
|
{
|
|
name: 'ES Item 1'
|
|
}
|
|
]
|
|
});
|
|
});
|
|
it('should handle non-localized array with localized children', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
localized: false,
|
|
fields: [
|
|
{
|
|
name: 'name',
|
|
type: 'text',
|
|
localized: true
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
items: [
|
|
{
|
|
name: {
|
|
en: 'EN Item 1',
|
|
es: 'ES Item 1'
|
|
}
|
|
},
|
|
{
|
|
name: {
|
|
en: 'EN Item 2',
|
|
es: 'ES Item 2'
|
|
}
|
|
}
|
|
]
|
|
};
|
|
const dataWithLocales = {
|
|
items: [
|
|
{
|
|
name: {
|
|
en: 'Updated EN Item 1'
|
|
}
|
|
},
|
|
{
|
|
name: {
|
|
en: 'Updated EN Item 2'
|
|
}
|
|
}
|
|
]
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.items).toEqual([
|
|
{
|
|
name: {
|
|
en: 'Updated EN Item 1',
|
|
es: 'ES Item 1'
|
|
}
|
|
},
|
|
{
|
|
name: {
|
|
en: 'Updated EN Item 2',
|
|
es: 'ES Item 2'
|
|
}
|
|
}
|
|
]);
|
|
});
|
|
});
|
|
describe('blocks', ()=>{
|
|
it('should merge localized blocks with locale keys at top level', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'content',
|
|
type: 'blocks',
|
|
localized: true,
|
|
blocks: [
|
|
{
|
|
slug: 'text',
|
|
fields: [
|
|
{
|
|
name: 'text',
|
|
type: 'text'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
content: {
|
|
en: [
|
|
{
|
|
blockType: 'text',
|
|
text: 'EN Text'
|
|
}
|
|
],
|
|
es: [
|
|
{
|
|
blockType: 'text',
|
|
text: 'ES Text'
|
|
}
|
|
]
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
content: {
|
|
en: [
|
|
{
|
|
blockType: 'text',
|
|
text: 'Updated EN Text'
|
|
}
|
|
]
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.content).toEqual({
|
|
en: [
|
|
{
|
|
blockType: 'text',
|
|
text: 'Updated EN Text'
|
|
}
|
|
],
|
|
es: [
|
|
{
|
|
blockType: 'text',
|
|
text: 'ES Text'
|
|
}
|
|
]
|
|
});
|
|
});
|
|
it('should handle blocks with nested arrays', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'content',
|
|
type: 'blocks',
|
|
localized: true,
|
|
blocks: [
|
|
{
|
|
slug: 'nested',
|
|
fields: [
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
fields: [
|
|
{
|
|
name: 'name',
|
|
type: 'text'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
content: {
|
|
en: [
|
|
{
|
|
blockType: 'nested',
|
|
items: [
|
|
{
|
|
name: 'EN Item 1'
|
|
}
|
|
]
|
|
}
|
|
],
|
|
es: [
|
|
{
|
|
blockType: 'nested',
|
|
items: [
|
|
{
|
|
name: 'ES Item 1'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
content: {
|
|
en: [
|
|
{
|
|
blockType: 'nested',
|
|
items: [
|
|
{
|
|
name: 'Updated EN Item 1'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.content).toEqual({
|
|
en: [
|
|
{
|
|
blockType: 'nested',
|
|
items: [
|
|
{
|
|
name: 'Updated EN Item 1'
|
|
}
|
|
]
|
|
}
|
|
],
|
|
es: [
|
|
{
|
|
blockType: 'nested',
|
|
items: [
|
|
{
|
|
name: 'ES Item 1'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
});
|
|
});
|
|
});
|
|
describe('tabs', ()=>{
|
|
it('should merge localized named tabs with locale keys at top level', ()=>{
|
|
const fields = [
|
|
{
|
|
type: 'tabs',
|
|
tabs: [
|
|
{
|
|
name: 'meta',
|
|
localized: true,
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
meta: {
|
|
en: {
|
|
title: 'EN Title'
|
|
},
|
|
es: {
|
|
title: 'ES Title'
|
|
}
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
meta: {
|
|
en: {
|
|
title: 'Updated EN Title'
|
|
}
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.meta).toEqual({
|
|
en: {
|
|
title: 'Updated EN Title'
|
|
},
|
|
es: {
|
|
title: 'ES Title'
|
|
}
|
|
});
|
|
});
|
|
it('should handle unnamed tabs with localized fields', ()=>{
|
|
const fields = [
|
|
{
|
|
type: 'tabs',
|
|
tabs: [
|
|
{
|
|
label: 'tab1',
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
localized: true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
title: {
|
|
en: 'EN Title',
|
|
es: 'ES Title'
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
title: {
|
|
en: 'Updated EN Title'
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.title).toEqual({
|
|
en: 'Updated EN Title',
|
|
es: 'ES Title'
|
|
});
|
|
});
|
|
});
|
|
describe('deeply nested structures', ()=>{
|
|
it('should handle multiple levels of nesting with locale keys only at topmost localized field', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'outer',
|
|
type: 'group',
|
|
localized: true,
|
|
fields: [
|
|
{
|
|
name: 'inner',
|
|
type: 'group',
|
|
localized: false,
|
|
fields: [
|
|
{
|
|
name: 'items',
|
|
type: 'array',
|
|
localized: false,
|
|
fields: [
|
|
{
|
|
name: 'text',
|
|
type: 'text',
|
|
localized: false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
outer: {
|
|
en: {
|
|
inner: {
|
|
items: [
|
|
{
|
|
text: 'EN Item 1'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
es: {
|
|
inner: {
|
|
items: [
|
|
{
|
|
text: 'ES Item 1'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
outer: {
|
|
en: {
|
|
inner: {
|
|
items: [
|
|
{
|
|
text: 'Updated EN Item 1'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales
|
|
});
|
|
expect(result.outer).toEqual({
|
|
en: {
|
|
inner: {
|
|
items: [
|
|
{
|
|
text: 'Updated EN Item 1'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
es: {
|
|
inner: {
|
|
items: [
|
|
{
|
|
text: 'ES Item 1'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
describe('multiple selected locales', ()=>{
|
|
it('should merge multiple locales when selected', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
localized: true
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
title: {
|
|
en: 'EN Title',
|
|
es: 'ES Title',
|
|
de: 'DE Title',
|
|
fr: 'FR Title'
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
title: {
|
|
en: 'Updated EN Title',
|
|
es: 'Updated ES Title'
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales: [
|
|
'en',
|
|
'es'
|
|
]
|
|
});
|
|
expect(result.title).toEqual({
|
|
en: 'Updated EN Title',
|
|
es: 'Updated ES Title',
|
|
de: 'DE Title',
|
|
fr: 'FR Title'
|
|
});
|
|
});
|
|
});
|
|
describe('pass through fields, rows, collapsibles, unnamed tabs, unnamed groups', ()=>{
|
|
it('should not lose merged locale data when processing unnamed tabs', ()=>{
|
|
const fields = [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
localized: true
|
|
},
|
|
{
|
|
type: 'tabs',
|
|
tabs: [
|
|
{
|
|
label: 'Other Fields',
|
|
fields: [
|
|
{
|
|
name: 'description',
|
|
type: 'text',
|
|
localized: true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
];
|
|
const docWithLocales = {
|
|
title: {
|
|
en: 'English Title'
|
|
},
|
|
description: {
|
|
en: 'English Description'
|
|
}
|
|
};
|
|
const dataWithLocales = {
|
|
title: {
|
|
en: 'English Title',
|
|
es: 'Spanish Title'
|
|
},
|
|
description: {
|
|
en: 'English Description',
|
|
es: 'Spanish Description'
|
|
}
|
|
};
|
|
const result = mergeLocalizedData({
|
|
configBlockReferences: [],
|
|
dataWithLocales,
|
|
docWithLocales,
|
|
fields,
|
|
selectedLocales: [
|
|
'es'
|
|
]
|
|
});
|
|
expect(result.title).toEqual({
|
|
en: 'English Title',
|
|
es: 'Spanish Title'
|
|
});
|
|
expect(result.description).toEqual({
|
|
en: 'English Description',
|
|
es: 'Spanish Description'
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
//# sourceMappingURL=mergeLocalizedData.spec.js.map |