strapi/api-tests/core/content-manager/api/number-of-draft-relations.test.api.js
Marc Roig ff8ed1fc36
feat: Draft & Publish V5 (#18941)
* feat: use document service in content manager
* feat: locale and status filtering
* feat: refactor single type controllers to use documents
* feat: get locale param from in cm endpoints
* feat: get locale param from cm endpoints
* feat: prevent empty string locale filtering
* fix(content-manager): access to non default locale documents
* chore(content-manager): revert route construction
* test(content-manager): counting number of draft relations for non default locales
* chore(content-manager): remove default locale from entity manager countDraftRelations


---------

Co-authored-by: Ben Irvin <ben@innerdvations.com>
Co-authored-by: Jamie Howard <48524071+jhoward1994@users.noreply.github.com>
Co-authored-by: Josh <37798644+joshuaellis@users.noreply.github.com>
2024-01-25 18:43:08 +01:00

397 lines
10 KiB
JavaScript

'use strict';
const { createStrapiInstance } = require('api-tests/strapi');
const { createTestBuilder } = require('api-tests/builder');
const { createAuthRequest } = require('api-tests/request');
const builder = createTestBuilder();
let strapi;
let rq;
const categories = {
published: [],
draft: [],
};
const productModel = {
displayName: 'Product',
singularName: 'product',
pluralName: 'products',
description: '',
collectionName: '',
pluginOptions: {
i18n: {
localized: true,
},
},
attributes: {
name: {
type: 'string',
required: true,
},
categories: {
type: 'relation',
relation: 'oneToMany',
target: 'api::category.category',
targetAttribute: 'product',
},
onecategory: {
type: 'relation',
relation: 'oneToOne',
target: 'api::category.category',
targetAttribute: 'oneproduct',
},
categories: {
type: 'relation',
relation: 'oneToMany',
target: 'api::category.category',
targetAttribute: 'product',
},
compo: {
component: 'default.compo',
type: 'component',
},
comporep: {
component: 'default.compo',
type: 'component',
repeatable: true,
},
dz: {
components: ['default.compo'],
type: 'dynamiczone',
},
},
};
const categoryModel = {
displayName: 'Category',
singularName: 'category',
pluralName: 'categories',
pluginOptions: {
i18n: {
localized: true,
},
},
attributes: {
name: {
type: 'string',
},
},
};
const compoModel = {
displayName: 'compo',
attributes: {
name: {
type: 'string',
},
categories: {
type: 'relation',
relation: 'oneToMany',
target: 'api::category.category',
},
onecategory: {
type: 'relation',
relation: 'oneToOne',
target: 'api::category.category',
},
},
};
// TODO: Fix relations
describe.skip('CM API - Basic', () => {
const locale = 'fr';
beforeAll(async () => {
await builder
.addContentTypes([categoryModel])
.addComponent(compoModel)
.addContentTypes([productModel])
.build();
strapi = await createStrapiInstance();
rq = await createAuthRequest({ strapi });
const {
body: { id: idToPublish },
} = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::category.category',
body: { name: 'Food' },
});
const { body: categoryPublished } = await rq({
method: 'POST',
url: `/content-manager/collection-types/api::category.category/${idToPublish}/actions/publish`,
});
categories.published.push(categoryPublished);
const { body: categoryDraft1 } = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::category.category',
body: { name: 'Food' },
});
categories.draft.push(categoryDraft1);
const { body: categoryDraft2 } = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::category.category',
body: { name: 'Food' },
});
categories.draft.push(categoryDraft2);
// Create a non default locale
await rq({
method: 'POST',
url: '/i18n/locales',
body: {
code: locale,
name: `French (${locale})`,
isDefault: false,
},
});
});
afterAll(async () => {
await strapi.destroy();
await builder.cleanup();
});
test('Return 0 when no relations are set', async () => {
const { body: product } = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::product.product',
body: { name: 'Pizza' },
});
const { body } = await rq({
method: 'GET',
url: `/content-manager/collection-types/api::product.product/${product.id}/actions/countDraftRelations`,
});
expect(body.data).toBe(0);
});
test('Return 0 for published relations only', async () => {
const publishedId = categories.published[0].entryId;
const { body: product } = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::product.product',
body: {
name: 'Pizza',
onecategory: publishedId,
categories: [publishedId],
compo: {
onecategory: publishedId,
categories: [publishedId],
},
comporep: [{ onecategory: publishedId, categories: [publishedId] }],
dz: [
{
__component: 'default.compo',
onecategory: publishedId,
categories: [publishedId],
},
],
},
});
const { body } = await rq({
method: 'GET',
url: `/content-manager/collection-types/api::product.product/${product.id}/actions/countDraftRelations`,
});
expect(body.data).toBe(0);
});
test('Return 8 when there are 8 drafts (1 xToOne & 1 xToMany on ct, compo, comporep, dz)', async () => {
const draftId = categories.draft[0].entryId;
const { body: product } = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::product.product',
body: {
name: 'Pizza',
onecategory: draftId,
categories: [draftId],
compo: {
onecategory: draftId,
categories: [draftId],
},
comporep: [{ onecategory: draftId, categories: [draftId] }],
dz: [
{
__component: 'default.compo',
onecategory: draftId,
categories: [draftId],
},
],
},
});
const { body } = await rq({
method: 'GET',
url: `/content-manager/collection-types/api::product.product/${product.id}/actions/countDraftRelations`,
});
expect(body.data).toBe(8);
});
test('Return 8 when there are 8 drafts (1 xToOne & 1/2 xToMany on ct, compo, comporep, dz)', async () => {
const publishedId = categories.published[0].entryId;
const draftId = categories.draft[0].entryId;
const { body: product } = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::product.product',
body: {
name: 'Pizza',
onecategory: draftId,
categories: [publishedId],
categories: [draftId, publishedId],
compo: {
onecategory: draftId,
categories: [publishedId],
categories: [draftId, publishedId],
},
comporep: [
{
onecategory: draftId,
categories: [publishedId],
categories: [draftId, publishedId],
},
],
dz: [
{
onecategory: draftId,
__component: 'default.compo',
categories: [publishedId],
categories: [draftId, publishedId],
},
],
},
});
const { body } = await rq({
method: 'GET',
url: `/content-manager/collection-types/api::product.product/${product.id}/actions/countDraftRelations`,
});
expect(body.data).toBe(8);
});
test('Return 12 when there are 12 drafts (1 xToOne & 2 xToMany on ct, compo, comporep, dz)', async () => {
const publishedId = categories.published[0].entryId;
const draft1Id = categories.draft[0].entryId;
const draft2Id = categories.draft[1].entryId;
const { body: product } = await rq({
method: 'POST',
url: '/content-manager/collection-types/api::product.product',
body: {
name: 'Pizza',
onecategory: categories.draft[0].entryId,
categories: [publishedId],
categories: [draft1Id, draft2Id],
compo: {
onecategory: draft1Id,
categories: [publishedId],
categories: [draft1Id, draft2Id],
},
comporep: [
{
onecategory: draft1Id,
categories: [publishedId],
categories: [draft1Id, draft2Id],
},
],
dz: [
{
onecategory: draft1Id,
__component: 'default.compo',
categories: [publishedId],
categories: [draft1Id, draft2Id],
},
],
},
});
const { body } = await rq({
method: 'GET',
url: `/content-manager/collection-types/api::product.product/${product.id}/actions/countDraftRelations`,
});
expect(body.data).toBe(12);
});
test('Return 8 when there are 8 drafts in a non default locale', async () => {
const localeQuery = `plugins[i18n][locale]=${locale}`;
// Create categories in a non default locale
const {
body: { id: idToPublish },
} = await rq({
method: 'POST',
url: `/content-manager/collection-types/api::category.category?${localeQuery}`,
body: { name: 'Nourriture' },
});
const { body: categoryPublished } = await rq({
method: 'POST',
url: `/content-manager/collection-types/api::category.category/${idToPublish}/actions/publish?${localeQuery}`,
});
const { body: categoryDraft } = await rq({
method: 'POST',
url: `/content-manager/collection-types/api::category.category?${localeQuery}`,
body: { name: 'Nourriture' },
});
const publishedId = categoryPublished.entryId;
const draftId = categoryDraft.entryId;
// Create a product in a non default locale
const { body: localisedProduct } = await rq({
method: 'POST',
url: `/content-manager/collection-types/api::product.product?${localeQuery}`,
body: {
name: 'PizzaFR',
onecategory: draftId,
categories: [publishedId],
categories: [draftId],
compo: {
onecategory: draftId,
categories: [publishedId],
categories: [draftId],
},
comporep: [
{
onecategory: draftId,
categories: [publishedId],
categories: [draftId],
},
],
dz: [
{
onecategory: draftId,
__component: 'default.compo',
categories: [publishedId],
categories: [draftId],
},
],
},
});
// Ensure we can count the number of draft relations when the entry is in a non default locale
const { body } = await rq({
method: 'GET',
url: `/content-manager/collection-types/api::product.product/${localisedProduct.id}/actions/countDraftRelations?locale=${locale}`,
});
expect(body.data).toBe(8);
});
});