mirror of
https://github.com/strapi/strapi.git
synced 2025-06-27 00:41:25 +00:00
368 lines
9.4 KiB
JavaScript
368 lines
9.4 KiB
JavaScript
![]() |
// Helpers.
|
||
|
const { registerAndLogin } = require('../../../../test/helpers/auth');
|
||
|
const createModelsUtils = require('../../../../test/helpers/models');
|
||
|
const { createAuthRequest } = require('../../../../test/helpers/request');
|
||
|
|
||
|
let modelsUtils;
|
||
|
let rq;
|
||
|
let uid = 'application::uid-model.uid-model';
|
||
|
|
||
|
describe('Content Manager single types', () => {
|
||
|
beforeAll(async () => {
|
||
|
const token = await registerAndLogin();
|
||
|
rq = createAuthRequest(token);
|
||
|
|
||
|
modelsUtils = createModelsUtils({ rq });
|
||
|
|
||
|
await modelsUtils.createContentType({
|
||
|
kind: 'collectionType',
|
||
|
name: 'uid-model',
|
||
|
attributes: {
|
||
|
title: {
|
||
|
type: 'string',
|
||
|
},
|
||
|
slug: {
|
||
|
type: 'uid',
|
||
|
targetField: 'title',
|
||
|
},
|
||
|
otherField: {
|
||
|
type: 'integer',
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
}, 60000);
|
||
|
|
||
|
afterAll(() => modelsUtils.deleteContentType('uid-model'), 60000);
|
||
|
|
||
|
describe('Generate UID', () => {
|
||
|
test('Throws if input is not provided', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(400);
|
||
|
expect(res.body).toMatchObject({
|
||
|
statusCode: 400,
|
||
|
error: 'Bad Request',
|
||
|
message: 'ValidationError',
|
||
|
data: {
|
||
|
contentTypeUID: expect.arrayContaining([expect.stringMatching('required field')]),
|
||
|
field: expect.arrayContaining([expect.stringMatching('required field')]),
|
||
|
data: expect.arrayContaining([expect.stringMatching('required field')]),
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Throws when contentType is not found', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: 'non-existent',
|
||
|
field: 'slug',
|
||
|
data: {},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(400);
|
||
|
expect(res.body).toEqual({
|
||
|
statusCode: 400,
|
||
|
error: 'Bad Request',
|
||
|
message: 'ValidationError',
|
||
|
data: ['ContentType not found'],
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Throws when field is not a uid field', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'otherField',
|
||
|
data: {},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(400);
|
||
|
expect(res.body).toMatchObject({
|
||
|
statusCode: 400,
|
||
|
error: 'Bad Request',
|
||
|
message: 'ValidationError',
|
||
|
data: {
|
||
|
field: [expect.stringMatching('must be a valid `uid` attribute')],
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Generates a unique field when not targetField', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
data: {},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(res.body.data).toBe('uid-model');
|
||
|
|
||
|
await rq({
|
||
|
url: `/content-manager/explorer/${uid}`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
slug: res.body.data,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const secondRes = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
data: {},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(secondRes.statusCode).toBe(200);
|
||
|
expect(secondRes.body.data).toBe('uid-model-1');
|
||
|
});
|
||
|
|
||
|
test('Generates a unique field based on targetField', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
data: {
|
||
|
title: 'This is a super title',
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(res.body.data).toBe('this-is-a-super-title');
|
||
|
|
||
|
await rq({
|
||
|
url: `/content-manager/explorer/${uid}`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
slug: res.body.data,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const secondRes = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
data: {
|
||
|
title: 'This is a super title',
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(secondRes.statusCode).toBe(200);
|
||
|
expect(secondRes.body.data).toBe('this-is-a-super-title-1');
|
||
|
});
|
||
|
|
||
|
test('Avoids colisions with already generated uids', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
data: {
|
||
|
title: 'My title',
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(res.body.data).toBe('my-title');
|
||
|
|
||
|
await rq({
|
||
|
url: `/content-manager/explorer/${uid}`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
slug: res.body.data,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const secondRes = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
data: {
|
||
|
title: 'My title',
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(secondRes.statusCode).toBe(200);
|
||
|
expect(secondRes.body.data).toBe('my-title-1');
|
||
|
|
||
|
await rq({
|
||
|
url: `/content-manager/explorer/${uid}`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
slug: secondRes.body.data,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const thridRes = await rq({
|
||
|
url: `/content-manager/explorer/uid/generate`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
data: {
|
||
|
title: 'My title 1',
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(thridRes.statusCode).toBe(200);
|
||
|
expect(thridRes.body.data).toBe('my-title-1-1');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('Check UID availability', () => {
|
||
|
test('Throws if input is not provided', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/check-availability`,
|
||
|
method: 'POST',
|
||
|
body: {},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(400);
|
||
|
expect(res.body).toMatchObject({
|
||
|
statusCode: 400,
|
||
|
error: 'Bad Request',
|
||
|
message: 'ValidationError',
|
||
|
data: {
|
||
|
contentTypeUID: expect.arrayContaining([expect.stringMatching('required field')]),
|
||
|
field: expect.arrayContaining([expect.stringMatching('required field')]),
|
||
|
value: expect.arrayContaining([expect.stringMatching('required field')]),
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Throws on invalid uid value', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/check-availability`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
value: 'Invalid UID valuéééé',
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(400);
|
||
|
expect(res.body).toMatchObject({
|
||
|
data: {
|
||
|
value: expect.arrayContaining([expect.stringMatching('must match')]),
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Throws when contentType is not found', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/check-availability`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: 'non-existent',
|
||
|
field: 'slug',
|
||
|
value: 'some-slug',
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(400);
|
||
|
expect(res.body).toEqual({
|
||
|
statusCode: 400,
|
||
|
error: 'Bad Request',
|
||
|
message: 'ValidationError',
|
||
|
data: ['ContentType not found'],
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Throws when field is not a uid field', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/check-availability`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'otherField',
|
||
|
value: 'some-slug',
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(400);
|
||
|
expect(res.body).toMatchObject({
|
||
|
statusCode: 400,
|
||
|
error: 'Bad Request',
|
||
|
message: 'ValidationError',
|
||
|
data: {
|
||
|
field: [expect.stringMatching('must be a valid `uid` attribute')],
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Checks availability', async () => {
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/check-availability`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
value: 'some-available-slug',
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(res.body).toEqual({
|
||
|
isAvailable: true,
|
||
|
suggestion: null,
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test('Gives a suggestion when not available', async () => {
|
||
|
// create data
|
||
|
await rq({
|
||
|
url: `/content-manager/explorer/${uid}`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
slug: 'custom-slug',
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const res = await rq({
|
||
|
url: `/content-manager/explorer/uid/check-availability`,
|
||
|
method: 'POST',
|
||
|
body: {
|
||
|
contentTypeUID: uid,
|
||
|
field: 'slug',
|
||
|
value: 'custom-slug',
|
||
|
},
|
||
|
});
|
||
|
|
||
|
expect(res.statusCode).toBe(200);
|
||
|
expect(res.body).toEqual({
|
||
|
isAvailable: false,
|
||
|
suggestion: 'custom-slug-1',
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|