From 96b023d16b10fb2c5b4f934eb45c240d2d2dd2e3 Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Sat, 9 Mar 2019 01:06:39 +0100 Subject: [PATCH] Restructure tests --- jest.config.e2e.js | 4 +- package.json | 2 +- .../test/endpoint.test.e2e.js | 720 +++++++++++++++ .../strapi-generate-api/test/endpoint.test.js | 712 --------------- .../test/index.test.e2e.js | 771 ++++++++++++++++ .../test/index.test.js | 824 ------------------ test/e2e.js | 9 +- test/globalSetup.js | 15 - test/helpers/auth.js | 22 +- test/helpers/request.js | 2 +- test/helpers/restart.js | 34 +- 11 files changed, 1524 insertions(+), 1591 deletions(-) create mode 100644 packages/strapi-generate-api/test/endpoint.test.e2e.js delete mode 100644 packages/strapi-generate-api/test/endpoint.test.js create mode 100644 packages/strapi-plugin-content-manager/test/index.test.e2e.js delete mode 100644 packages/strapi-plugin-content-manager/test/index.test.js delete mode 100644 test/globalSetup.js diff --git a/jest.config.e2e.js b/jest.config.e2e.js index 6a8f5a9bb1..826635ffd5 100644 --- a/jest.config.e2e.js +++ b/jest.config.e2e.js @@ -1,9 +1,9 @@ module.exports = { name: 'setup', displayName: 'Setup', - testMatch: ['**/test/?(*.)+(spec|test).js'], + testMatch: ['**/test/?(*.)+(spec|test).e2e.js'], testEnvironment: 'node', - globalSetup: '/test/globalSetup.js', + // globalSetup: '/test/globalSetup.js', coveragePathIgnorePatterns: [ '/dist/', '/node_modules/', diff --git a/package.json b/package.json index 91872fe38c..b64b7db3a3 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "test": "snyk test && node ./test/start.js", "prettier": "node ./packages/strapi-lint/lib/internals/prettier/index.js", "snyk": "node ./scripts/snyk.js", - "test:e2e": "jest --config jest.config.e2e.js --runInBand --verbose --forceExit packages/strapi-generate-api" + "test:e2e": "jest --config jest.config.e2e.js --runInBand --verbose --forceExit --detectOpenHandles --no-cache" }, "author": { "email": "hi@strapi.io", diff --git a/packages/strapi-generate-api/test/endpoint.test.e2e.js b/packages/strapi-generate-api/test/endpoint.test.e2e.js new file mode 100644 index 0000000000..22b26d1ead --- /dev/null +++ b/packages/strapi-generate-api/test/endpoint.test.e2e.js @@ -0,0 +1,720 @@ +// Helpers. +const { auth, login } = require('../../../test/helpers/auth'); +const form = require('../../../test/helpers/generators'); +const restart = require('../../../test/helpers/restart'); +const createRequest = require('../../../test/helpers/request'); + +const cleanDate = entry => { + delete entry.updatedAt; + delete entry.createdAt; + delete entry.created_at; + delete entry.updated_at; +}; + +let data; +let rq; +jest.setTimeout(30000); + +describe('Create Strapi API End to End', () => { + beforeAll(async () => { + await createRequest()({ + url: '/auth/local/register', + method: 'POST', + body: auth, + }).catch(() => {}); + + const body = await login(); + + rq = createRequest({ + headers: { + Authorization: `Bearer ${body.jwt}`, + }, + }); + }); + + afterAll(() => new Promise(resolve, setTimeout(resolve, 5000))); + + describe('Generate test APIs', () => { + beforeEach(() => restart(), 60000); + + test('Create new article API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.article, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new tag API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.tag, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new category API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.category, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new reference API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.reference, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new product API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.product, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + }); + + describe('Test manyToMany relation (article - tag) with Content Manager', () => { + beforeAll(async () => { + await restart(); + + data = { + articles: [], + tags: [], + }; + }); + + test('Create tag1', async () => { + const { body } = await rq({ + url: '/tags', + method: 'POST', + body: { + name: 'tag1', + }, + }); + + data.tags.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('tag1'); + }); + + test('Create tag2', async () => { + const { body } = await rq({ + url: '/tags', + method: 'POST', + body: { + name: 'tag2', + }, + }); + + data.tags.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('tag2'); + }); + + test('Create tag3', async () => { + const { body } = await rq({ + url: '/tags', + method: 'POST', + body: { + name: 'tag3', + }, + }); + + data.tags.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('tag3'); + }); + + test('Create article1 without relation', async () => { + const entry = { + title: 'Article 1', + content: 'My super content 1', + }; + + const { body } = await rq({ + url: '/articles', + method: 'POST', + body: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(0); + }); + + test('Create article2 with tag1', async () => { + const entry = { + title: 'Article 2', + content: 'Content 2', + tags: [data.tags[0]], + }; + + const { body } = await rq({ + url: '/articles', + method: 'POST', + body: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(1); + expect(body.tags[0].id).toBe(data.tags[0].id); + }); + + test('Update article1 add tag2', async () => { + const entry = Object.assign({}, data.articles[0], { + tags: [data.tags[1]], + }); + + cleanDate(entry); + + const { body } = await rq({ + url: `/articles/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(1); + expect(body.tags[0].id).toBe(data.tags[1].id); + }); + + test('Update article1 add tag1 and tag3', async () => { + const entry = Object.assign({}, data.articles[0]); + entry.tags.push(data.tags[0]); + entry.tags.push(data.tags[2]); + + cleanDate(entry); + + const { body } = await rq({ + url: `/articles/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(3); + }); + + test('Update article1 remove one tag', async () => { + const entry = Object.assign({}, data.articles[0]); + entry.tags = entry.tags.slice(1); + + cleanDate(entry); + + const { body } = await rq({ + url: `/articles/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(2); + }); + + test('Update article1 remove all tag', async () => { + const entry = Object.assign({}, data.articles[0], { + tags: [], + }); + + cleanDate(entry); + + const { body } = await rq({ + url: `/articles/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(0); + }); + }); + + describe('Test oneToMany - manyToOne relation (article - category) with Content Manager', () => { + beforeAll(() => { + data = { + articles: [], + categories: [], + }; + }); + + test('Create cat1', async () => { + const { body } = await rq({ + url: '/categories', + method: 'POST', + body: { + name: 'cat1', + }, + }); + + data.categories.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('cat1'); + }); + + test('Create cat2', async () => { + const { body } = await rq({ + url: '/categories', + method: 'POST', + body: { + name: 'cat2', + }, + }); + + data.categories.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('cat2'); + }); + + test('Create article1 with cat1', async () => { + const entry = { + title: 'Article 1', + content: 'Content 1', + category: data.categories[0], + }; + + const { body } = await rq({ + url: '/articles', + method: 'POST', + body: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.category.name).toBe(entry.category.name); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Update article1 with cat2', async () => { + const entry = Object.assign({}, data.articles[0], { + category: data.categories[1], + }); + + cleanDate(entry); + + const { body } = await rq({ + url: `/articles/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.category.name).toBe(entry.category.name); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Create article2', async () => { + const entry = { + title: 'Article 2', + content: 'Content 2', + }; + + const { body } = await rq({ + url: '/articles', + method: 'POST', + body: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Update article2 with cat2', async () => { + const entry = Object.assign({}, data.articles[1], { + category: data.categories[1], + }); + + cleanDate(entry); + + const { body } = await rq({ + url: `/articles/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.articles[1] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.category.name).toBe(entry.category.name); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Update cat1 with article1', async () => { + const entry = Object.assign({}, data.categories[0]); + entry.articles.push(data.articles[0]); + + cleanDate(entry); + + const { body } = await rq({ + url: `/categories/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.categories[0] = body; + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.articles.length).toBe(1); + expect(body.name).toBe(entry.name); + }); + + test('Create cat3 with article1', async () => { + const entry = { + name: 'cat3', + articles: [data.articles[0]], + }; + + const { body } = await rq({ + url: '/categories', + method: 'POST', + body: entry, + }); + + data.categories.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.articles.length).toBe(1); + expect(body.name).toBe(entry.name); + }); + + test('Get article1 with cat3', async () => { + const { body } = await rq({ + url: `/articles/${data.articles[0].id}`, + method: 'GET', + }); + + expect(body.id); + expect(body.category.id).toBe(data.categories[2].id); + }); + + test('Get article2 with cat2', async () => { + const { body } = await rq({ + url: `/articles/${data.articles[1].id}`, + method: 'GET', + }); + + expect(body.id); + expect(body.category.id).toBe(data.categories[1].id); + }); + + test('Get cat1 without relations', async () => { + const { body } = await rq({ + url: `/categories/${data.categories[0].id}`, + method: 'GET', + }); + + expect(body.id); + expect(body.articles.length).toBe(0); + }); + + test('Get cat2 with article2', async () => { + const { body } = await rq({ + url: `/categories/${data.categories[1].id}`, + method: 'GET', + }); + + expect(body.id); + expect(body.articles.length).toBe(1); + expect(body.articles[0].id).toBe(data.articles[1].id); + }); + + test('Get cat3 with article1', async () => { + const { body } = await rq({ + url: `/categories/${data.categories[2].id}`, + method: 'GET', + }); + + expect(body.id); + expect(body.articles.length).toBe(1); + expect(body.articles[0].id).toBe(data.articles[0].id); + }); + }); + + describe('Test oneToOne relation (article - reference) with Content Manager', () => { + beforeAll(() => { + data = { + articles: [], + references: [], + }; + }); + + test('Create ref1', async () => { + const { body } = await rq({ + url: '/references', + method: 'POST', + body: { + name: 'ref1', + }, + }); + + data.references.push(body); + + expect(body.id); + expect(body.name).toBe('ref1'); + }); + + test('Create article1', async () => { + const entry = { + title: 'Article 1', + content: 'Content 1', + }; + + const { body } = await rq({ + url: '/articles', + method: 'POST', + body: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + }); + + test('Update article1 with ref1', async () => { + const entry = Object.assign({}, data.articles[0], { + reference: data.references[0].id, + }); + + cleanDate(entry); + + const { body } = await rq({ + url: `/articles/${entry.id}`, + method: 'PUT', + body: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.reference.id).toBe(entry.reference); + }); + + test('Create article2 with ref1', async () => { + const entry = { + title: 'Article 2', + content: 'Content 2', + reference: data.references[0].id, + }; + + const { body } = await rq({ + url: '/articles', + method: 'POST', + body: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.reference.id).toBe(entry.reference); + }); + }); + + describe('Test oneWay relation (reference - tag) with Content Manager', () => { + test('Attach Tag to a Reference', async () => { + await rq({ + url: '/tags', + method: 'POST', + body: { + name: 'tag111', + }, + }).then(({ body: tagToCreate }) => { + return rq({ + url: '/references', + method: 'POST', + body: { + name: 'cat111', + tag: tagToCreate, + }, + }).then(({ body }) => { + expect(body.tag.id).toBe(tagToCreate.id); + }); + }); + }); + + test('Detach Tag to a Reference', async () => { + const { body: tagToCreate } = await rq({ + url: '/tags', + method: 'POST', + body: { + name: 'tag111', + }, + }); + + const { body: referenceToCreate } = await rq({ + url: '/references', + method: 'POST', + body: { + name: 'cat111', + tag: tagToCreate, + }, + }); + + expect(referenceToCreate.tag.id).toBe(tagToCreate.id); + + const { body: referenceToUpdate } = await rq({ + url: `/references/${referenceToCreate.id}`, + method: 'PUT', + body: { + tag: null, + }, + }); + + expect(referenceToUpdate.tag).toBe(null); + }); + + test('Delete Tag so the relation in the Reference side should be removed', async () => { + const { body: tagToCreate } = await rq({ + url: '/tags', + method: 'POST', + body: { + name: 'tag111', + }, + }); + + const { body: referenceToCreate } = await rq({ + url: '/references', + method: 'POST', + body: { + name: 'cat111', + tag: tagToCreate, + }, + }); + + await rq({ + url: `/tags/${tagToCreate.id}`, + method: 'DELETE', + }); + + const { body: referenceToGet } = await rq({ + url: `/references/${referenceToCreate.id}`, + method: 'GET', + }); + + if (Object.keys(referenceToGet.tag).length == 0) return; + expect(referenceToGet.tag).toBe(null); + }); + }); + + describe('Delete test APIs', () => { + beforeEach(() => restart(), 60000); + + test('Delete article API', async () => { + await rq({ + url: '/content-type-builder/models/article', + method: 'DELETE', + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Delete tag API', async () => { + await rq({ + url: '/content-type-builder/models/tag', + method: 'DELETE', + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Delete category API', async () => { + await rq({ + url: '/content-type-builder/models/category', + method: 'DELETE', + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Delete reference API', async () => { + await rq({ + url: '/content-type-builder/models/reference', + method: 'DELETE', + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Delete product API', async () => { + await rq({ + url: '/content-type-builder/models/product', + method: 'DELETE', + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + }); +}); diff --git a/packages/strapi-generate-api/test/endpoint.test.js b/packages/strapi-generate-api/test/endpoint.test.js deleted file mode 100644 index 087efb432b..0000000000 --- a/packages/strapi-generate-api/test/endpoint.test.js +++ /dev/null @@ -1,712 +0,0 @@ -// Helpers. -const { login } = require('../../../test/helpers/auth'); -const form = require('../../../test/helpers/generators'); -const restart = require('../../../test/helpers/restart'); -const createRequest = require('../../../test/helpers/request'); - -const cleanDate = entry => { - delete entry.updatedAt; - delete entry.createdAt; - delete entry.created_at; - delete entry.updated_at; -}; - -let data; - -let rq; - -jest.setTimeout(30000); - -beforeAll(async () => { - const body = await login(); - - rq = createRequest({ - headers: { - Authorization: `Bearer ${body.jwt}`, - }, - }); -}); - -describe('Generate test APIs', () => { - beforeEach(() => restart(), 60000); - - test('Create new article API', () => { - return rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.article, - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Create new tag API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.tag, - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Create new category API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.category, - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Create new reference API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.reference, - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Create new product API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.product, - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); -}); - -describe('Test manyToMany relation (article - tag) with Content Manager', () => { - beforeAll(async () => { - await restart(); - - data = { - articles: [], - tags: [], - }; - }); - - test('Create tag1', async () => { - const { body } = await rq({ - url: '/tags', - method: 'POST', - body: { - name: 'tag1', - }, - }); - - data.tags.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('tag1'); - }); - - test('Create tag2', async () => { - const { body } = await rq({ - url: '/tags', - method: 'POST', - body: { - name: 'tag2', - }, - }); - - data.tags.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('tag2'); - }); - - test('Create tag3', async () => { - const { body } = await rq({ - url: '/tags', - method: 'POST', - body: { - name: 'tag3', - }, - }); - - data.tags.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('tag3'); - }); - - test('Create article1 without relation', async () => { - const entry = { - title: 'Article 1', - content: 'My super content 1', - }; - - const { body } = await rq({ - url: '/articles', - method: 'POST', - body: entry, - }); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(0); - }); - - test('Create article2 with tag1', async () => { - const entry = { - title: 'Article 2', - content: 'Content 2', - tags: [data.tags[0]], - }; - - const { body } = await rq({ - url: '/articles', - method: 'POST', - body: entry, - }); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(1); - expect(body.tags[0].id).toBe(data.tags[0].id); - }); - - test('Update article1 add tag2', async () => { - const entry = Object.assign({}, data.articles[0], { - tags: [data.tags[1]], - }); - - cleanDate(entry); - - const { body } = await rq({ - url: `/articles/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(1); - expect(body.tags[0].id).toBe(data.tags[1].id); - }); - - test('Update article1 add tag1 and tag3', async () => { - const entry = Object.assign({}, data.articles[0]); - entry.tags.push(data.tags[0]); - entry.tags.push(data.tags[2]); - - cleanDate(entry); - - const { body } = await rq({ - url: `/articles/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(3); - }); - - test('Update article1 remove one tag', async () => { - const entry = Object.assign({}, data.articles[0]); - entry.tags = entry.tags.slice(1); - - cleanDate(entry); - - const { body } = await rq({ - url: `/articles/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(2); - }); - - test('Update article1 remove all tag', async () => { - const entry = Object.assign({}, data.articles[0], { - tags: [], - }); - - cleanDate(entry); - - const { body } = await rq({ - url: `/articles/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(0); - }); -}); - -describe('Test oneToMany - manyToOne relation (article - category) with Content Manager', () => { - beforeAll(() => { - data = { - articles: [], - categories: [], - }; - }); - - test('Create cat1', async () => { - const { body } = await rq({ - url: '/categories', - method: 'POST', - body: { - name: 'cat1', - }, - }); - - data.categories.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('cat1'); - }); - - test('Create cat2', async () => { - const { body } = await rq({ - url: '/categories', - method: 'POST', - body: { - name: 'cat2', - }, - }); - - data.categories.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('cat2'); - }); - - test('Create article1 with cat1', async () => { - const entry = { - title: 'Article 1', - content: 'Content 1', - category: data.categories[0], - }; - - const { body } = await rq({ - url: '/articles', - method: 'POST', - body: entry, - }); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.category.name).toBe(entry.category.name); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - - test('Update article1 with cat2', async () => { - const entry = Object.assign({}, data.articles[0], { - category: data.categories[1], - }); - - cleanDate(entry); - - const { body } = await rq({ - url: `/articles/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.category.name).toBe(entry.category.name); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - - test('Create article2', async () => { - const entry = { - title: 'Article 2', - content: 'Content 2', - }; - - const { body } = await rq({ - url: '/articles', - method: 'POST', - body: entry, - }); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - - test('Update article2 with cat2', async () => { - const entry = Object.assign({}, data.articles[1], { - category: data.categories[1], - }); - - cleanDate(entry); - - const { body } = await rq({ - url: `/articles/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.articles[1] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.category.name).toBe(entry.category.name); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - - test('Update cat1 with article1', async () => { - const entry = Object.assign({}, data.categories[0]); - entry.articles.push(data.articles[0]); - - cleanDate(entry); - - const { body } = await rq({ - url: `/categories/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.categories[0] = body; - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.articles.length).toBe(1); - expect(body.name).toBe(entry.name); - }); - - test('Create cat3 with article1', async () => { - const entry = { - name: 'cat3', - articles: [data.articles[0]], - }; - - const { body } = await rq({ - url: '/categories', - method: 'POST', - body: entry, - }); - - data.categories.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.articles.length).toBe(1); - expect(body.name).toBe(entry.name); - }); - - test('Get article1 with cat3', async () => { - const { body } = await rq({ - url: `/articles/${data.articles[0].id}`, - method: 'GET', - }); - - expect(body.id); - expect(body.category.id).toBe(data.categories[2].id); - }); - - test('Get article2 with cat2', async () => { - const { body } = await rq({ - url: `/articles/${data.articles[1].id}`, - method: 'GET', - }); - - expect(body.id); - expect(body.category.id).toBe(data.categories[1].id); - }); - - test('Get cat1 without relations', async () => { - const { body } = await rq({ - url: `/categories/${data.categories[0].id}`, - method: 'GET', - }); - - expect(body.id); - expect(body.articles.length).toBe(0); - }); - - test('Get cat2 with article2', async () => { - const { body } = await rq({ - url: `/categories/${data.categories[1].id}`, - method: 'GET', - }); - - expect(body.id); - expect(body.articles.length).toBe(1); - expect(body.articles[0].id).toBe(data.articles[1].id); - }); - - test('Get cat3 with article1', async () => { - const { body } = await rq({ - url: `/categories/${data.categories[2].id}`, - method: 'GET', - }); - - expect(body.id); - expect(body.articles.length).toBe(1); - expect(body.articles[0].id).toBe(data.articles[0].id); - }); -}); - -describe('Test oneToOne relation (article - reference) with Content Manager', () => { - beforeAll(() => { - data = { - articles: [], - references: [], - }; - }); - - test('Create ref1', async () => { - const { body } = await rq({ - url: '/references', - method: 'POST', - body: { - name: 'ref1', - }, - }); - - data.references.push(body); - - expect(body.id); - expect(body.name).toBe('ref1'); - }); - - test('Create article1', async () => { - const entry = { - title: 'Article 1', - content: 'Content 1', - }; - - const { body } = await rq({ - url: '/articles', - method: 'POST', - body: entry, - }); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - }); - - test('Update article1 with ref1', async () => { - const entry = Object.assign({}, data.articles[0], { - reference: data.references[0].id, - }); - - cleanDate(entry); - - const { body } = await rq({ - url: `/articles/${entry.id}`, - method: 'PUT', - body: entry, - }); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.reference.id).toBe(entry.reference); - }); - - test('Create article2 with ref1', async () => { - const entry = { - title: 'Article 2', - content: 'Content 2', - reference: data.references[0].id, - }; - - const { body } = await rq({ - url: '/articles', - method: 'POST', - body: entry, - }); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.reference.id).toBe(entry.reference); - }); -}); - -describe('Test oneWay relation (reference - tag) with Content Manager', () => { - test('Attach Tag to a Reference', async () => { - await rq({ - url: '/tags', - method: 'POST', - body: { - name: 'tag111', - }, - }).then(({ body: tagToCreate }) => { - return rq({ - url: '/references', - method: 'POST', - body: { - name: 'cat111', - tag: tagToCreate, - }, - }).then(({ body }) => { - expect(body.tag.id).toBe(tagToCreate.id); - }); - }); - }); - - test('Detach Tag to a Reference', async () => { - const { body: tagToCreate } = await rq({ - url: '/tags', - method: 'POST', - body: { - name: 'tag111', - }, - }); - - const { body: referenceToCreate } = await rq({ - url: '/references', - method: 'POST', - body: { - name: 'cat111', - tag: tagToCreate, - }, - }); - - expect(referenceToCreate.tag.id).toBe(tagToCreate.id); - - const { body: referenceToUpdate } = await rq({ - url: `/references/${referenceToCreate.id}`, - method: 'PUT', - body: { - tag: null, - }, - }); - - expect(referenceToUpdate.tag).toBe(null); - }); - - test('Delete Tag so the relation in the Reference side should be removed', async () => { - const { body: tagToCreate } = await rq({ - url: '/tags', - method: 'POST', - body: { - name: 'tag111', - }, - }); - - const { body: referenceToCreate } = await rq({ - url: '/references', - method: 'POST', - body: { - name: 'cat111', - tag: tagToCreate, - }, - }); - - await rq({ - url: `/tags/${tagToCreate.id}`, - method: 'DELETE', - }); - - const { body: referenceToGet } = await rq({ - url: `/references/${referenceToCreate.id}`, - method: 'GET', - }); - - if (Object.keys(referenceToGet.tag).length == 0) return; - expect(referenceToGet.tag).toBe(null); - }); -}); - -describe('Delete test APIs', () => { - beforeEach(() => restart(), 60000); - - test('Delete article API', async () => { - await rq({ - url: '/content-type-builder/models/article', - method: 'DELETE', - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Delete tag API', async () => { - await rq({ - url: '/content-type-builder/models/tag', - method: 'DELETE', - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Delete category API', async () => { - await rq({ - url: '/content-type-builder/models/category', - method: 'DELETE', - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Delete reference API', async () => { - await rq({ - url: '/content-type-builder/models/reference', - method: 'DELETE', - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); - - test('Delete product API', async () => { - await rq({ - url: '/content-type-builder/models/product', - method: 'DELETE', - }).then(res => { - expect(res.statusCode).toBe(200); - }); - }); -}); diff --git a/packages/strapi-plugin-content-manager/test/index.test.e2e.js b/packages/strapi-plugin-content-manager/test/index.test.e2e.js new file mode 100644 index 0000000000..710c1a996f --- /dev/null +++ b/packages/strapi-plugin-content-manager/test/index.test.e2e.js @@ -0,0 +1,771 @@ +// Helpers. +const { auth, login } = require('../../../test/helpers/auth'); +const form = require('../../../test/helpers/generators'); +const restart = require('../../../test/helpers/restart'); +const createRequest = require('../../../test/helpers/request'); + +const cleanDate = entry => { + delete entry.updatedAt; + delete entry.createdAt; + delete entry.created_at; + delete entry.updated_at; +}; + +let data; + +let rq; +jest.setTimeout(30000); + +describe('Content Manager End to End', () => { + beforeAll(async () => { + await createRequest()({ + url: '/auth/local/register', + method: 'POST', + body: auth, + }).catch(() => {}); + + const body = await login(); + + rq = createRequest({ + headers: { + Authorization: `Bearer ${body.jwt}`, + }, + }); + }); + + afterAll(() => new Promise(resolve, setTimeout(resolve, 5000))); + + describe('Generate test APIs', () => { + beforeEach(() => restart(), 60000); + + test('Create new article API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.article, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new tag API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.tag, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new category API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.category, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new reference API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.reference, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + + test('Create new product API', async () => { + await rq({ + url: '/content-type-builder/models', + method: 'POST', + body: form.product, + }).then(res => { + expect(res.statusCode).toBe(200); + }); + }); + }); + + describe('Test manyToMany relation (article - tag) with Content Manager', () => { + beforeAll(async () => { + await restart(); + + data = { + articles: [], + tags: [], + }; + }); + + test('Create tag1', async () => { + let { body } = await rq({ + url: '/content-manager/explorer/tag/?source=content-manager', + method: 'POST', + formData: { + name: 'tag1', + }, + }); + + data.tags.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('tag1'); + }); + + test('Create tag2', async () => { + let { body } = await rq({ + url: '/content-manager/explorer/tag/?source=content-manager', + method: 'POST', + formData: { + name: 'tag2', + }, + }); + + data.tags.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('tag2'); + }); + + test('Create tag3', async () => { + let { body } = await rq({ + url: '/content-manager/explorer/tag/?source=content-manager', + method: 'POST', + formData: { + name: 'tag3', + }, + }); + + data.tags.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('tag3'); + }); + + test('Create article1 without relation', async () => { + const entry = { + title: 'Article 1', + content: 'My super content 1', + }; + + let { body } = await rq({ + url: '/content-manager/explorer/article/?source=content-manager', + method: 'POST', + formData: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(0); + }); + + test('Create article2 with tag1', async () => { + const entry = { + title: 'Article 2', + content: 'Content 2', + tags: [data.tags[0]], + }; + + let { body } = await rq({ + url: '/content-manager/explorer/article/?source=content-manager', + method: 'POST', + formData: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(1); + expect(body.tags[0].id).toBe(data.tags[0].id); + }); + + test('Update article1 add tag2', async () => { + const entry = Object.assign({}, data.articles[0], { + tags: [data.tags[1]], + }); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(1); + expect(body.tags[0].id).toBe(data.tags[1].id); + }); + + test('Update article1 add tag1 and tag3', async () => { + const entry = Object.assign({}, data.articles[0]); + entry.tags.push(data.tags[0]); + entry.tags.push(data.tags[2]); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(3); + }); + + test('Update article1 remove one tag', async () => { + const entry = Object.assign({}, data.articles[0]); + entry.tags = entry.tags.slice(1); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(2); + }); + + test('Update article1 remove all tag', async () => { + const entry = Object.assign({}, data.articles[0], { + tags: [], + }); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + expect(body.tags.length).toBe(0); + }); + + test('Delete all articles should remove the association in each tags related to them', async () => { + const { body: tagToCreate } = await rq({ + url: '/content-manager/explorer/tag/?source=content-manager', + method: 'POST', + formData: { + name: 'tag11', + }, + }); + + const { body: article12 } = await rq({ + url: '/content-manager/explorer/article/?source=content-manager', + method: 'POST', + formData: { + title: 'article12', + content: 'Content', + tags: [tagToCreate], + }, + }); + + const { body: article13 } = await rq({ + url: '/content-manager/explorer/article/?source=content-manager', + method: 'POST', + formData: { + title: 'article13', + content: 'Content', + tags: [tagToCreate], + }, + }); + + const articles = [article12, article13]; + + expect(Array.isArray(articles[0].tags)).toBeTruthy(); + expect(articles[0].tags.length).toBe(1); + expect(Array.isArray(articles[1].tags)).toBeTruthy(); + expect(articles[1].tags.length).toBe(1); + + let { body: tagToGet } = await rq({ + url: `/content-manager/explorer/tag/${tagToCreate.id}?source=content-manager`, + method: 'GET', + }); + + expect(Array.isArray(tagToGet.articles)).toBeTruthy(); + expect(tagToGet.articles.length).toBe(2); + + await rq({ + url: `/content-manager/explorer/deleteAll/article/?source=content-manager&${articles + .map((article, index) => `${index}=${article.id}`) + .join('&')}`, + method: 'DELETE', + }); + + let { body: tagToGet2 } = await rq({ + url: `/content-manager/explorer/tag/${tagToCreate.id}?source=content-manager`, + method: 'GET', + }); + + expect(Array.isArray(tagToGet2.articles)).toBeTruthy(); + expect(tagToGet2.articles.length).toBe(0); + }); + }); + + describe('Test oneToMany - manyToOne relation (article - category) with Content Manager', () => { + beforeAll(() => { + data = { + articles: [], + categories: [], + }; + }); + + test('Create cat1', async () => { + let { body } = await rq({ + url: '/content-manager/explorer/category/?source=content-manager', + method: 'POST', + formData: { + name: 'cat1', + }, + }); + + data.categories.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('cat1'); + }); + + test('Create cat2', async () => { + let { body } = await rq({ + url: '/content-manager/explorer/category/?source=content-manager', + method: 'POST', + formData: { + name: 'cat2', + }, + }); + + data.categories.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.name).toBe('cat2'); + }); + + test('Create article1 with cat1', async () => { + const entry = { + title: 'Article 1', + content: 'Content 1', + category: data.categories[0], + }; + + let { body } = await rq({ + url: '/content-manager/explorer/article/?source=content-manager', + method: 'POST', + formData: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.category.name).toBe(entry.category.name); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Update article1 with cat2', async () => { + const entry = Object.assign({}, data.articles[0], { + category: data.categories[1], + }); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.category.name).toBe(entry.category.name); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Create article2', async () => { + const entry = { + title: 'Article 2', + content: 'Content 2', + }; + + let { body } = await rq({ + url: '/content-manager/explorer/article?source=content-manager', + method: 'POST', + formData: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Update article2 with cat2', async () => { + const entry = Object.assign({}, data.articles[1], { + category: data.categories[1], + }); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.articles[1] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.category.name).toBe(entry.category.name); + expect(Array.isArray(body.tags)).toBeTruthy(); + }); + + test('Update cat1 with article1', async () => { + const entry = Object.assign({}, data.categories[0]); + entry.articles.push(data.articles[0]); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/category/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.categories[0] = body; + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.articles.length).toBe(1); + expect(body.name).toBe(entry.name); + }); + + test('Create cat3 with article1', async () => { + const entry = { + name: 'cat3', + articles: [data.articles[0]], + }; + + let { body } = await rq({ + url: '/content-manager/explorer/category/?source=content-manager', + method: 'POST', + formData: entry, + }); + + data.categories.push(body); + + expect(body.id); + expect(Array.isArray(body.articles)).toBeTruthy(); + expect(body.articles.length).toBe(1); + expect(body.name).toBe(entry.name); + }); + + test('Get article1 with cat3', async () => { + let { body } = await rq({ + url: `/content-manager/explorer/article/${data.articles[0].id}?source=content-manager`, + method: 'GET', + }); + + expect(body.id); + expect(body.category.id).toBe(data.categories[2].id); + }); + + test('Get article2 with cat2', async () => { + let { body } = await rq({ + url: `/content-manager/explorer/article/${data.articles[1].id}?source=content-manager`, + method: 'GET', + }); + + expect(body.id); + expect(body.category.id).toBe(data.categories[1].id); + }); + + test('Get cat1 without relations', async () => { + let { body } = await rq({ + url: `/content-manager/explorer/category/${data.categories[0].id}?source=content-manager`, + method: 'GET', + }); + + expect(body.id); + expect(body.articles.length).toBe(0); + }); + + test('Get cat2 with article2', async () => { + let { body } = await rq({ + url: `/content-manager/explorer/category/${data.categories[1].id}?source=content-manager`, + method: 'GET', + }); + + expect(body.id); + expect(body.articles.length).toBe(1); + expect(body.articles[0].id).toBe(data.articles[1].id); + }); + + test('Get cat3 with article1', async () => { + let { body } = await rq({ + url: `/content-manager/explorer/category/${data.categories[2].id}?source=content-manager`, + method: 'GET', + }); + + expect(body.id); + expect(body.articles.length).toBe(1); + expect(body.articles[0].id).toBe(data.articles[0].id); + }); + }); + + describe('Test oneToOne relation (article - reference) with Content Manager', () => { + beforeAll(() => { + data = { + articles: [], + references: [], + }; + }); + + test('Create ref1', async () => { + let { body } = await rq({ + url: '/content-manager/explorer/reference/?source=content-manager', + method: 'POST', + formData: { + name: 'ref1', + }, + }); + + data.references.push(body); + + expect(body.id); + expect(body.name).toBe('ref1'); + }); + + test('Create article1', async () => { + const entry = { + title: 'Article 1', + content: 'Content 1', + }; + + let { body } = await rq({ + url: '/content-manager/explorer/article?source=content-manager', + method: 'POST', + formData: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + }); + + test('Update article1 with ref1', async () => { + const entry = Object.assign({}, data.articles[0], { + reference: data.references[0].id, + }); + + cleanDate(entry); + + let { body } = await rq({ + url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, + method: 'PUT', + formData: entry, + }); + + data.articles[0] = body; + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.reference.id).toBe(entry.reference); + }); + + test('Create article2 with ref1', async () => { + const entry = { + title: 'Article 2', + content: 'Content 2', + reference: data.references[0].id, + }; + + let { body } = await rq({ + url: '/content-manager/explorer/article?source=content-manager', + method: 'POST', + formData: entry, + }); + + data.articles.push(body); + + expect(body.id); + expect(body.title).toBe(entry.title); + expect(body.content).toBe(entry.content); + expect(body.reference.id).toBe(entry.reference); + }); + }); + + describe('Test oneWay relation (reference - tag) with Content Manager', () => { + test('Attach Tag to a Reference', async () => { + const { body: tagToCreate } = await rq({ + url: '/content-manager/explorer/tag/?source=content-manager', + method: 'POST', + formData: { + name: 'tag111', + }, + }); + + const { body: referenceToCreate } = await rq({ + url: '/content-manager/explorer/reference/?source=content-manager', + method: 'POST', + formData: { + name: 'cat111', + tag: tagToCreate, + }, + }); + + expect(referenceToCreate.tag.id).toBe(tagToCreate.id); + }); + + test('Detach Tag to a Reference', async () => { + const { body: tagToCreate } = await rq({ + url: '/content-manager/explorer/tag/?source=content-manager', + method: 'POST', + formData: { + name: 'tag111', + }, + }); + + const { body: referenceToCreate } = await rq({ + url: '/content-manager/explorer/reference/?source=content-manager', + method: 'POST', + formData: { + name: 'cat111', + tag: tagToCreate, + }, + }); + + expect(referenceToCreate.tag.id).toBe(tagToCreate.id); + + const { body: referenceToUpdate } = await rq({ + url: `/content-manager/explorer/reference/${referenceToCreate.id}?source=content-manager`, + method: 'PUT', + formData: { + tag: null, + }, + }); + + expect(referenceToUpdate.tag).toBe(null); + }); + + test('Delete Tag so the relation in the Reference side should be removed', async () => { + const { body: tagToCreate } = await rq({ + url: '/content-manager/explorer/tag/?source=content-manager', + method: 'POST', + formData: { + name: 'tag111', + }, + }); + + const { body: referenceToCreate } = await rq({ + url: '/content-manager/explorer/reference/?source=content-manager', + method: 'POST', + formData: { + name: 'cat111', + tag: tagToCreate, + }, + }); + + await rq({ + url: `/content-manager/explorer/tag/${tagToCreate.id}?source=content-manager`, + method: 'DELETE', + }); + + const { body: referenceToGet } = await rq({ + url: `/content-manager/explorer/reference/${referenceToCreate.id}?source=content-manager`, + method: 'GET', + }); + + if (Object.keys(referenceToGet.tag).length == 0) return; + expect(referenceToGet.tag).toBe(null); + }); + }); + + describe('Delete test APIs', () => { + beforeEach(() => restart(), 60000); + + test('Delete article API', async () => { + await rq({ + url: '/content-type-builder/models/article', + method: 'DELETE', + }); + }); + + test('Delete tag API', async () => { + await rq({ + url: '/content-type-builder/models/tag', + method: 'DELETE', + }); + }); + + test('Delete category API', async () => { + await rq({ + url: '/content-type-builder/models/category', + method: 'DELETE', + }); + }); + + test('Delete reference API', async () => { + await rq({ + url: '/content-type-builder/models/reference', + method: 'DELETE', + }); + }); + + test('Delete product API', async () => { + await rq({ + url: '/content-type-builder/models/product', + method: 'DELETE', + }); + }); + }); +}); diff --git a/packages/strapi-plugin-content-manager/test/index.test.js b/packages/strapi-plugin-content-manager/test/index.test.js deleted file mode 100644 index f4f6d6cd63..0000000000 --- a/packages/strapi-plugin-content-manager/test/index.test.js +++ /dev/null @@ -1,824 +0,0 @@ -// Helpers. -const { login } = require('../../../test/helpers/auth'); -const form = require('../../../test/helpers/generators'); -const restart = require('../../../test/helpers/restart'); -const rq = require('../../../test/helpers/request'); - -const cleanDate = entry => { - delete entry.updatedAt; - delete entry.createdAt; - delete entry.created_at; - delete entry.updated_at; -}; - -let data; - -beforeAll(async () => { - const body = await login(); - - rq.defaults({ - headers: { - Authorization: `Bearer ${body.jwt}`, - }, - }); -}); - -describe('Generate test APIs', () => { - beforeEach(async () => { - await restart(); - await new Promise(resolve => setTimeout(resolve, 1000)); - }, 60000); - - test('Create new article API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.article, - json: true, - }); - }); - test('Create new tag API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.tag, - json: true, - }); - }); - test('Create new category API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.category, - json: true, - }); - }); - test('Create new reference API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.reference, - json: true, - }); - }); - test('Create new product API', async () => { - await rq({ - url: '/content-type-builder/models', - method: 'POST', - body: form.product, - json: true, - }); - }); -}); - -describe('Test manyToMany relation (article - tag) with Content Manager', () => { - beforeAll(() => { - data = { - articles: [], - tags: [], - }; - }); - - beforeEach(async () => { - await restart(); - await new Promise(resolve => setTimeout(resolve, 1000)); - }, 60000); - - test('Create tag1', async () => { - let body = await rq({ - url: '/content-manager/explorer/tag/?source=content-manager', - method: 'POST', - formData: { - name: 'tag1', - }, - }); - - body = JSON.parse(body); - - data.tags.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('tag1'); - }); - test('Create tag2', async () => { - let body = await rq({ - url: '/content-manager/explorer/tag/?source=content-manager', - method: 'POST', - formData: { - name: 'tag2', - }, - }); - - body = JSON.parse(body); - - data.tags.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('tag2'); - }); - test('Create tag3', async () => { - let body = await rq({ - url: '/content-manager/explorer/tag/?source=content-manager', - method: 'POST', - formData: { - name: 'tag3', - }, - }); - - body = JSON.parse(body); - - data.tags.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('tag3'); - }); - test('Create article1 without relation', async () => { - const entry = { - title: 'Article 1', - content: 'My super content 1', - }; - - let body = await rq({ - url: '/content-manager/explorer/article/?source=content-manager', - method: 'POST', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(0); - }); - test('Create article2 with tag1', async () => { - const entry = { - title: 'Article 2', - content: 'Content 2', - tags: [data.tags[0]], - }; - - let body = await rq({ - url: '/content-manager/explorer/article/?source=content-manager', - method: 'POST', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(1); - expect(body.tags[0].id).toBe(data.tags[0].id); - }); - test('Update article1 add tag2', async () => { - const entry = Object.assign({}, data.articles[0], { - tags: [data.tags[1]], - }); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(1); - expect(body.tags[0].id).toBe(data.tags[1].id); - }); - test('Update article1 add tag1 and tag3', async () => { - const entry = Object.assign({}, data.articles[0]); - entry.tags.push(data.tags[0]); - entry.tags.push(data.tags[2]); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(3); - }); - test('Update article1 remove one tag', async () => { - const entry = Object.assign({}, data.articles[0]); - entry.tags = entry.tags.slice(1); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - json: true, - }); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(2); - }); - test('Update article1 remove all tag', async () => { - const entry = Object.assign({}, data.articles[0], { - tags: [], - }); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - expect(body.tags.length).toBe(0); - }); - - test('Delete all articles should remove the association in each tags related to them', async () => { - const tagToCreate = await rq({ - url: '/content-manager/explorer/tag/?source=content-manager', - method: 'POST', - json: true, - formData: { - name: 'tag11', - }, - }); - - const article12 = await rq({ - url: '/content-manager/explorer/article/?source=content-manager', - method: 'POST', - json: true, - formData: { - title: 'article12', - content: 'Content', - tags: [tagToCreate], - }, - }); - - const article13 = await rq({ - url: '/content-manager/explorer/article/?source=content-manager', - method: 'POST', - json: true, - formData: { - title: 'article13', - content: 'Content', - tags: [tagToCreate], - }, - }); - - const articles = [article12, article13]; - - expect(Array.isArray(articles[0].tags)).toBeTruthy(); - expect(articles[0].tags.length).toBe(1); - expect(Array.isArray(articles[1].tags)).toBeTruthy(); - expect(articles[1].tags.length).toBe(1); - - let tagToGet = await rq({ - url: `/content-manager/explorer/tag/${tagToCreate.id}?source=content-manager`, - method: 'GET', - json: true, - }); - - expect(Array.isArray(tagToGet.articles)).toBeTruthy(); - expect(tagToGet.articles.length).toBe(2); - - await rq({ - url: `/content-manager/explorer/deleteAll/article/?source=content-manager&${articles - .map((article, index) => `${index}=${article.id}`) - .join('&')}`, - method: 'DELETE', - json: true, - }); - - tagToGet = await rq({ - url: `/content-manager/explorer/tag/${tagToCreate.id}?source=content-manager`, - method: 'GET', - json: true, - }); - - expect(Array.isArray(tagToGet.articles)).toBeTruthy(); - expect(tagToGet.articles.length).toBe(0); - }); -}); - -describe('Test oneToMany - manyToOne relation (article - category) with Content Manager', () => { - beforeAll(() => { - data = { - articles: [], - categories: [], - }; - }); - - beforeEach(async () => { - await restart(); - await new Promise(resolve => setTimeout(resolve, 1000)); - }, 60000); - - test('Create cat1', async () => { - let body = await rq({ - url: '/content-manager/explorer/category/?source=content-manager', - method: 'POST', - formData: { - name: 'cat1', - }, - }); - - body = JSON.parse(body); - - data.categories.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('cat1'); - }); - test('Create cat2', async () => { - let body = await rq({ - url: '/content-manager/explorer/category/?source=content-manager', - method: 'POST', - formData: { - name: 'cat2', - }, - }); - - body = JSON.parse(body); - - data.categories.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.name).toBe('cat2'); - }); - test('Create article1 with cat1', async () => { - const entry = { - title: 'Article 1', - content: 'Content 1', - category: data.categories[0], - }; - - let body = await rq({ - url: '/content-manager/explorer/article/?source=content-manager', - method: 'POST', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.category.name).toBe(entry.category.name); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - test('Update article1 with cat2', async () => { - const entry = Object.assign({}, data.articles[0], { - category: data.categories[1], - }); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.category.name).toBe(entry.category.name); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - test('Create article2', async () => { - const entry = { - title: 'Article 2', - content: 'Content 2', - }; - - let body = await rq({ - url: '/content-manager/explorer/article?source=content-manager', - method: 'POST', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - test('Update article2 with cat2', async () => { - const entry = Object.assign({}, data.articles[1], { - category: data.categories[1], - }); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles[1] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.category.name).toBe(entry.category.name); - expect(Array.isArray(body.tags)).toBeTruthy(); - }); - test('Update cat1 with article1', async () => { - const entry = Object.assign({}, data.categories[0]); - entry.articles.push(data.articles[0]); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/category/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - }); - - body = JSON.parse(body); - - data.categories[0] = body; - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.articles.length).toBe(1); - expect(body.name).toBe(entry.name); - }); - test('Create cat3 with article1', async () => { - const entry = { - name: 'cat3', - articles: [data.articles[0]], - }; - - let body = await rq({ - url: '/content-manager/explorer/category/?source=content-manager', - method: 'POST', - formData: entry, - }); - - body = JSON.parse(body); - - data.categories.push(body); - - expect(body.id); - expect(Array.isArray(body.articles)).toBeTruthy(); - expect(body.articles.length).toBe(1); - expect(body.name).toBe(entry.name); - }); - test('Get article1 with cat3', async () => { - let body = await rq({ - url: `/content-manager/explorer/article/${data.articles[0].id}?source=content-manager`, - method: 'GET', - }); - - body = JSON.parse(body); - - expect(body.id); - expect(body.category.id).toBe(data.categories[2].id); - }); - test('Get article2 with cat2', async () => { - let body = await rq({ - url: `/content-manager/explorer/article/${data.articles[1].id}?source=content-manager`, - method: 'GET', - }); - - body = JSON.parse(body); - - expect(body.id); - expect(body.category.id).toBe(data.categories[1].id); - }); - test('Get cat1 without relations', async () => { - let body = await rq({ - url: `/content-manager/explorer/category/${data.categories[0].id}?source=content-manager`, - method: 'GET', - }); - - body = JSON.parse(body); - - expect(body.id); - expect(body.articles.length).toBe(0); - }); - test('Get cat2 with article2', async () => { - let body = await rq({ - url: `/content-manager/explorer/category/${data.categories[1].id}?source=content-manager`, - method: 'GET', - }); - - body = JSON.parse(body); - - expect(body.id); - expect(body.articles.length).toBe(1); - expect(body.articles[0].id).toBe(data.articles[1].id); - }); - test('Get cat3 with article1', async () => { - let body = await rq({ - url: `/content-manager/explorer/category/${data.categories[2].id}?source=content-manager`, - method: 'GET', - }); - - body = JSON.parse(body); - - expect(body.id); - expect(body.articles.length).toBe(1); - expect(body.articles[0].id).toBe(data.articles[0].id); - }); -}); - -describe('Test oneToOne relation (article - reference) with Content Manager', () => { - beforeAll(() => { - data = { - articles: [], - references: [], - }; - }); - - beforeEach(async () => { - await restart(); - await new Promise(resolve => setTimeout(resolve, 1000)); - }, 60000); - - test('Create ref1', async () => { - let body = await rq({ - url: '/content-manager/explorer/reference/?source=content-manager', - method: 'POST', - formData: { - name: 'ref1', - }, - }); - - body = JSON.parse(body); - - data.references.push(body); - - expect(body.id); - expect(body.name).toBe('ref1'); - }); - test('Create article1', async () => { - const entry = { - title: 'Article 1', - content: 'Content 1', - }; - - let body = await rq({ - url: '/content-manager/explorer/article?source=content-manager', - method: 'POST', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - }); - test('Update article1 with ref1', async () => { - const entry = Object.assign({}, data.articles[0], { - reference: data.references[0].id, - }); - - cleanDate(entry); - - let body = await rq({ - url: `/content-manager/explorer/article/${entry.id}?source=content-manager`, - method: 'PUT', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles[0] = body; - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.reference.id).toBe(entry.reference); - }); - test('Create article2 with ref1', async () => { - const entry = { - title: 'Article 2', - content: 'Content 2', - reference: data.references[0].id, - }; - - let body = await rq({ - url: '/content-manager/explorer/article?source=content-manager', - method: 'POST', - formData: entry, - }); - - body = JSON.parse(body); - - data.articles.push(body); - - expect(body.id); - expect(body.title).toBe(entry.title); - expect(body.content).toBe(entry.content); - expect(body.reference.id).toBe(entry.reference); - }); -}); - -describe('Test oneWay relation (reference - tag) with Content Manager', () => { - beforeEach(async () => { - await restart(); - await new Promise(resolve => setTimeout(resolve, 1000)); - }, 60000); - - test('Attach Tag to a Reference', async () => { - const tagToCreate = await rq({ - url: '/content-manager/explorer/tag/?source=content-manager', - method: 'POST', - json: true, - formData: { - name: 'tag111', - }, - }); - - const referenceToCreate = await rq({ - url: '/content-manager/explorer/reference/?source=content-manager', - method: 'POST', - json: true, - formData: { - name: 'cat111', - tag: tagToCreate, - }, - }); - - expect(referenceToCreate.tag.id).toBe(tagToCreate.id); - }); - - test('Detach Tag to a Reference', async () => { - const tagToCreate = await rq({ - url: '/content-manager/explorer/tag/?source=content-manager', - method: 'POST', - json: true, - formData: { - name: 'tag111', - }, - }); - - const referenceToCreate = await rq({ - url: '/content-manager/explorer/reference/?source=content-manager', - method: 'POST', - json: true, - formData: { - name: 'cat111', - tag: tagToCreate, - }, - }); - - expect(referenceToCreate.tag.id).toBe(tagToCreate.id); - - const referenceToUpdate = await rq({ - url: `/content-manager/explorer/reference/${referenceToCreate.id}?source=content-manager`, - method: 'PUT', - json: true, - formData: { - tag: null, - }, - }); - - expect(referenceToUpdate.tag).toBe(null); - }); - - test('Delete Tag so the relation in the Reference side should be removed', async () => { - const tagToCreate = await rq({ - url: '/content-manager/explorer/tag/?source=content-manager', - method: 'POST', - json: true, - formData: { - name: 'tag111', - }, - }); - - const referenceToCreate = await rq({ - url: '/content-manager/explorer/reference/?source=content-manager', - method: 'POST', - json: true, - formData: { - name: 'cat111', - tag: tagToCreate, - }, - }); - - const tagToDelete = await rq({ - url: `/content-manager/explorer/tag/${tagToCreate.id}?source=content-manager`, - method: 'DELETE', - json: true, - }); - - const referenceToGet = await rq({ - url: `/content-manager/explorer/reference/${referenceToCreate.id}?source=content-manager`, - method: 'GET', - json: true, - }); - - try { - if (Object.keys(referenceToGet.tag).length == 0) { - referenceToGet.tag = null; - } - } catch (err) { - // Silent - } - - expect(referenceToGet.tag).toBe(null); - }); -}); - -describe('Delete test APIs', () => { - beforeEach(async () => { - await restart(); - await new Promise(resolve => setTimeout(resolve, 1000)); - }, 60000); - - test('Delete article API', async () => { - await rq({ - url: '/content-type-builder/models/article', - method: 'DELETE', - json: true, - }); - }); - test('Delete tag API', async () => { - await rq({ - url: '/content-type-builder/models/tag', - method: 'DELETE', - json: true, - }); - }); - test('Delete category API', async () => { - await rq({ - url: '/content-type-builder/models/category', - method: 'DELETE', - json: true, - }); - }); - test('Delete reference API', async () => { - await rq({ - url: '/content-type-builder/models/reference', - method: 'DELETE', - json: true, - }); - }); - test('Delete product API', async () => { - await rq({ - url: '/content-type-builder/models/product', - method: 'DELETE', - json: true, - }); - }); -}); diff --git a/test/e2e.js b/test/e2e.js index d69c3d849b..b7cfbce4db 100644 --- a/test/e2e.js +++ b/test/e2e.js @@ -50,14 +50,19 @@ const main = async () => { }); }) .catch(err => { - console.log(err); process.stdout.write('testApp exited before the end with error', () => { process.exit(1); }); }); - await test().catch(() => {}); + await test().catch(() => { + process.stdout.write('Tests failed', () => { + process.exit(1); + }); + }); + process.kill(testApp.pid); + process.exit(0); }; main(); diff --git a/test/globalSetup.js b/test/globalSetup.js deleted file mode 100644 index 94d7ca04b3..0000000000 --- a/test/globalSetup.js +++ /dev/null @@ -1,15 +0,0 @@ -const { auth } = require('./helpers/auth'); -const createReq = require('./helpers/request'); - -const rq = createReq(); - -module.exports = async () => { - await rq({ - url: '/auth/local/register', - method: 'POST', - body: auth, - }).catch(err => { - console.log(err); - throw err; - }); -}; diff --git a/test/helpers/auth.js b/test/helpers/auth.js index f8a2774c74..f3fcb7f7a9 100644 --- a/test/helpers/auth.js +++ b/test/helpers/auth.js @@ -10,18 +10,16 @@ const rq = createRq(); module.exports = { auth, - login: () => { - return new Promise(async resolve => { - const res = await rq({ - url: '/auth/local', - method: 'POST', - body: { - identifier: auth.email, - password: auth.password, - }, - }); - - resolve(res.body); + login: async () => { + const { body } = await rq({ + url: '/auth/local', + method: 'POST', + body: { + identifier: auth.email, + password: auth.password, + }, }); + + return body; }, }; diff --git a/test/helpers/request.js b/test/helpers/request.js index 1edb6458be..683a84f3d0 100644 --- a/test/helpers/request.js +++ b/test/helpers/request.js @@ -10,7 +10,7 @@ const createReq = (defaults = {}) => { }); return async options => { - await restart(1000); + await restart(2000); const params = JSON.parse(JSON.stringify(options)); diff --git a/test/helpers/restart.js b/test/helpers/restart.js index 3c7c742c9c..f7432ed7dc 100644 --- a/test/helpers/restart.js +++ b/test/helpers/restart.js @@ -1,31 +1,21 @@ -const request = require('request'); +const request = require('request-promise-native'); module.exports = function(initTime = 8000) { const ping = async () => { return new Promise((resolve, reject) => { - // set timeout to avoid ping indefinitely - setTimeout(() => reject(new Error('Timeout too long to request')), 30000); - // ping _health - request( - { - url: 'http://localhost:1337/_health', - method: 'HEAD', - mode: 'no-cors', - json: true, - headers: { - 'Content-Type': 'application/json', - 'Keep-Alive': false, - }, + request({ + url: 'http://localhost:1337/_health', + method: 'HEAD', + mode: 'no-cors', + json: true, + headers: { + 'Content-Type': 'application/json', + 'Keep-Alive': false, }, - (err, res) => { - // 204 means ok - if (res && res.statusCode === 204) { - return resolve(); - } - return new Promise(resolve => setTimeout(resolve, 1000)).then(ping); - } - ); + }).then(resolve, reject); + }).catch(() => { + return new Promise(resolve => setTimeout(resolve, 1000)).then(ping); }); };