mirror of
https://github.com/strapi/strapi.git
synced 2025-07-20 07:27:06 +00:00

* 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>
397 lines
10 KiB
JavaScript
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);
|
|
});
|
|
});
|