///
import { buildRecordExportEnvelope, SiteManifestInfo } from './recordExport';
const siteInfo: SiteManifestInfo = {
sourceProjectId: 'project-1',
sourceEnvironment: 'main',
defaultLocale: 'en',
locales: ['en', 'pt'],
};
describe('recordExport envelope', () => {
test('builds schema maps and deep reference index for nested content', () => {
const itemTypes = [
{ id: 'model_page', api_key: 'page' },
{ id: 'block_hero', api_key: 'hero_block', modular_block: true },
{ id: 'block_cta', api_key: 'cta_block', modular_block: true },
];
const fields = [
{
id: 'f_related',
item_type: { id: 'model_page' },
api_key: 'related',
field_type: 'link',
localized: false,
},
{
id: 'f_related_items',
item_type: { id: 'model_page' },
api_key: 'related_items',
field_type: 'links',
localized: false,
},
{
id: 'f_cover',
item_type: { id: 'model_page' },
api_key: 'cover',
field_type: 'file',
localized: false,
},
{
id: 'f_gallery',
item_type: { id: 'model_page' },
api_key: 'gallery',
field_type: 'gallery',
localized: false,
},
{
id: 'f_body',
item_type: { id: 'model_page' },
api_key: 'body',
field_type: 'modular_content',
localized: false,
},
{
id: 'f_content',
item_type: { id: 'model_page' },
api_key: 'content',
field_type: 'structured_text',
localized: true,
},
{
id: 'f_linked_cta',
item_type: { id: 'block_hero' },
api_key: 'linked_cta',
field_type: 'link',
localized: false,
},
{
id: 'f_assets',
item_type: { id: 'block_hero' },
api_key: 'assets',
field_type: 'gallery',
localized: false,
},
{
id: 'f_nested',
item_type: { id: 'block_hero' },
api_key: 'nested',
field_type: 'single_block',
localized: false,
},
{
id: 'f_target',
item_type: { id: 'block_cta' },
api_key: 'target',
field_type: 'link',
localized: false,
},
{
id: 'f_attachment',
item_type: { id: 'block_cta' },
api_key: 'attachment',
field_type: 'file',
localized: false,
},
];
const records = [
{
id: 'record-100',
item_type: { id: 'model_page' },
related: 'record-200',
related_items: ['record-201', 'record-202'],
cover: 'upload-1',
gallery: ['upload-2'],
body: [
{
id: 'block-1',
item_type: { id: 'block_hero' },
linked_cta: 'record-300',
assets: ['upload-3'],
nested: {
id: 'block-2',
item_type: { id: 'block_cta' },
target: 'record-301',
attachment: 'upload-4',
},
},
],
content: {
en: {
schema: 'dast',
links: ['record-402'],
blocks: [
{
id: 'block-3',
item_type: { id: 'block_cta' },
target: 'record-403',
attachment: 'upload-5',
},
],
document: {
type: 'root',
children: [
{
type: 'paragraph',
children: [
{ type: 'itemLink', item: 'record-400' },
{ type: 'inlineItem', item: 'record-401' },
{ type: 'block', item: 'block-3' },
],
},
],
},
},
pt: {
schema: 'dast',
links: [{ id: 'record-405' }],
blocks: ['block-4'],
document: {
type: 'root',
children: [
{
type: 'paragraph',
children: [{ type: 'itemLink', item: { id: 'record-404' } }],
},
],
},
},
},
},
];
const envelope = buildRecordExportEnvelope({
records: records as Record[],
itemTypes: itemTypes as Record[],
fields: fields as Record[],
siteInfo,
filtersUsed: { modelIDs: ['model_page'], textQuery: 'landing' },
scope: 'bulk',
});
expect(envelope.manifest.exportVersion).toBe('2.1.0');
expect(envelope.manifest.sourceProjectId).toBe('project-1');
expect(envelope.manifest.configurationExport.includedResources).toContain(
'site'
);
expect(envelope.manifest.configurationExport.warningCount).toBe(0);
expect(envelope.schema.itemTypeIdToApiKey.model_page).toBe('page');
expect(envelope.schema.fieldIdToApiKey.f_related).toBe('related');
expect(envelope.schema.fieldsByItemType.model_page).toEqual(
expect.arrayContaining([
expect.objectContaining({
apiKey: 'content',
fieldType: 'structured_text',
localized: true,
}),
])
);
const recordTargets = new Set(
envelope.referenceIndex.recordRefs.map((reference) => reference.targetSourceId)
);
const uploadTargets = new Set(
envelope.referenceIndex.uploadRefs.map((reference) => reference.targetSourceId)
);
const blockTargets = new Set(
envelope.referenceIndex.blockRefs.map((reference) => reference.blockSourceId)
);
[
'record-200',
'record-201',
'record-202',
'record-300',
'record-301',
'record-400',
'record-401',
'record-402',
'record-403',
'record-404',
'record-405',
].forEach((expectedTarget) => {
expect(recordTargets.has(expectedTarget)).toBe(true);
});
['upload-1', 'upload-2', 'upload-3', 'upload-4', 'upload-5'].forEach(
(expectedTarget) => {
expect(uploadTargets.has(expectedTarget)).toBe(true);
}
);
['block-1', 'block-2', 'block-3', 'block-4'].forEach((expectedTarget) => {
expect(blockTargets.has(expectedTarget)).toBe(true);
});
expect(
envelope.referenceIndex.structuredTextRefs.some(
(reference) =>
reference.targetSourceId === 'record-400' &&
reference.kind === 'link' &&
reference.locale === 'en'
)
).toBe(true);
expect(
envelope.referenceIndex.structuredTextRefs.some(
(reference) =>
reference.targetSourceId === 'block-3' &&
reference.targetType === 'block' &&
reference.kind === 'block' &&
reference.locale === 'en'
)
).toBe(true);
expect(envelope.assetPackageInfo.manifestFilename).toBe('manifest.json');
expect(
envelope.assetPackageInfo.zipEntryNamingConvention
).toContain('');
expect(envelope.projectConfiguration.site).toBeNull();
expect(envelope.projectConfiguration.menuItems).toEqual([]);
});
});