2021-02-16 10:26:47 +01:00
|
|
|
'use strict';
|
|
|
|
|
2021-10-27 18:54:58 +02:00
|
|
|
const { ApplicationError } = require('@strapi/utils').errors;
|
2021-02-16 10:26:47 +01:00
|
|
|
const { listLocales, createLocale, updateLocale, deleteLocale } = require('../locales');
|
2021-06-09 18:10:44 +02:00
|
|
|
const localeModel = require('../../content-types/locale');
|
2021-02-16 10:26:47 +01:00
|
|
|
|
2022-05-07 17:27:15 +09:00
|
|
|
const sanitizers = {
|
2022-04-21 01:04:18 +09:00
|
|
|
get() {
|
2022-05-07 17:27:15 +09:00
|
|
|
return [];
|
2022-04-21 01:04:18 +09:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2021-02-16 10:26:47 +01:00
|
|
|
describe('Locales', () => {
|
|
|
|
describe('listLocales', () => {
|
|
|
|
test('can get locales', async () => {
|
|
|
|
const locales = [{ code: 'af', name: 'Afrikaans (af)' }];
|
|
|
|
const expectedLocales = [{ code: 'af', name: 'Afrikaans (af)', isDefault: true }];
|
|
|
|
const setIsDefault = jest.fn(() => expectedLocales);
|
|
|
|
const find = jest.fn(() => locales);
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
find,
|
|
|
|
setIsDefault,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
const ctx = {};
|
|
|
|
await listLocales(ctx);
|
|
|
|
|
|
|
|
expect(setIsDefault).toHaveBeenCalledWith(locales);
|
|
|
|
expect(find).toHaveBeenCalledWith();
|
|
|
|
expect(ctx.body).toMatchObject(expectedLocales);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('createLocale', () => {
|
|
|
|
test('can create a locale (isDefault: true)', async () => {
|
|
|
|
const locale = { code: 'af', name: 'Afrikaans (af)' };
|
|
|
|
const expectedLocales = { code: 'af', name: 'Afrikaans (af)', isDefault: true };
|
|
|
|
const getDefaultLocale = jest.fn(() => Promise.resolve('af'));
|
|
|
|
const setDefaultLocale = jest.fn(() => Promise.resolve());
|
|
|
|
|
|
|
|
const setIsDefault = jest.fn(() => expectedLocales);
|
|
|
|
const findByCode = jest.fn(() => undefined);
|
|
|
|
const create = jest.fn(() => Promise.resolve(locale));
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
findByCode,
|
|
|
|
setIsDefault,
|
|
|
|
getDefaultLocale,
|
|
|
|
setDefaultLocale,
|
|
|
|
create,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
const ctx = { request: { body: { ...locale, isDefault: true } }, state: { user: { id: 1 } } };
|
|
|
|
await createLocale(ctx);
|
|
|
|
|
|
|
|
expect(setIsDefault).toHaveBeenCalledWith(locale);
|
|
|
|
expect(setDefaultLocale).toHaveBeenCalledWith(locale);
|
|
|
|
expect(findByCode).toHaveBeenCalledWith('af');
|
2021-09-22 17:04:57 +02:00
|
|
|
expect(create).toHaveBeenCalledWith({ createdBy: 1, updatedBy: 1, ...locale });
|
2021-02-16 10:26:47 +01:00
|
|
|
expect(ctx.body).toMatchObject(expectedLocales);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('can create a locale (isDefault: false)', async () => {
|
|
|
|
const locale = { code: 'af', name: 'Afrikaans (af)' };
|
|
|
|
const expectedLocale = { code: 'af', name: 'Afrikaans (af)', isDefault: false };
|
|
|
|
const getDefaultLocale = jest.fn(() => Promise.resolve('en'));
|
|
|
|
|
|
|
|
const setIsDefault = jest.fn(() => expectedLocale);
|
|
|
|
const findByCode = jest.fn(() => undefined);
|
|
|
|
const create = jest.fn(() => Promise.resolve(locale));
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
findByCode,
|
|
|
|
setIsDefault,
|
|
|
|
getDefaultLocale,
|
|
|
|
create,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
const ctx = {
|
|
|
|
request: { body: { ...locale, isDefault: false } },
|
|
|
|
state: { user: { id: 1 } },
|
|
|
|
};
|
|
|
|
await createLocale(ctx);
|
|
|
|
|
|
|
|
expect(setIsDefault).toHaveBeenCalledWith(locale);
|
|
|
|
expect(findByCode).toHaveBeenCalledWith('af');
|
2021-09-22 17:04:57 +02:00
|
|
|
expect(create).toHaveBeenCalledWith({ createdBy: 1, updatedBy: 1, ...locale });
|
2021-02-16 10:26:47 +01:00
|
|
|
expect(ctx.body).toMatchObject(expectedLocale);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('cannot create a locale that already exists', async () => {
|
|
|
|
const locale = { code: 'af', name: 'Afrikaans (af)' };
|
|
|
|
const expectedLocale = { code: 'af', name: 'Afrikaans (af)', isDefault: false };
|
|
|
|
const getDefaultLocale = jest.fn(() => Promise.resolve('en'));
|
|
|
|
|
|
|
|
const setIsDefault = jest.fn(() => expectedLocale);
|
|
|
|
const findByCode = jest.fn(() => ({ name: 'other locale', code: 'af' }));
|
|
|
|
const create = jest.fn(() => Promise.resolve(locale));
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
findByCode,
|
|
|
|
setIsDefault,
|
|
|
|
getDefaultLocale,
|
|
|
|
create,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
const ctx = {
|
|
|
|
request: { body: { ...locale, isDefault: false } },
|
|
|
|
state: { user: { id: 1 } },
|
|
|
|
};
|
2021-10-20 17:30:05 +02:00
|
|
|
|
2021-10-27 18:54:58 +02:00
|
|
|
expect.assertions(4);
|
2021-10-20 17:30:05 +02:00
|
|
|
|
|
|
|
try {
|
|
|
|
await createLocale(ctx);
|
|
|
|
} catch (e) {
|
2021-10-27 18:54:58 +02:00
|
|
|
expect(e instanceof ApplicationError).toBe(true);
|
2021-10-20 17:30:05 +02:00
|
|
|
expect(e.message).toEqual('This locale already exists');
|
|
|
|
}
|
2021-02-16 10:26:47 +01:00
|
|
|
|
|
|
|
expect(findByCode).toHaveBeenCalledWith('af');
|
|
|
|
expect(create).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('updateLocale', () => {
|
|
|
|
test('can update a locale', async () => {
|
|
|
|
const updatedLocale = { name: 'Afrikaans', code: 'af' };
|
|
|
|
const existingLocale = { name: 'Afrikaans (af)', code: 'af' };
|
|
|
|
const updates = { name: 'Afrikaans' };
|
|
|
|
const expectedLocales = { code: 'af', name: 'Afrikaans', isDefault: true };
|
|
|
|
const setDefaultLocale = jest.fn(() => Promise.resolve());
|
|
|
|
|
|
|
|
const setIsDefault = jest.fn(() => expectedLocales);
|
|
|
|
const findById = jest.fn(() => existingLocale);
|
|
|
|
const update = jest.fn(() => Promise.resolve(updatedLocale));
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
findById,
|
|
|
|
setIsDefault,
|
|
|
|
setDefaultLocale,
|
|
|
|
update,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
const ctx = {
|
|
|
|
params: { id: 1 },
|
|
|
|
request: { body: { ...updates, isDefault: true } },
|
|
|
|
state: { user: { id: 1 } },
|
|
|
|
};
|
|
|
|
await updateLocale(ctx);
|
|
|
|
|
|
|
|
expect(setIsDefault).toHaveBeenCalledWith(updatedLocale);
|
|
|
|
expect(setDefaultLocale).toHaveBeenCalledWith(updatedLocale);
|
|
|
|
expect(findById).toHaveBeenCalledWith(1);
|
2021-09-22 17:04:57 +02:00
|
|
|
expect(update).toHaveBeenCalledWith({ id: 1 }, { updatedBy: 1, ...updates });
|
2021-02-16 10:26:47 +01:00
|
|
|
expect(ctx.body).toMatchObject(expectedLocales);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('cannot update the code of a locale', async () => {
|
|
|
|
const updatedLocale = { name: 'Afrikaans', code: 'af' };
|
|
|
|
const existingLocale = { name: 'Afrikaans (af)', code: 'af' };
|
|
|
|
const updates = { name: 'Afrikaans', code: 'fr' };
|
|
|
|
const expectedLocales = { code: 'af', name: 'Afrikaans', isDefault: true };
|
|
|
|
const setDefaultLocale = jest.fn(() => Promise.resolve());
|
|
|
|
|
|
|
|
const setIsDefault = jest.fn(() => expectedLocales);
|
|
|
|
const findById = jest.fn(() => existingLocale);
|
|
|
|
const update = jest.fn(() => Promise.resolve(updatedLocale));
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
findById,
|
|
|
|
setIsDefault,
|
|
|
|
setDefaultLocale,
|
|
|
|
update,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
const ctx = {
|
|
|
|
params: { id: 1 },
|
|
|
|
request: { body: { ...updates, isDefault: true } },
|
|
|
|
state: { user: { id: 1 } },
|
|
|
|
};
|
|
|
|
|
2021-10-27 18:54:58 +02:00
|
|
|
expect.assertions(6);
|
2021-10-20 17:30:05 +02:00
|
|
|
|
|
|
|
try {
|
|
|
|
await updateLocale(ctx);
|
|
|
|
} catch (e) {
|
2021-10-27 18:54:58 +02:00
|
|
|
expect(e instanceof ApplicationError).toBe(true);
|
2021-10-20 17:30:05 +02:00
|
|
|
expect(e.message).toEqual('this field has unspecified keys: code');
|
|
|
|
}
|
2021-02-16 10:26:47 +01:00
|
|
|
|
|
|
|
expect(findById).not.toHaveBeenCalled();
|
|
|
|
expect(update).not.toHaveBeenCalled();
|
|
|
|
expect(setIsDefault).not.toHaveBeenCalled();
|
|
|
|
expect(setDefaultLocale).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('deleteLocale', () => {
|
|
|
|
test('can delete a locale', async () => {
|
|
|
|
const locale = { code: 'af', name: 'Afrikaans (af)' };
|
|
|
|
const expectedLocales = { code: 'af', name: 'Afrikaans (af)', isDefault: false };
|
|
|
|
const getDefaultLocale = jest.fn(() => Promise.resolve('en'));
|
|
|
|
|
|
|
|
const setIsDefault = jest.fn(() => expectedLocales);
|
|
|
|
const findById = jest.fn(() => locale);
|
|
|
|
const deleteFn = jest.fn();
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
findById,
|
|
|
|
setIsDefault,
|
|
|
|
getDefaultLocale,
|
|
|
|
delete: deleteFn,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
const ctx = { params: { id: 1 } };
|
|
|
|
await deleteLocale(ctx);
|
|
|
|
|
|
|
|
expect(setIsDefault).toHaveBeenCalledWith(locale);
|
|
|
|
expect(findById).toHaveBeenCalledWith(1);
|
|
|
|
expect(deleteFn).toHaveBeenCalledWith({ id: 1 });
|
|
|
|
expect(ctx.body).toMatchObject(expectedLocales);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('cannot delete the default locale', async () => {
|
|
|
|
const locale = { code: 'af', name: 'Afrikaans (af)' };
|
|
|
|
const expectedLocales = { code: 'af', name: 'Afrikaans (af)', isDefault: false };
|
|
|
|
const getDefaultLocale = jest.fn(() => Promise.resolve('af'));
|
|
|
|
|
|
|
|
const setIsDefault = jest.fn(() => Promise.resolve(expectedLocales));
|
|
|
|
const findById = jest.fn(() => Promise.resolve(locale));
|
|
|
|
const deleteFn = jest.fn();
|
2021-08-02 18:09:29 +02:00
|
|
|
const getModel = jest.fn(() => localeModel.schema);
|
2021-02-16 10:26:47 +01:00
|
|
|
global.strapi = {
|
|
|
|
getModel,
|
|
|
|
plugins: {
|
|
|
|
i18n: {
|
|
|
|
services: {
|
|
|
|
locales: {
|
|
|
|
findById,
|
|
|
|
getDefaultLocale,
|
|
|
|
delete: deleteFn,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-05-07 17:27:15 +09:00
|
|
|
sanitizers,
|
2021-02-16 10:26:47 +01:00
|
|
|
};
|
|
|
|
|
2021-10-20 17:30:05 +02:00
|
|
|
const ctx = { params: { id: 1 } };
|
|
|
|
|
2021-10-27 18:54:58 +02:00
|
|
|
expect.assertions(5);
|
2021-02-16 10:26:47 +01:00
|
|
|
|
2021-10-20 17:30:05 +02:00
|
|
|
try {
|
|
|
|
await deleteLocale(ctx);
|
|
|
|
} catch (e) {
|
2021-10-27 18:54:58 +02:00
|
|
|
expect(e instanceof ApplicationError).toBe(true);
|
2021-10-20 17:30:05 +02:00
|
|
|
expect(e.message).toEqual('Cannot delete the default locale');
|
|
|
|
}
|
2021-02-16 10:26:47 +01:00
|
|
|
|
|
|
|
expect(findById).toHaveBeenCalledWith(1);
|
|
|
|
expect(setIsDefault).not.toHaveBeenCalled();
|
|
|
|
expect(deleteFn).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|