2024-02-22 17:18:32 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const { createStrapiInstance } = require('api-tests/strapi');
|
|
|
|
const { createTestBuilder } = require('api-tests/builder');
|
|
|
|
const { createAuthRequest } = require('api-tests/request');
|
|
|
|
const { testInTransaction } = require('../../../utils');
|
|
|
|
|
|
|
|
const builder = createTestBuilder();
|
|
|
|
let strapi;
|
|
|
|
let formatDocument;
|
|
|
|
let rq;
|
|
|
|
|
|
|
|
const PRODUCT_UID = 'api::product.product';
|
|
|
|
|
|
|
|
const product = {
|
|
|
|
attributes: {
|
|
|
|
name: {
|
|
|
|
type: 'string',
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
pluginOptions: {
|
|
|
|
i18n: {
|
|
|
|
localized: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
displayName: 'Product',
|
|
|
|
singularName: 'product',
|
|
|
|
pluralName: 'products',
|
|
|
|
description: '',
|
|
|
|
collectionName: '',
|
|
|
|
};
|
|
|
|
|
|
|
|
const createProduct = async (id, locale, status, data = {}) => {
|
|
|
|
await strapi.db.query(PRODUCT_UID).create({
|
|
|
|
data: {
|
|
|
|
documentId: id,
|
|
|
|
name: `prod-${id}-${locale}-${status}`,
|
|
|
|
locale,
|
|
|
|
publishedAt: status === 'published' ? '2024-02-16' : null,
|
|
|
|
...data,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const getProduct = async (name, locale, status) => {
|
|
|
|
return strapi.documents(PRODUCT_UID).findFirst({ filter: { name }, locale, status });
|
|
|
|
};
|
|
|
|
|
|
|
|
describe('CM API - Document metadata', () => {
|
|
|
|
beforeAll(async () => {
|
|
|
|
await builder.addContentType(product).build();
|
|
|
|
|
|
|
|
strapi = await createStrapiInstance();
|
|
|
|
formatDocument = (...props) =>
|
|
|
|
strapi
|
|
|
|
.plugin('content-manager')
|
|
|
|
.service('document-metadata')
|
|
|
|
.formatDocumentWithMetadata(...props);
|
|
|
|
|
|
|
|
rq = await createAuthRequest({ strapi });
|
|
|
|
});
|
|
|
|
|
|
|
|
afterAll(async () => {
|
|
|
|
await strapi.destroy();
|
|
|
|
await builder.cleanup();
|
|
|
|
});
|
|
|
|
|
|
|
|
it(
|
|
|
|
'Returns empty metadata when there is only a draft',
|
|
|
|
testInTransaction(async () => {
|
|
|
|
await createProduct('product', 'en', 'draft');
|
|
|
|
|
|
|
|
const product = await getProduct('product');
|
|
|
|
const { data, meta } = await formatDocument(PRODUCT_UID, product, {});
|
|
|
|
|
|
|
|
expect(data.status).toBe('draft');
|
|
|
|
expect(meta.availableLocales).toEqual([]);
|
|
|
|
expect(meta.availableStatus).toEqual([]);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
it(
|
|
|
|
'Returns availableStatus when draft has a published version',
|
|
|
|
testInTransaction(async () => {
|
|
|
|
await createProduct('product', 'en', 'draft');
|
|
|
|
await createProduct('product', 'en', 'published');
|
|
|
|
|
|
|
|
const draftProduct = await getProduct('product', 'en', 'draft');
|
|
|
|
|
|
|
|
const { data, meta } = await formatDocument(PRODUCT_UID, draftProduct, {});
|
|
|
|
|
|
|
|
expect(data.status).toBe('published');
|
|
|
|
expect(meta.availableLocales).toEqual([]);
|
|
|
|
expect(meta.availableStatus).toMatchObject([
|
|
|
|
{
|
|
|
|
locale: 'en',
|
|
|
|
publishedAt: expect.any(String),
|
|
|
|
createdAt: expect.any(String),
|
|
|
|
updatedAt: expect.any(String),
|
|
|
|
createdBy: expect.any(Object),
|
|
|
|
updatedBy: expect.any(Object),
|
|
|
|
// TODO
|
|
|
|
// status: 'published',
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
it(
|
|
|
|
'Returns availableStatus when published version has a draft version',
|
|
|
|
testInTransaction(async () => {
|
|
|
|
await createProduct('product', 'en', 'draft');
|
|
|
|
await createProduct('product', 'en', 'published');
|
|
|
|
|
|
|
|
const draftProduct = await getProduct('product', 'en', 'published');
|
|
|
|
|
|
|
|
const { data, meta } = await formatDocument(PRODUCT_UID, draftProduct, {});
|
|
|
|
|
|
|
|
expect(meta.availableLocales).toEqual([]);
|
|
|
|
expect(meta.availableStatus).toMatchObject([
|
|
|
|
{
|
|
|
|
locale: 'en',
|
|
|
|
publishedAt: null,
|
|
|
|
createdAt: expect.any(String),
|
|
|
|
updatedAt: expect.any(String),
|
|
|
|
createdBy: expect.any(Object),
|
|
|
|
updatedBy: expect.any(Object),
|
|
|
|
// TODO
|
|
|
|
// status: 'published',
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
it(
|
|
|
|
'Returns available locales when there are multiple locales',
|
|
|
|
testInTransaction(async () => {
|
|
|
|
await createProduct('product', 'en', 'draft');
|
|
|
|
await createProduct('product', 'fr', 'draft');
|
|
|
|
|
|
|
|
const draftProduct = await getProduct('product', 'en', 'draft');
|
|
|
|
|
|
|
|
const { data, meta } = await formatDocument(PRODUCT_UID, draftProduct, {});
|
|
|
|
|
|
|
|
expect(meta.availableLocales).toMatchObject([
|
|
|
|
{
|
|
|
|
locale: 'fr',
|
|
|
|
status: 'draft',
|
|
|
|
createdAt: expect.any(String),
|
|
|
|
updatedAt: expect.any(String),
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
expect(meta.availableStatus).toEqual([]);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
//TODO: Modified status
|
|
|
|
it(
|
|
|
|
'Returns modified status when draft is different from published version',
|
|
|
|
testInTransaction(async () => {
|
|
|
|
// Published versions should have different dates
|
|
|
|
await createProduct('product', 'en', 'draft');
|
|
|
|
await createProduct('product', 'en', 'published', { updatedAt: '2024-02-11' });
|
|
|
|
await createProduct('product', 'fr', 'draft');
|
|
|
|
await createProduct('product', 'fr', 'published', { updatedAt: '2024-02-11' });
|
|
|
|
|
|
|
|
const draftProduct = await getProduct('product', 'en', 'draft');
|
|
|
|
const { data, meta } = await formatDocument(PRODUCT_UID, draftProduct, {});
|
|
|
|
|
|
|
|
expect(data.status).toBe('modified');
|
|
|
|
expect(meta.availableLocales).toMatchObject([{ locale: 'fr', status: 'modified' }]);
|
2024-02-28 14:15:24 +01:00
|
|
|
// expect(meta.availableStatus).toMatchObject([{ status: 'modified' }]);
|
2024-02-22 17:18:32 +00:00
|
|
|
|
|
|
|
const publishedProduct = await getProduct('product', 'en', 'published');
|
|
|
|
const { data: dataPublished, meta: metaPublished } = await formatDocument(
|
|
|
|
PRODUCT_UID,
|
|
|
|
publishedProduct,
|
|
|
|
{}
|
|
|
|
);
|
|
|
|
|
|
|
|
expect(dataPublished.status).toBe('modified');
|
|
|
|
expect(metaPublished.availableLocales).toMatchObject([{ locale: 'fr', status: 'modified' }]);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
});
|