451 lines
10 KiB
JavaScript
Raw Normal View History

'use strict';
2021-04-29 11:11:46 +02:00
const { createTestBuilder } = require('../../../../../test/helpers/builder');
const { createStrapiInstance } = require('../../../../../test/helpers/strapi');
const { createAuthRequest } = require('../../../../../test/helpers/request');
2019-12-12 10:15:25 +01:00
let strapi;
2019-12-12 10:15:25 +01:00
let rq;
2019-12-12 14:34:18 +01:00
const defaultBody = {
field: [
{
__component: 'default.simple-compo',
name: 'someString',
},
{
__component: 'default.compo-with-other-compo',
compo: {
name: 'someString',
},
},
],
};
const models = {
ct: {
name: 'withdynamiczone',
attributes: {
field: {
type: 'dynamiczone',
components: ['default.compo-with-other-compo', 'default.simple-compo'],
required: false,
min: 2,
max: 5,
},
},
},
simpleCompo: {
name: 'simple-compo',
attributes: {
name: {
type: 'string',
},
},
},
otherCompo: {
name: 'compo-with-other-compo',
attributes: {
compo: {
type: 'component',
component: 'default.simple-compo',
},
},
},
};
2019-12-12 14:34:18 +01:00
const createEntry = () => {
return rq({
method: 'POST',
url: '/',
2019-12-12 14:34:18 +01:00
body: defaultBody,
});
};
const createEmpty = () => {
return rq({
method: 'POST',
url: '/',
2019-12-12 14:34:18 +01:00
body: {
field: [],
},
});
};
2019-12-12 10:15:25 +01:00
describe.each([
2021-08-06 18:09:49 +02:00
['CONTENT MANAGER', '/content-manager/collection-types/api::withdynamiczone.withdynamiczone'],
2019-12-12 10:15:25 +01:00
['GENERATED API', '/withdynamiczones'],
])('[%s] => Not required dynamiczone', (_, path) => {
const builder = createTestBuilder();
const hasPagination = path.includes('/content-manager');
2019-12-12 10:15:25 +01:00
beforeAll(async () => {
await builder
.addComponent(models.simpleCompo)
.addComponent(models.otherCompo)
.addContentType(models.ct)
.build();
strapi = await createStrapiInstance();
rq = await createAuthRequest({ strapi });
rq.setURLPrefix(path);
});
2019-12-12 10:15:25 +01:00
afterAll(async () => {
await strapi.destroy();
await builder.cleanup();
});
2019-12-12 10:15:25 +01:00
describe('Creation', () => {
test('Can create an entry with a dynamic zone and a nested compo', async () => {
const res = await rq({
method: 'POST',
url: '/',
2019-12-12 10:15:25 +01:00
body: {
field: [
{
__component: 'default.simple-compo',
name: 'someString',
},
{
__component: 'default.compo-with-other-compo',
compo: {
name: 'someString',
},
},
],
},
qs: {
populate: ['field'],
},
2019-12-12 10:15:25 +01:00
});
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body.field)).toBe(true);
expect(res.body).toMatchObject({
field: [
{
id: expect.anything(),
__component: 'default.simple-compo',
name: 'someString',
},
{
id: expect.anything(),
__component: 'default.compo-with-other-compo',
compo: {
id: expect.anything(),
name: 'someString',
},
},
],
});
});
test('Can create entry with empty dynamiczone if it is not required', async () => {
const res = await rq({
method: 'POST',
url: '/',
2019-12-12 10:15:25 +01:00
body: {
field: [],
},
qs: {
populate: ['field'],
},
2019-12-12 10:15:25 +01:00
});
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body.field)).toBe(true);
expect(res.body.field.length).toBe(0);
});
test('Throw if min items is not respected', async () => {
const res = await rq({
method: 'POST',
url: '/',
2019-12-12 10:15:25 +01:00
body: {
field: [
{
__component: 'default.simple-compo',
name: 'someString',
},
],
},
});
expect(res.statusCode).toBe(400);
});
test('Throws if max items is not respected', async () => {
const res = await rq({
method: 'POST',
url: '/',
2019-12-12 10:15:25 +01:00
body: {
field: Array(10).fill({
__component: 'default.simple-compo',
name: 'someString',
}),
},
});
expect(res.statusCode).toBe(400);
});
});
describe('Getting one entry', () => {
test('The entry has its dynamic zone populated', async () => {
2019-12-12 14:58:39 +01:00
const createRes = await createEntry();
const entryId = createRes.body.id;
2019-12-12 10:15:25 +01:00
const res = await rq({
method: 'GET',
url: `/${entryId}`,
qs: {
populate: ['field'],
},
});
2019-12-12 10:15:25 +01:00
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body.field)).toBe(true);
expect(res.body).toMatchObject({
field: [
{
id: expect.anything(),
__component: 'default.simple-compo',
name: 'someString',
},
{
id: expect.anything(),
__component: 'default.compo-with-other-compo',
compo: {
id: expect.anything(),
name: 'someString',
},
},
],
});
});
});
describe('Listing entries', () => {
2019-12-12 14:07:48 +01:00
test('The entries have their dynamic zones populated', async () => {
const res = await rq({
method: 'GET',
url: '/',
qs: {
populate: ['field'],
},
});
2019-12-12 14:07:48 +01:00
expect(res.statusCode).toBe(200);
if (hasPagination) {
expect(res.body.pagination).toBeDefined();
expect(Array.isArray(res.body.results)).toBe(true);
expect(res.body.results).toEqual(
expect.arrayContaining([
expect.objectContaining({
field: expect.arrayContaining([
expect.objectContaining({
id: expect.anything(),
__component: expect.any(String),
}),
]),
}),
])
);
return;
}
2019-12-12 14:07:48 +01:00
expect(Array.isArray(res.body)).toBe(true);
expect(res.body).toEqual(
expect.arrayContaining([
expect.objectContaining({
field: expect.arrayContaining([
expect.objectContaining({
id: expect.anything(),
__component: expect.any(String),
}),
]),
}),
])
);
});
2019-12-12 10:15:25 +01:00
});
describe('Edition', () => {
2019-12-12 14:34:18 +01:00
test('Can empty non required dynamic zone', async () => {
2019-12-12 14:58:39 +01:00
const createRes = await createEntry();
2019-12-12 14:34:18 +01:00
2019-12-12 14:58:39 +01:00
expect(createRes.statusCode).toBe(200);
const entryId = createRes.body.id;
2019-12-12 14:34:18 +01:00
const res = await rq({
method: 'PUT',
url: `/${entryId}`,
2019-12-12 14:34:18 +01:00
body: {
field: [],
},
qs: {
populate: ['field'],
},
2019-12-12 14:34:18 +01:00
});
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body.field)).toBe(true);
expect(res.body.field).toEqual([]);
});
test('Can add items to empty dynamic zone', async () => {
2019-12-12 14:58:39 +01:00
const createRes = await createEmpty();
2019-12-12 14:34:18 +01:00
2019-12-12 14:58:39 +01:00
expect(createRes.statusCode).toBe(200);
const entryId = createRes.body.id;
2019-12-12 14:34:18 +01:00
const res = await rq({
method: 'PUT',
url: `/${entryId}`,
2019-12-12 14:34:18 +01:00
body: defaultBody,
qs: {
populate: ['field'],
},
2019-12-12 14:34:18 +01:00
});
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body.field)).toBe(true);
expect(res.body).toMatchObject({
field: [
{
id: expect.anything(),
__component: 'default.simple-compo',
name: 'someString',
},
{
id: expect.anything(),
__component: 'default.compo-with-other-compo',
compo: {
id: expect.anything(),
name: 'someString',
},
},
],
});
});
test('Can remove items from dynamic zone', async () => {
2019-12-12 14:58:39 +01:00
const createRes = await createEntry();
2019-12-12 14:34:18 +01:00
2019-12-12 14:58:39 +01:00
expect(createRes.statusCode).toBe(200);
const entryId = createRes.body.id;
2019-12-12 14:34:18 +01:00
const res = await rq({
method: 'PUT',
url: `/${entryId}`,
2019-12-12 14:34:18 +01:00
body: {
field: [
{
__component: 'default.simple-compo',
name: 'otherString',
},
{
__component: 'default.simple-compo',
name: 'secondString',
},
],
},
qs: {
populate: ['field'],
},
2019-12-12 14:34:18 +01:00
});
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body.field)).toBe(true);
expect(res.body).toMatchObject({
field: [
{
id: expect.anything(),
__component: 'default.simple-compo',
name: 'otherString',
},
{
id: expect.anything(),
__component: 'default.simple-compo',
name: 'secondString',
},
],
});
});
test('Respects min items', async () => {
2019-12-12 14:58:39 +01:00
const createRes = await createEntry();
2019-12-12 14:34:18 +01:00
2019-12-12 14:58:39 +01:00
expect(createRes.statusCode).toBe(200);
const entryId = createRes.body.id;
2019-12-12 14:34:18 +01:00
const res = await rq({
method: 'PUT',
url: `/${entryId}`,
2019-12-12 14:34:18 +01:00
body: {
field: [
{
__component: 'default.simple-compo',
name: 'otherString',
},
],
},
});
expect(res.statusCode).toBe(400);
});
test('Respects max items', async () => {
2019-12-12 14:58:39 +01:00
const createRes = await createEntry();
2019-12-12 14:34:18 +01:00
2019-12-12 14:58:39 +01:00
expect(createRes.statusCode).toBe(200);
const entryId = createRes.body.id;
2019-12-12 14:34:18 +01:00
const res = await rq({
method: 'PUT',
url: `/${entryId}`,
2019-12-12 14:34:18 +01:00
body: {
field: Array(10).fill({
__component: 'default.simple-compo',
name: 'otherString',
}),
},
});
expect(res.statusCode).toBe(400);
});
2019-12-12 10:15:25 +01:00
});
describe('Deletion', () => {
2019-12-12 14:58:39 +01:00
test('Returns the entry with its paths populated', async () => {
const createRes = await createEntry();
expect(createRes.statusCode).toBe(200);
const entryId = createRes.body.id;
const res = await rq({
method: 'DELETE',
url: `/${entryId}`,
qs: {
populate: ['field'],
},
});
2019-12-12 14:58:39 +01:00
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body.field)).toBe(true);
expect(res.body).toEqual(
expect.objectContaining({
field: expect.arrayContaining([
expect.objectContaining({
id: expect.anything(),
__component: expect.any(String),
}),
]),
})
);
});
2019-12-12 10:15:25 +01:00
});
});