diff --git a/packages/strapi-admin/services/__tests__/metrics.test.js b/packages/strapi-admin/services/__tests__/metrics.test.js new file mode 100644 index 0000000000..3ceac0022c --- /dev/null +++ b/packages/strapi-admin/services/__tests__/metrics.test.js @@ -0,0 +1,24 @@ +'use strict'; + +const metricsService = require('../metrics'); + +describe('Metrics', () => { + test('sendDidInviteUser', async () => { + const send = jest.fn(() => Promise.resolve()); + const countUsers = jest.fn(() => Promise.resolve(2)); + const countRoles = jest.fn(() => Promise.resolve(3)); + global.strapi = { + telemetry: { send }, + admin: { + services: { + user: { count: countUsers }, + role: { count: countRoles }, + }, + }, + }; + + await metricsService.sendDidInviteUser(); + + expect(send).toHaveBeenCalledWith('didInviteUser', { numberOfRoles: 3, numberOfUsers: 2 }); + }); +}); diff --git a/packages/strapi-admin/services/__tests__/user.test.js b/packages/strapi-admin/services/__tests__/user.test.js index 43622c459b..fbcf734654 100644 --- a/packages/strapi-admin/services/__tests__/user.test.js +++ b/packages/strapi-admin/services/__tests__/user.test.js @@ -27,7 +27,7 @@ describe('User', () => { describe('create', () => { const count = jest.fn(() => Promise.resolve(1)); - const send = jest.fn(); + const sendDidInviteUser = jest.fn(); test('Creates a user by merging given and default attributes', async () => { const create = jest.fn(user => Promise.resolve(user)); @@ -35,12 +35,12 @@ describe('User', () => { const hashPassword = jest.fn(() => Promise.resolve('123456789')); global.strapi = { - telemetry: { send }, admin: { services: { token: { createToken }, auth: { hashPassword }, role: { count }, + metrics: { sendDidInviteUser }, }, }, query() { @@ -64,12 +64,12 @@ describe('User', () => { const hashPassword = jest.fn(() => Promise.resolve('123456789')); global.strapi = { - telemetry: { send }, admin: { services: { token: { createToken }, auth: { hashPassword }, role: { count }, + metrics: { sendDidInviteUser }, }, }, query() { @@ -106,12 +106,12 @@ describe('User', () => { const hashPassword = jest.fn(() => Promise.resolve('123456789')); global.strapi = { - telemetry: { send }, admin: { services: { token: { createToken }, auth: { hashPassword }, role: { count }, + metrics: { sendDidInviteUser }, }, }, query() { diff --git a/packages/strapi-admin/services/metrics.js b/packages/strapi-admin/services/metrics.js new file mode 100644 index 0000000000..266b5b5ded --- /dev/null +++ b/packages/strapi-admin/services/metrics.js @@ -0,0 +1,11 @@ +'use strict'; + +const sendDidInviteUser = async () => { + const numberOfUsers = await strapi.admin.services.user.count(); + const numberOfRoles = await strapi.admin.services.role.count(); + return strapi.telemetry.send('didInviteUser', { numberOfRoles, numberOfUsers }); +}; + +module.exports = { + sendDidInviteUser, +}; diff --git a/packages/strapi-admin/services/role.js b/packages/strapi-admin/services/role.js index c0f2f008a8..8c19b350e0 100644 --- a/packages/strapi-admin/services/role.js +++ b/packages/strapi-admin/services/role.js @@ -120,9 +120,9 @@ const exists = async params => { }; /** - * Count the number of users based on params - * @param params - * @returns {Promise<*>} + * Count the number of roles based on search params + * @param params params used for the query + * @returns {Promise} */ const count = async (params = {}) => { return strapi.query('role', 'admin').count(params); diff --git a/packages/strapi-admin/services/user.js b/packages/strapi-admin/services/user.js index a8b52a3279..3937982a29 100644 --- a/packages/strapi-admin/services/user.js +++ b/packages/strapi-admin/services/user.js @@ -24,23 +24,19 @@ const sanitizeUser = user => { * @returns {Promise} */ const create = async attributes => { - const user = createUser({ + const userInfo = { registrationToken: strapi.admin.services.token.createToken(), ...attributes, - }); + }; - if (_.has(user, 'password')) { - user.password = await strapi.admin.services.auth.hashPassword(user.password); + if (_.has(attributes, 'password')) { + userInfo.password = await strapi.admin.services.auth.hashPassword(attributes.password); } + const user = createUser(userInfo); const createdUser = await strapi.query('user', 'admin').create(user); - if (createdUser) { - const numberOfUsers = await count(); - const numberOfRoles = await strapi.admin.services.role.count(); - - await strapi.telemetry.send('didInviteUser', { numberOfRoles, numberOfUsers }); - } + await strapi.admin.services.metrics.sendDidInviteUser(); return createdUser; }; @@ -241,12 +237,12 @@ const countUsersWithoutRole = async () => { }; /** - * Count number of users based on attributes - * @param attributes the filters used to filter the search + * Count the number of users based on search params + * @param params params used for the query * @returns {Promise} */ -const count = async (attributes = {}) => { - return strapi.query('user', 'admin').count(attributes); +const count = async (params = {}) => { + return strapi.query('user', 'admin').count(params); }; /** Assign some roles to several users diff --git a/packages/strapi/lib/services/metrics/__tests__/index.test.js b/packages/strapi/lib/services/metrics/__tests__/index.test.js index e957c03ab5..10b4ac6a1a 100644 --- a/packages/strapi/lib/services/metrics/__tests__/index.test.js +++ b/packages/strapi/lib/services/metrics/__tests__/index.test.js @@ -59,6 +59,15 @@ describe('metrics', () => { send('someEvent'); expect(fetch).toHaveBeenCalled(); + expect(fetch.mock.calls[0][0]).toBe('https://analytics.strapi.io/track'); + expect(fetch.mock.calls[0][1].method).toBe('POST'); + expect(JSON.parse(fetch.mock.calls[0][1].body)).toMatchObject({ + event: 'someEvent', + uuid: 'test', + properties: { + projectType: 'Community', + }, + }); fetch.mockClear(); });