From 1d87a6dc52fcde2d9ed59e7a0af6a60851848a5d Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 21 Feb 2022 12:15:00 +0100 Subject: [PATCH 1/3] CM: Add e2e tests for layout updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pierre Noël --- .../content-manager/content-types.test.e2e.js | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js diff --git a/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js b/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js new file mode 100644 index 0000000000..56d5192562 --- /dev/null +++ b/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js @@ -0,0 +1,155 @@ +'use strict'; + +// Helpers. +const { createTestBuilder } = require('../../../../../../test/helpers/builder'); +const { createStrapiInstance } = require('../../../../../../test/helpers/strapi'); +const form = require('../../../../../../test/helpers/generators'); +const { createAuthRequest } = require('../../../../../../test/helpers/request'); + +const builder = createTestBuilder(); +let strapi; +let rq; + +const restart = async () => { + await strapi.destroy(); + strapi = await createStrapiInstance(); + rq = await createAuthRequest({ strapi }); +}; + +const FIXTURE_DEFAULT_LAYOUT = [ + [ + { + name: 'title', + size: 6, + }, + { + name: 'date', + size: 4, + }, + ], + [ + { + name: 'jsonField', + size: 12, + }, + ], + [ + { + name: 'content', + size: 12, + }, + ], +]; + +describe('Content Manager - Update Layout', () => { + beforeAll(async () => { + await builder.addContentTypes([form.article]).build(); + + strapi = await createStrapiInstance(); + rq = await createAuthRequest({ strapi }); + }); + + afterAll(async () => { + await strapi.destroy(); + await builder.cleanup(); + }); + + test('Fetch default layout', async () => { + const { body } = await rq({ + url: '/content-manager/content-types/api::article.article/configuration', + method: 'GET', + }); + + expect(body.data.contentType.layouts.edit).toStrictEqual(FIXTURE_DEFAULT_LAYOUT); + }); + + test('Update field size', async () => { + const payload = [...FIXTURE_DEFAULT_LAYOUT]; + payload[0][0].size = 12; + + await rq({ + url: '/content-manager/content-types/api::article.article/configuration', + method: 'PUT', + body: { + layouts: { + edit: payload, + editRelations: [], + list: [], + }, + }, + }); + + const { body } = await rq({ + url: '/content-manager/content-types/api::article.article/configuration', + method: 'GET', + }); + + expect(body.data.contentType.layouts.edit[0][0].size).toBe(12); + }); + + test('Update field size with server restart and invalid JSON size', async () => { + const payload = [...FIXTURE_DEFAULT_LAYOUT]; + payload[0][0].size = 8; // title + payload[0][1].size = 4; // date + payload[1][0].size = 6; // jsonField + + await rq({ + url: '/content-manager/content-types/api::article.article/configuration', + method: 'PUT', + body: { + layouts: { + edit: payload, + editRelations: [], + list: [], + }, + }, + }); + + await restart(); + + const { body } = await rq({ + url: '/content-manager/content-types/api::article.article/configuration', + method: 'GET', + }); + + expect(body.data.contentType.layouts.edit[0][0].name).toBe('title'); + expect(body.data.contentType.layouts.edit[0][0].size).toBe(8); + + expect(body.data.contentType.layouts.edit[0][1].name).toBe('date'); + expect(body.data.contentType.layouts.edit[0][1].size).toBe(4); + + expect(body.data.contentType.layouts.edit[2][0].name).toBe('jsonField'); + expect(body.data.contentType.layouts.edit[2][0].size).toBe(12); + }); + + test('Update field size with server restart and invalid date size', async () => { + const payload = [...FIXTURE_DEFAULT_LAYOUT]; + payload[0][0].size = 12; // title + payload[0][1].size = 14; // date + + await rq({ + url: '/content-manager/content-types/api::article.article/configuration', + method: 'PUT', + body: { + layouts: { + edit: payload, + editRelations: [], + list: [], + }, + }, + }); + + await restart(); + + const { body } = await rq({ + url: '/content-manager/content-types/api::article.article/configuration', + method: 'GET', + }); + + expect(body.data.contentType.layouts.edit[0][0].name).toBe('title'); + expect(body.data.contentType.layouts.edit[0][0].size).toBe(12); + + expect(body.data.contentType.layouts.edit[2][0].name).toBe('date'); + expect(body.data.contentType.layouts.edit[2][0].size).toBe(4); + }); +}); From 28a526b0a64efb431a31b7fb3c36d8e91e9c14ab Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Tue, 22 Feb 2022 12:47:09 +0100 Subject: [PATCH 2/3] Refactor test to be more readable and compare the whole layout --- .../content-manager/content-types.test.e2e.js | 138 +++++++++++++++--- 1 file changed, 118 insertions(+), 20 deletions(-) diff --git a/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js b/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js index 56d5192562..8496799fa0 100644 --- a/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js +++ b/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js @@ -1,5 +1,8 @@ 'use strict'; +const cloneDeep = require('lodash/cloneDeep'); +const merge = require('lodash/merge'); + // Helpers. const { createTestBuilder } = require('../../../../../../test/helpers/builder'); const { createStrapiInstance } = require('../../../../../../test/helpers/strapi'); @@ -16,6 +19,14 @@ const restart = async () => { rq = await createAuthRequest({ strapi }); }; +const transformLayout = (layout, partialNewLayout) => { + return partialNewLayout.reduce((acc, row, rowIndex) => { + acc[rowIndex] = row.map((column, columnIndex) => merge(acc[rowIndex][columnIndex], column)); + + return acc; + }, layout); +}; + const FIXTURE_DEFAULT_LAYOUT = [ [ { @@ -64,8 +75,20 @@ describe('Content Manager - Update Layout', () => { }); test('Update field size', async () => { - const payload = [...FIXTURE_DEFAULT_LAYOUT]; - payload[0][0].size = 12; + const transformation = [ + [ + { + name: 'title', + size: 8, + }, + + { + name: 'date', + size: 4, + }, + ], + ]; + const payload = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); await rq({ url: '/content-manager/content-types/api::article.article/configuration', @@ -84,14 +107,33 @@ describe('Content Manager - Update Layout', () => { method: 'GET', }); - expect(body.data.contentType.layouts.edit[0][0].size).toBe(12); + const expectation = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); + + expect(body.data.contentType.layouts.edit).toStrictEqual(expectation); }); test('Update field size with server restart and invalid JSON size', async () => { - const payload = [...FIXTURE_DEFAULT_LAYOUT]; - payload[0][0].size = 8; // title - payload[0][1].size = 4; // date - payload[1][0].size = 6; // jsonField + const transformation = [ + [ + { + name: 'title', + size: 8, + }, + + { + name: 'date', + size: 4, + }, + ], + + [ + { + name: 'jsonField', + size: 6, + }, + ], + ]; + const payload = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); await rq({ url: '/content-manager/content-types/api::article.article/configuration', @@ -112,20 +154,52 @@ describe('Content Manager - Update Layout', () => { method: 'GET', }); - expect(body.data.contentType.layouts.edit[0][0].name).toBe('title'); - expect(body.data.contentType.layouts.edit[0][0].size).toBe(8); + const expectation = [ + [ + { + name: 'title', + size: 8, + }, - expect(body.data.contentType.layouts.edit[0][1].name).toBe('date'); - expect(body.data.contentType.layouts.edit[0][1].size).toBe(4); + { + name: 'date', + size: 4, + }, + ], - expect(body.data.contentType.layouts.edit[2][0].name).toBe('jsonField'); - expect(body.data.contentType.layouts.edit[2][0].size).toBe(12); + [ + { + name: 'content', + size: 12, + }, + ], + + [ + { + name: 'jsonField', + size: 12, + }, + ], + ]; + + expect(body.data.contentType.layouts.edit).toStrictEqual(expectation); }); test('Update field size with server restart and invalid date size', async () => { - const payload = [...FIXTURE_DEFAULT_LAYOUT]; - payload[0][0].size = 12; // title - payload[0][1].size = 14; // date + const transformation = [ + [ + { + name: 'title', + size: 12, + }, + + { + name: 'date', + size: 14, + }, + ], + ]; + const payload = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); await rq({ url: '/content-manager/content-types/api::article.article/configuration', @@ -146,10 +220,34 @@ describe('Content Manager - Update Layout', () => { method: 'GET', }); - expect(body.data.contentType.layouts.edit[0][0].name).toBe('title'); - expect(body.data.contentType.layouts.edit[0][0].size).toBe(12); + const expectation = [ + [ + { + name: 'title', + size: 12, + }, + ], + [ + { + name: 'jsonField', + size: 12, + }, + ], + [ + { + name: 'content', + size: 12, + }, + ], - expect(body.data.contentType.layouts.edit[2][0].name).toBe('date'); - expect(body.data.contentType.layouts.edit[2][0].size).toBe(4); + [ + { + name: 'date', + size: 4, + }, + ], + ]; + + expect(body.data.contentType.layouts.edit).toStrictEqual(expectation); }); }); From f136552d8d118b1e6b8d3ef36aaec2b567cfea8e Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Wed, 23 Feb 2022 13:20:38 +0100 Subject: [PATCH 3/3] Refactor test to utilize lodash.merge --- .../content-manager/content-types.test.e2e.js | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js b/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js index 8496799fa0..f70bf7e9dd 100644 --- a/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js +++ b/packages/core/content-manager/server/tests/content-manager/content-types.test.e2e.js @@ -1,6 +1,5 @@ 'use strict'; -const cloneDeep = require('lodash/cloneDeep'); const merge = require('lodash/merge'); // Helpers. @@ -19,14 +18,6 @@ const restart = async () => { rq = await createAuthRequest({ strapi }); }; -const transformLayout = (layout, partialNewLayout) => { - return partialNewLayout.reduce((acc, row, rowIndex) => { - acc[rowIndex] = row.map((column, columnIndex) => merge(acc[rowIndex][columnIndex], column)); - - return acc; - }, layout); -}; - const FIXTURE_DEFAULT_LAYOUT = [ [ { @@ -88,7 +79,7 @@ describe('Content Manager - Update Layout', () => { }, ], ]; - const payload = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); + const payload = merge([], FIXTURE_DEFAULT_LAYOUT, transformation); await rq({ url: '/content-manager/content-types/api::article.article/configuration', @@ -107,7 +98,7 @@ describe('Content Manager - Update Layout', () => { method: 'GET', }); - const expectation = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); + const expectation = merge([], FIXTURE_DEFAULT_LAYOUT, transformation); expect(body.data.contentType.layouts.edit).toStrictEqual(expectation); }); @@ -133,7 +124,7 @@ describe('Content Manager - Update Layout', () => { }, ], ]; - const payload = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); + const payload = merge([], FIXTURE_DEFAULT_LAYOUT, transformation); await rq({ url: '/content-manager/content-types/api::article.article/configuration', @@ -199,7 +190,7 @@ describe('Content Manager - Update Layout', () => { }, ], ]; - const payload = transformLayout(cloneDeep(FIXTURE_DEFAULT_LAYOUT), transformation); + const payload = merge([], FIXTURE_DEFAULT_LAYOUT, transformation); await rq({ url: '/content-manager/content-types/api::article.article/configuration',