368 lines
9.4 KiB
JavaScript
Raw Normal View History

// 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 collisions 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',
});
});
});
});