381 lines
8.3 KiB
JavaScript
Raw Normal View History

const uidService = require('../uid');
describe('Test uid service', () => {
describe('generateUIDField', () => {
test('Uses modelName if no targetField specified or set', async () => {
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
slug: {
type: 'uid',
},
},
},
},
db: {
query() {
return {
find: async () => [],
};
},
},
};
const uid = await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {},
});
expect(uid).toBe('my-test-model');
});
test('Calls findUniqueUID', async () => {
const tmpFn = uidService.findUniqueUID;
uidService.findUniqueUID = jest.fn(v => v);
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
title: {
type: 'string',
},
slug: {
type: 'uid',
targetField: 'title',
},
},
},
},
db: {
query() {
return {
find: async () => [],
};
},
},
};
await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {
title: 'Test title',
},
});
await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {},
});
expect(uidService.findUniqueUID).toHaveBeenCalledTimes(2);
uidService.findUniqueUID = tmpFn;
});
test('Uses targetField value for generation', async () => {
const find = jest.fn(async () => {
return [{ slug: 'test-title' }];
});
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
title: {
type: 'string',
},
slug: {
type: 'uid',
targetField: 'title',
},
},
},
},
db: {
query() {
return {
find,
};
},
},
};
const uid = await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {
title: 'Test title',
},
});
expect(uid).toBe('test-title-1');
// change find response
global.strapi.db.query = () => ({ find: jest.fn(async () => []) });
const uidWithEmptyTarget = await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {
title: '',
},
});
expect(uidWithEmptyTarget).toBe('my-test-model');
});
test('Uses options for generation', async () => {
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
title: {
type: 'string',
},
slug: {
type: 'uid',
targetField: 'title',
options: { lowercase: false },
},
},
},
},
db: {
query() {
return {
find: async () => [],
};
},
},
};
const uid = await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {
title: 'Test title',
},
});
expect(uid).toBe('Test-title');
});
test('Ignores minLength attribute (should be handle by the user)', async () => {
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
title: {
type: 'string',
},
slug: {
type: 'uid',
targetField: 'title',
minLength: 100,
},
},
},
},
db: {
query() {
return {
find: async () => [],
};
},
},
};
const uid = await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {
title: 'Test UID',
},
});
expect(uid).toBe('test-uid');
});
test('Ignores maxLength attribute (should be handled user side)', async () => {
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
title: {
type: 'string',
},
slug: {
type: 'uid',
targetField: 'title',
maxLength: 10,
},
},
},
},
db: {
query() {
return {
find: async () => [],
};
},
},
};
const uid = await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {
title: 'Test with a 999 very long title',
},
});
expect(uid).toBe('test-with-a-999-very-long-title');
});
test('Generates a UID using the default value if necessary', async () => {
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
slug: {
type: 'uid',
default: 'slug-default',
},
},
},
},
db: {
query() {
return {
find: async () => [],
};
},
},
};
const uid = await uidService.generateUIDField({
contentTypeUID: 'my-model',
field: 'slug',
data: {},
});
expect(uid).toBe('slug-default');
});
});
describe('findUniqueUID', () => {
test('Finds closest match', async () => {
const find = jest.fn(async () => {
return [
{ slug: 'my-test-model' },
{ slug: 'my-test-model-1' },
// it finds the quickest match possible
{ slug: 'my-test-model-4' },
];
});
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
slug: {
type: 'uid',
},
},
},
},
db: {
query() {
return {
find,
};
},
},
};
const uid = await uidService.findUniqueUID({
contentTypeUID: 'my-model',
field: 'slug',
value: 'my-test-model',
});
expect(uid).toBe('my-test-model-2');
});
test('Calls db find', async () => {
const find = jest.fn(async () => {
return [];
});
global.strapi = {
contentTypes: {
'my-model': {
modelName: 'myTestModel',
attributes: {
slug: {
type: 'uid',
},
},
},
},
db: {
query() {
return {
find,
};
},
},
};
await uidService.findUniqueUID({
contentTypeUID: 'my-model',
field: 'slug',
value: 'my-test-model',
});
expect(find).toHaveBeenCalledWith({
slug_contains: 'my-test-model',
_limit: -1,
});
});
});
describe('CheckUIDAvailability', () => {
test('Counts the data in db', async () => {
const count = jest.fn(async () => 0);
global.strapi = {
db: {
query() {
return {
count,
};
},
},
};
const isAvailable = await uidService.checkUIDAvailability({
contentTypeUID: 'my-model',
field: 'slug',
value: 'my-test-model',
});
expect(count).toHaveBeenCalledWith({ slug: 'my-test-model' });
expect(isAvailable).toBe(true);
});
});
});