You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.2 KiB
180 lines
5.2 KiB
import type { Core, Modules } from '@strapi/types';
|
|
|
|
import { omit } from 'lodash/fp';
|
|
|
|
import { createTestSetup, destroyTestSetup } from '../../../utils/builder-helper';
|
|
import { testInTransaction } from '../../../utils/index';
|
|
import resources from './resources/index';
|
|
import { ARTICLE_UID, findArticleDb } from './utils';
|
|
|
|
let strapi: Core.Strapi;
|
|
|
|
const updateArticle = async (params: Modules.Documents.ServiceParams['update']) => {
|
|
return strapi.documents(ARTICLE_UID).update({ ...params });
|
|
};
|
|
|
|
describe('Document Service', () => {
|
|
let testUtils;
|
|
|
|
beforeAll(async () => {
|
|
testUtils = await createTestSetup(resources);
|
|
strapi = testUtils.strapi;
|
|
});
|
|
|
|
afterAll(async () => {
|
|
await destroyTestSetup(testUtils);
|
|
});
|
|
|
|
describe('Update', () => {
|
|
testInTransaction('Can update a draft', async () => {
|
|
const articleDb = await findArticleDb({ title: 'Article1-Draft-EN' });
|
|
|
|
const data = {
|
|
title: 'Updated Document',
|
|
comp: {
|
|
text: 'comp-1',
|
|
},
|
|
dz: [
|
|
{
|
|
__component: 'article.dz-comp',
|
|
name: 'dz-comp-1',
|
|
},
|
|
],
|
|
};
|
|
|
|
const article = await updateArticle({
|
|
documentId: articleDb.documentId,
|
|
data,
|
|
populate: '*',
|
|
});
|
|
|
|
// verify that the returned document was updated
|
|
expect(article).toMatchObject({
|
|
...omit('updatedAt', articleDb),
|
|
...data,
|
|
});
|
|
});
|
|
|
|
testInTransaction('Can update a draft article in dutch', async () => {
|
|
const articleDb = await findArticleDb({ title: 'Article1-Draft-NL' });
|
|
|
|
const data = { title: 'updated document' };
|
|
|
|
// Update an existing locale of a document
|
|
const article = await updateArticle({
|
|
documentId: articleDb.documentId,
|
|
locale: 'nl',
|
|
data,
|
|
});
|
|
|
|
// verify that the returned document was updated
|
|
expect(article).toMatchObject({
|
|
...omit('updatedAt', articleDb),
|
|
...data,
|
|
});
|
|
|
|
// verity others locales are not updated
|
|
const enLocale = await findArticleDb({ title: 'Article1-Draft-EN' });
|
|
expect(enLocale).toBeDefined();
|
|
});
|
|
|
|
testInTransaction('Create a new locale for an existing document', async () => {
|
|
const articleDb = await findArticleDb({ title: 'Article1-Draft-EN' });
|
|
const newName = 'updated document';
|
|
|
|
// Create a new article in spanish
|
|
const data = { title: newName };
|
|
const article = await updateArticle({
|
|
documentId: articleDb.documentId,
|
|
locale: 'es',
|
|
data,
|
|
});
|
|
|
|
// verify that the returned document was updated
|
|
expect(article).toMatchObject({
|
|
documentId: articleDb.documentId,
|
|
locale: 'es',
|
|
...data,
|
|
});
|
|
|
|
// verify it was updated in the database
|
|
const updatedArticleDb = await findArticleDb({ title: newName });
|
|
expect(updatedArticleDb).toMatchObject(article);
|
|
|
|
// verity others locales are not updated
|
|
const enLocale = await findArticleDb({ title: 'Article1' });
|
|
expect(enLocale).toBeDefined();
|
|
});
|
|
|
|
testInTransaction('Can update a draft and publish it', async () => {
|
|
const articleDb = await findArticleDb({ title: 'Article1-Draft-EN' });
|
|
|
|
const article = await updateArticle({
|
|
documentId: articleDb.documentId,
|
|
data: { title: 'Updated Document' },
|
|
status: 'published',
|
|
});
|
|
|
|
expect(article).toMatchObject({
|
|
title: 'Updated Document',
|
|
publishedAt: expect.any(String),
|
|
});
|
|
});
|
|
|
|
testInTransaction('Returns null if document to update does not exist', async () => {
|
|
const article = await updateArticle({
|
|
documentId: 'does-not-exist',
|
|
data: { title: 'updated document' },
|
|
});
|
|
|
|
expect(article).toBeNull();
|
|
});
|
|
|
|
testInTransaction(
|
|
'Preserves non-localized fields when updating localized content for new locale',
|
|
async () => {
|
|
// Covers issue https://github.com/strapi/strapi/issues/21594
|
|
|
|
const MIXED_CONTENT_UID = 'api::mixed-content.mixed-content';
|
|
|
|
// Create a document with both localized and non-localized fields
|
|
const originalDoc = await strapi.documents(MIXED_CONTENT_UID).create({
|
|
data: {
|
|
localizedText: 'Original Text',
|
|
sharedText: 'Shared Content',
|
|
},
|
|
locale: 'en',
|
|
});
|
|
|
|
const updatedDoc = await strapi.documents(MIXED_CONTENT_UID).update({
|
|
documentId: originalDoc.documentId,
|
|
locale: 'es',
|
|
data: {
|
|
localizedText: 'Texto Español',
|
|
},
|
|
});
|
|
|
|
expect(updatedDoc).toMatchObject({
|
|
documentId: originalDoc.documentId,
|
|
locale: 'es',
|
|
localizedText: 'Texto Español',
|
|
// Non-localized field should remain unchanged
|
|
sharedText: 'Shared Content',
|
|
});
|
|
|
|
const originalEnDoc = await strapi.documents(MIXED_CONTENT_UID).findOne({
|
|
documentId: originalDoc.documentId,
|
|
locale: 'en',
|
|
});
|
|
|
|
expect(originalEnDoc).toMatchObject({
|
|
documentId: originalDoc.documentId,
|
|
locale: 'en',
|
|
localizedText: 'Original Text',
|
|
sharedText: 'Shared Content',
|
|
});
|
|
}
|
|
);
|
|
});
|
|
});
|