338 lines
10 KiB
JavaScript
Raw Normal View History

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 = {
get() {
2022-05-07 17:27:15 +09:00
return [];
},
};
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();
});
});
});