payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
530 lines (529 loc) • 17.2 kB
JavaScript
import { describe, expect, it } from 'vitest';
import { filterDataToSelectedLocales } from './filterDataToSelectedLocales.js';
describe('filterDataToSelectedLocales', ()=>{
const selectedLocales = [
'en'
];
const configBlockReferences = [];
describe('block metadata preservation', ()=>{
it('should preserve blockType, id, and blockName on non-localized blocks', ()=>{
const fields = [
{
name: 'layout',
type: 'blocks',
blocks: [
{
slug: 'content',
fields: [
{
name: 'richText',
type: 'richText',
localized: true
}
]
}
]
}
];
const docWithLocales = {
layout: [
{
blockType: 'content',
id: 'abc123',
blockName: 'My Block',
richText: {
en: 'English',
es: 'Spanish'
}
}
]
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.layout).toHaveLength(1);
expect(result.layout[0].blockType).toBe('content');
expect(result.layout[0].id).toBe('abc123');
expect(result.layout[0].blockName).toBe('My Block');
expect(result.layout[0].richText).toEqual({
en: 'English'
});
});
it('should preserve blockType and id when block has no blockName', ()=>{
const fields = [
{
name: 'layout',
type: 'blocks',
blocks: [
{
slug: 'text',
fields: [
{
name: 'text',
type: 'text',
localized: true
}
]
}
]
}
];
const docWithLocales = {
layout: [
{
blockType: 'text',
id: 'def456',
text: {
en: 'English',
es: 'Spanish'
}
}
]
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.layout).toHaveLength(1);
expect(result.layout[0].blockType).toBe('text');
expect(result.layout[0].id).toBe('def456');
expect(result.layout[0].text).toEqual({
en: 'English'
});
});
it('should preserve blockType and id with configBlockReferences', ()=>{
const fields = [
{
name: 'layout',
type: 'blocks',
blocks: [],
blockReferences: [
'content'
]
}
];
const result = filterDataToSelectedLocales({
configBlockReferences: [
{
slug: 'content',
flattenedFields: [],
fields: [
{
name: 'body',
type: 'text',
localized: true
}
]
}
],
docWithLocales: {
layout: [
{
blockType: 'content',
id: 'ref123',
body: {
en: 'English',
es: 'Spanish'
}
}
]
},
fields,
selectedLocales
});
expect(result.layout).toHaveLength(1);
expect(result.layout[0].blockType).toBe('content');
expect(result.layout[0].id).toBe('ref123');
expect(result.layout[0].body).toEqual({
en: 'English'
});
});
});
describe('localized arrays', ()=>{
it('should filter localized array to selected locales and recurse into rows', ()=>{
const fields = [
{
name: 'items',
type: 'array',
localized: true,
fields: [
{
name: 'title',
type: 'text'
}
]
}
];
const docWithLocales = {
items: {
en: [
{
title: 'English Item'
}
],
es: [
{
title: 'Spanish Item'
}
],
de: [
{
title: 'German Item'
}
]
}
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.items).toEqual({
en: [
{
title: 'English Item'
}
]
});
});
it('should handle non-localized array with localized children', ()=>{
const fields = [
{
name: 'items',
type: 'array',
fields: [
{
name: 'label',
type: 'text',
localized: true
},
{
name: 'value',
type: 'text'
}
]
}
];
const docWithLocales = {
items: [
{
label: {
en: 'English',
es: 'Spanish'
},
value: 'one'
},
{
label: {
en: 'English 2',
es: 'Spanish 2'
},
value: 'two'
}
]
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.items).toEqual([
{
label: {
en: 'English'
},
value: 'one'
},
{
label: {
en: 'English 2'
},
value: 'two'
}
]);
});
});
describe('localized blocks', ()=>{
it('should filter localized blocks field to selected locales', ()=>{
const fields = [
{
name: 'layout',
type: 'blocks',
localized: true,
blocks: [
{
slug: 'hero',
fields: [
{
name: 'heading',
type: 'text'
}
]
}
]
}
];
const docWithLocales = {
layout: {
en: [
{
blockType: 'hero',
id: '1',
blockName: 'Hero EN',
heading: 'Hello'
}
],
es: [
{
blockType: 'hero',
id: '2',
blockName: 'Hero ES',
heading: 'Hola'
}
],
de: [
{
blockType: 'hero',
id: '3',
blockName: 'Hero DE',
heading: 'Hallo'
}
]
}
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.layout).toEqual({
en: [
{
blockType: 'hero',
id: '1',
blockName: 'Hero EN',
heading: 'Hello'
}
]
});
});
it('should filter localized blocks with multiple selected locales', ()=>{
const fields = [
{
name: 'layout',
type: 'blocks',
localized: true,
blocks: [
{
slug: 'text',
fields: [
{
name: 'body',
type: 'text'
}
]
}
]
}
];
const docWithLocales = {
layout: {
en: [
{
blockType: 'text',
id: '1',
blockName: 'Text EN',
body: 'English'
}
],
es: [
{
blockType: 'text',
id: '2',
blockName: 'Text ES',
body: 'Spanish'
}
],
de: [
{
blockType: 'text',
id: '3',
blockName: 'Text DE',
body: 'German'
}
]
}
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales: [
'en',
'es'
]
});
expect(result.layout).toEqual({
en: [
{
blockType: 'text',
id: '1',
blockName: 'Text EN',
body: 'English'
}
],
es: [
{
blockType: 'text',
id: '2',
blockName: 'Text ES',
body: 'Spanish'
}
]
});
});
});
describe('localized groups', ()=>{
it('should filter localized group to selected locales and recurse into children', ()=>{
const fields = [
{
name: 'meta',
type: 'group',
localized: true,
fields: [
{
name: 'title',
type: 'text'
},
{
name: 'description',
type: 'text'
}
]
}
];
const docWithLocales = {
meta: {
en: {
title: 'English Title',
description: 'English Desc'
},
es: {
title: 'Spanish Title',
description: 'Spanish Desc'
},
de: {
title: 'German Title',
description: 'German Desc'
}
}
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.meta).toEqual({
en: {
title: 'English Title',
description: 'English Desc'
}
});
});
it('should handle non-localized group with localized children', ()=>{
const fields = [
{
name: 'seo',
type: 'group',
fields: [
{
name: 'title',
type: 'text',
localized: true
},
{
name: 'slug',
type: 'text'
}
]
}
];
const docWithLocales = {
seo: {
title: {
en: 'English SEO',
es: 'Spanish SEO'
},
slug: 'my-page'
}
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.seo).toEqual({
title: {
en: 'English SEO'
},
slug: 'my-page'
});
});
});
describe('simple fields', ()=>{
it('should filter localized field values to selected locales', ()=>{
const fields = [
{
name: 'title',
type: 'text',
localized: true
}
];
const docWithLocales = {
title: {
en: 'English Title',
es: 'Spanish Title',
de: 'German Title'
}
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.title).toEqual({
en: 'English Title'
});
});
it('should pass through non-localized fields as-is', ()=>{
const fields = [
{
name: 'slug',
type: 'text'
}
];
const docWithLocales = {
slug: 'my-slug'
};
const result = filterDataToSelectedLocales({
configBlockReferences: [],
docWithLocales,
fields,
selectedLocales
});
expect(result.slug).toBe('my-slug');
});
});
});
//# sourceMappingURL=filterDataToSelectedLocales.spec.js.map