diff --git a/apps/condo/domains/banking/schema/BankSyncTask.test.js b/apps/condo/domains/banking/schema/BankSyncTask.test.js index 3186a24d533..f771484c5f0 100644 --- a/apps/condo/domains/banking/schema/BankSyncTask.test.js +++ b/apps/condo/domains/banking/schema/BankSyncTask.test.js @@ -902,6 +902,7 @@ describe('BankSyncTask', () => { const updatedTask2 = await BankSyncTask.getOne(adminClient, { id: task2.id }) expect(updatedTask2.status).toEqual(TASK_ERROR_STATUS) + // TODO(pahaz): refactor this code it's locale specific! expect(updatedTask2.meta.errorMessage).toEqual(i18n(TRANSACTIONS_NOT_ADDED.messageForUser)) expect(updatedTask2.meta).toBeTruthy() expect(updatedTask2.meta).toMatchObject({ diff --git a/apps/condo/domains/organization/schema/ReplaceOrganizationEmployeeRoleService.test.js b/apps/condo/domains/organization/schema/ReplaceOrganizationEmployeeRoleService.test.js index 6cab8c65288..0b3e84b4511 100644 --- a/apps/condo/domains/organization/schema/ReplaceOrganizationEmployeeRoleService.test.js +++ b/apps/condo/domains/organization/schema/ReplaceOrganizationEmployeeRoleService.test.js @@ -327,6 +327,7 @@ describe('ReplaceOrganizationEmployeeRoleService', () => { name: 'GQLError', path: ['result'], message: ERRORS.ROLES_ARE_BEING_PROCESSED.message, + // TODO(pahaz): you should refactor it somehow! it's a bad example! extensions: expect.objectContaining(omit(ERRORS.ROLES_ARE_BEING_PROCESSED, 'messageForUser')), }), ], diff --git a/apps/dev-api/domains/user/schema/RegisterNewUserService.test.js b/apps/dev-api/domains/user/schema/RegisterNewUserService.test.js index a52749abf26..93b3da975e5 100644 --- a/apps/dev-api/domains/user/schema/RegisterNewUserService.test.js +++ b/apps/dev-api/domains/user/schema/RegisterNewUserService.test.js @@ -139,7 +139,7 @@ describe('RegisterNewUserService', () => { 'type': 'PASSWORD_TOO_SIMPLE', 'code': 'BAD_USER_INPUT', 'message': 'The provided password is too simple', - 'messageForUser': 'errors.PASSWORD_TOO_SIMPLE.message', + 'messageForUser': 'api.user.user.PASSWORD_TOO_SIMPLE', }, ) }) diff --git a/packages/keystone/apolloErrorFormatter.spec.js b/packages/keystone/apolloErrorFormatter.spec.js index 4fe49035d61..9d1a649dc09 100644 --- a/packages/keystone/apolloErrorFormatter.spec.js +++ b/packages/keystone/apolloErrorFormatter.spec.js @@ -406,7 +406,6 @@ describe('safeFormatError hide=false', () => { code: 'INTERNAL_ERROR', type: 'SOME_TYPE', 'message': 'string and 1', - 'messageTemplate': message1, messageInterpolation: { foo: 'string', bar: 1, @@ -790,7 +789,6 @@ describe('safeFormatError hide=false', () => { 'min': 8, }, 'message': 'Password length must be between 8 and 128 characters', - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'variable': [ 'data', 'password', @@ -812,7 +810,6 @@ describe('safeFormatError hide=false', () => { 'min': 8, }, 'message': passwordLengthErrorMessage, - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'variable': [ 'data', 'password', @@ -832,7 +829,6 @@ describe('safeFormatError hide=false', () => { 'min': 8, }, 'message': 'Password length must be between 8 and 128 characters', - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'variable': [ 'data', 'password', @@ -900,7 +896,6 @@ describe('safeFormatError hide=false', () => { 'min': 8, }, 'message': 'Password length must be between 8 and 128 characters', - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'variable': [ 'data', 'password', @@ -925,7 +920,6 @@ describe('safeFormatError hide=false', () => { 'min': 8, }, 'message': passwordLengthErrorMessage, - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'variable': [ 'data', 'password', @@ -995,7 +989,6 @@ describe('safeFormatError hide=false', () => { 'min': 8, }, 'message': 'Password length must be between 8 and 128 characters', - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'variable': [ 'data', 'password', @@ -1020,7 +1013,6 @@ describe('safeFormatError hide=false', () => { 'min': 8, }, 'message': passwordLengthErrorMessage, - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'variable': [ 'data', 'password', @@ -1040,7 +1032,6 @@ describe('safeFormatError hide=false', () => { 'max': 128, 'min': 8, }, - 'messageTemplate': 'Password length must be between {min} and {max} characters', 'type': 'INVALID_PASSWORD_LENGTH', 'variable': [ 'data', diff --git a/packages/keystone/errors.js b/packages/keystone/errors.js index f6c08bd5a18..d7e90a2cfe0 100644 --- a/packages/keystone/errors.js +++ b/packages/keystone/errors.js @@ -197,7 +197,6 @@ class GQLError extends Error { } } if (!isEmpty(fields.messageInterpolation)) { - if (fields.message.includes('{')) extensions.messageTemplate = fields.message if (fields.message === extensions.message) { // TODO(pahaz): DOMA-10345 throw error for that cases! Waiting for apps refactoring console.warn( diff --git a/packages/keystone/test.utils.js b/packages/keystone/test.utils.js index eebf84a9526..e4d5727c65a 100644 --- a/packages/keystone/test.utils.js +++ b/packages/keystone/test.utils.js @@ -797,20 +797,29 @@ function createRegExByTemplate (template, { eol = true, sol = true } = {}) { const expectToThrowGQLError = async (testFunc, errorFields, path = 'obj') => { if (isEmpty(errorFields) || typeof errorFields !== 'object') throw new Error('expectToThrowGQLError(): wrong errorFields argument') if (!errorFields.code || !errorFields.type) throw new Error('expectToThrowGQLError(): errorFields argument: no code or no type') + if (errorFields.messageForUserTemplateKey) throw new Error('expectToThrowGQLError(): you do not really need to use `messageForUserTemplateKey` key! You should pass it as `messageForUser` value! Look like a developer error!') + if (errorFields.messageForUserTemplate) throw new Error('expectToThrowGQLError(): you do not really need to use `messageForUserTemplate` key! You should pass right `messageForUser` value! Look like a developer error!') + if (errorFields.messageForUser && !errorFields.messageForUser.startsWith('api.')) { + // TODO(pahaz): DOMA-10345 strongly check it and throw error! + console.warn('expectToThrowGQLError(): developer error! `messageForUser` should starts with `api.`') + } if (!errorFields.message) { // TODO(pahaz): DOMA-10345 strongly check it! console.warn('expectToThrowGQLError(): errorFields message argument is required') // throw new Error('expectToThrowGQLError(): errorFields message argument is required') } const fieldsToCheck = { ...errorFields } - if (errorFields.messageInterpolation) { + if (!isEmpty(errorFields.messageInterpolation)) { fieldsToCheck['message'] = template(errorFields.message)(errorFields.messageInterpolation) - fieldsToCheck['messageTemplate'] = errorFields.message } if (errorFields.messageForUser) { const locale = conf.DEFAULT_LOCALE const translations = getTranslations(locale) const translatedMessage = translations[errorFields.messageForUser] + if (!translatedMessage) { + // TODO(pahaz): DOMA-10345 throw new error! + console.warn('expectToThrowGQLError! you do not have translation key', errorFields.messageForUser) + } if (errorFields.messageInterpolation) fieldsToCheck['messageForUserTemplate'] = translatedMessage const interpolatedMessageForUser = template(translatedMessage)(errorFields.messageInterpolation) if (!interpolatedMessageForUser) throw new Error(`expectToThrowGQLError(): you need to set ${errorFields.messageForUser} for locale=${locale}`) @@ -822,7 +831,6 @@ const expectToThrowGQLError = async (testFunc, errorFields, path = 'obj') => { // it means we want to use RegExp for our tests. Check @examples if (errorFields?.message?.includes('{')) { fieldsToCheck['message'] = expect.stringMatching(createRegExByTemplate(errorFields.message)) - fieldsToCheck['messageTemplate'] = errorFields.message } await catchErrorFrom(testFunc, (caught) => {