From 1872bce5a5a1b947e4fc14d8c60c66bc2c95b60a Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Tue, 28 Jan 2025 12:29:48 +0100 Subject: [PATCH 1/8] feat(api): Add a new migration --- ...-to-certification-center-invitations-table.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 api/db/migrations/20250128112736_add-locale-column-to-certification-center-invitations-table.js diff --git a/api/db/migrations/20250128112736_add-locale-column-to-certification-center-invitations-table.js b/api/db/migrations/20250128112736_add-locale-column-to-certification-center-invitations-table.js new file mode 100644 index 00000000000..fa932b0ccc6 --- /dev/null +++ b/api/db/migrations/20250128112736_add-locale-column-to-certification-center-invitations-table.js @@ -0,0 +1,16 @@ +const TABLE_NAME = 'certification-center-invitations'; +const COLUMN_NAME = 'locale'; + +const up = async function (knex) { + await knex.schema.table(TABLE_NAME, function (table) { + table.string(COLUMN_NAME).defaultTo('fr'); + }); +}; + +const down = async function (knex) { + await knex.schema.table(TABLE_NAME, function (table) { + table.dropColumn(COLUMN_NAME); + }); +}; + +export { down, up }; From d8a2ad7da25a0e02e82ee978c441f53180f5bb0d Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Mon, 27 Jan 2025 13:48:34 +0100 Subject: [PATCH 2/8] feat(api): Add locale to database builder --- .../factory/build-certification-center-invitation.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/db/database-builder/factory/build-certification-center-invitation.js b/api/db/database-builder/factory/build-certification-center-invitation.js index 990718f40fc..e9f61526c39 100644 --- a/api/db/database-builder/factory/build-certification-center-invitation.js +++ b/api/db/database-builder/factory/build-certification-center-invitation.js @@ -8,6 +8,7 @@ const buildCertificationCenterInvitation = function ({ email = 'anemail@example.net', status = 'pending', role = 'MEMBER', + locale = 'fr', code = 'ABCDEF123', createdAt = new Date(), updatedAt = new Date(), @@ -18,6 +19,7 @@ const buildCertificationCenterInvitation = function ({ email, status, role, + locale, code, createdAt, updatedAt, From f09466e97831d112f092e39b88f928407c576f63 Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Mon, 27 Jan 2025 14:55:47 +0100 Subject: [PATCH 3/8] feat(api): Add locale to service --- .../models/CertificationCenterInvitation.js | 17 +++++++++++++++-- .../CertificationCenterInvitation_test.js | 4 ++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/api/src/team/domain/models/CertificationCenterInvitation.js b/api/src/team/domain/models/CertificationCenterInvitation.js index aa4e2346ed4..e161947552c 100644 --- a/api/src/team/domain/models/CertificationCenterInvitation.js +++ b/api/src/team/domain/models/CertificationCenterInvitation.js @@ -24,6 +24,7 @@ const validationScheme = Joi.object({ role: Joi.string() .valid(...Object.values(roles)) .optional(), + locale: Joi.string().optional(), updatedAt: Joi.date().optional(), status: Joi.string() .valid(...Object.values(statuses)) @@ -34,11 +35,22 @@ const validationScheme = Joi.object({ }); export class CertificationCenterInvitation { - constructor({ id, email, updatedAt, role, status, certificationCenterId, certificationCenterName, code } = {}) { + constructor({ + id, + email, + updatedAt, + role, + locale, + status, + certificationCenterId, + certificationCenterName, + code, + } = {}) { this.id = id; this.email = email; this.updatedAt = updatedAt; this.role = role; + this.locale = locale; this.status = status; this.certificationCenterId = certificationCenterId; this.certificationCenterName = certificationCenterName; @@ -47,7 +59,7 @@ export class CertificationCenterInvitation { validateEntity(validationScheme, this); } - static create({ email, certificationCenterId, updatedAt = new Date(), code = this.generateCode(), role }) { + static create({ email, certificationCenterId, updatedAt = new Date(), code = this.generateCode(), role, locale }) { const certificationCenterToCreate = new CertificationCenterInvitation({ email, certificationCenterId, @@ -55,6 +67,7 @@ export class CertificationCenterInvitation { updatedAt, code, role, + locale, }); delete certificationCenterToCreate.id; delete certificationCenterToCreate.certificationCenterName; diff --git a/api/tests/team/unit/domain/models/CertificationCenterInvitation_test.js b/api/tests/team/unit/domain/models/CertificationCenterInvitation_test.js index 03979948b34..ba5c2d57e82 100644 --- a/api/tests/team/unit/domain/models/CertificationCenterInvitation_test.js +++ b/api/tests/team/unit/domain/models/CertificationCenterInvitation_test.js @@ -16,6 +16,7 @@ describe('Unit | Domain | Models | CertificationCenterInvitation', function () { updatedAt: today, status: 'pending', role: 'ADMIN', + locale: 'fr', certificationCenterId: 10, certificationCenterName: 'La Raclette des Pixous', code: 'ABCDE', @@ -38,6 +39,7 @@ describe('Unit | Domain | Models | CertificationCenterInvitation', function () { updatedAt: today, status: 'pending', role: 'SUPER', + locale: 'fr', certificationCenterId: 10, certificationCenterName: 'La Raclette des Pixous', }; @@ -133,6 +135,7 @@ describe('Unit | Domain | Models | CertificationCenterInvitation', function () { updatedAt: now, code: '666AAALLL9', role: 'ADMIN', + locale: 'fr', }); // /then @@ -144,6 +147,7 @@ describe('Unit | Domain | Models | CertificationCenterInvitation', function () { updatedAt: now, code: '666AAALLL9', role: 'ADMIN', + locale: 'fr', }); }); }); From b10c8c082e380b45505420f9bf47337a55670f61 Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Mon, 27 Jan 2025 15:03:48 +0100 Subject: [PATCH 4/8] feat(api): Add locale to repositories --- .../certification-center-invitation-repository.js | 7 ++++--- .../certification-center-invited-user.repository.js | 3 ++- .../certification-center-invited-user.repository.test.js | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/src/team/infrastructure/repositories/certification-center-invitation-repository.js b/api/src/team/infrastructure/repositories/certification-center-invitation-repository.js index 68626a1657b..2b2af664f2b 100644 --- a/api/src/team/infrastructure/repositories/certification-center-invitation-repository.js +++ b/api/src/team/infrastructure/repositories/certification-center-invitation-repository.js @@ -10,6 +10,7 @@ function _toDomain(invitationDTO) { email: invitationDTO.email, code: invitationDTO.code, role: invitationDTO.role, + locale: invitationDTO.locale, updatedAt: invitationDTO.updatedAt, certificationCenterId: invitationDTO.certificationCenterId, certificationCenterName: invitationDTO.certificationCenterName, @@ -24,7 +25,7 @@ function _toDomain(invitationDTO) { */ const findPendingByCertificationCenterId = async function ({ certificationCenterId }) { const pendingCertificationCenterInvitations = await knex(CERTIFICATION_CENTER_INVITATIONS) - .select('id', 'email', 'certificationCenterId', 'updatedAt', 'role') + .select('id', 'email', 'certificationCenterId', 'updatedAt', 'role', 'locale') .where({ certificationCenterId, status: CertificationCenterInvitation.StatusType.PENDING }) .orderBy('updatedAt', 'desc'); return pendingCertificationCenterInvitations.map(_toDomain); @@ -96,7 +97,7 @@ const findOnePendingByEmailAndCertificationCenterId = async function ({ email, c const create = async function (invitation) { const [newInvitation] = await knex(CERTIFICATION_CENTER_INVITATIONS) .insert(invitation) - .returning(['id', 'email', 'code', 'certificationCenterId', 'updatedAt', 'role']); + .returning(['id', 'email', 'code', 'certificationCenterId', 'updatedAt', 'role', 'locale']); const { name: certificationCenterName } = await knex('certification-centers') .select('name') @@ -115,7 +116,7 @@ const update = async function (certificationCenterInvitation) { const [updatedCertificationCenterInvitation] = await knex('certification-center-invitations') .update({ updatedAt: new Date() }) .where({ id: certificationCenterInvitation.id }) - .returning(['id', 'email', 'code', 'certificationCenterId', 'updatedAt', 'role']); + .returning(['id', 'email', 'code', 'certificationCenterId', 'updatedAt', 'role', 'locale']); const { name: certificationCenterName } = await knex('certification-centers') .select('name') diff --git a/api/src/team/infrastructure/repositories/certification-center-invited-user.repository.js b/api/src/team/infrastructure/repositories/certification-center-invited-user.repository.js index 233a9068106..e2e63f684bd 100644 --- a/api/src/team/infrastructure/repositories/certification-center-invited-user.repository.js +++ b/api/src/team/infrastructure/repositories/certification-center-invited-user.repository.js @@ -4,7 +4,7 @@ import { CertificationCenterInvitedUser } from '../../domain/models/Certificatio const get = async function ({ certificationCenterInvitationId, email }) { const invitation = await knex('certification-center-invitations') - .select('id', 'certificationCenterId', 'code', 'status', 'role') + .select('id', 'certificationCenterId', 'code', 'status', 'role', 'locale') .where({ id: certificationCenterInvitationId }) .first(); if (!invitation) { @@ -21,6 +21,7 @@ const get = async function ({ certificationCenterInvitationId, email }) { invitation, status: invitation.status, role: invitation.role, + locale: invitation.locale, }); }; diff --git a/api/tests/team/integration/infrastructure/repositories/certification-center-invited-user.repository.test.js b/api/tests/team/integration/infrastructure/repositories/certification-center-invited-user.repository.test.js index 5bbac4a5f7c..68518e205ae 100644 --- a/api/tests/team/integration/infrastructure/repositories/certification-center-invited-user.repository.test.js +++ b/api/tests/team/integration/infrastructure/repositories/certification-center-invited-user.repository.test.js @@ -36,6 +36,7 @@ describe('Integration | Team | Infrastructure | Repositories | CertificationCent code: 'ABCDE123', status: 'pending', role: CertificationCenterInvitation.Roles.MEMBER, + locale: certificationCenterInvitation.locale, }; // when @@ -53,6 +54,7 @@ describe('Integration | Team | Infrastructure | Repositories | CertificationCent invitation, status: certificationCenterInvitation.status, role: CertificationCenterInvitation.Roles.MEMBER, + locale: certificationCenterInvitation.locale, }), ); }); From c193bc71adac07941999b99a0f755e0dbed83b5f Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Mon, 27 Jan 2025 15:12:39 +0100 Subject: [PATCH 5/8] feat(api): Transforme locale to language in serializer --- .../jsonapi/certification-center-invitation-serializer.js | 8 +++++++- .../certification-center-invitation-serializer_test.js | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/api/src/team/infrastructure/serializers/jsonapi/certification-center-invitation-serializer.js b/api/src/team/infrastructure/serializers/jsonapi/certification-center-invitation-serializer.js index efbeb8e984e..171cb7a2f4d 100644 --- a/api/src/team/infrastructure/serializers/jsonapi/certification-center-invitation-serializer.js +++ b/api/src/team/infrastructure/serializers/jsonapi/certification-center-invitation-serializer.js @@ -10,7 +10,13 @@ const serialize = function (invitations) { const serializeForAdmin = function (invitations) { return new Serializer('certification-center-invitations', { - attributes: ['email', 'updatedAt', 'role'], + transform: (invitation) => { + return { + ...invitation, + language: invitation.locale, + }; + }, + attributes: ['email', 'updatedAt', 'role', 'language'], }).serialize(invitations); }; diff --git a/api/tests/team/unit/infrastructure/serializers/jsonapi/certification-center-invitation-serializer_test.js b/api/tests/team/unit/infrastructure/serializers/jsonapi/certification-center-invitation-serializer_test.js index 434befd62a5..2a978622276 100644 --- a/api/tests/team/unit/infrastructure/serializers/jsonapi/certification-center-invitation-serializer_test.js +++ b/api/tests/team/unit/infrastructure/serializers/jsonapi/certification-center-invitation-serializer_test.js @@ -40,6 +40,7 @@ describe('Unit | Team | Serializer | JSONAPI | certification-center-invitation-s certificationCenterId: 666, email: 'anne.atole@example.net', role: 'MEMBER', + locale: 'fr', updatedAt: now, }); @@ -55,6 +56,7 @@ describe('Unit | Team | Serializer | JSONAPI | certification-center-invitation-s email: 'anne.atole@example.net', 'updated-at': now, role: 'MEMBER', + language: 'fr', }, }, }); From a11e125a08804df7e36fde72976c63c358cab435 Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Mon, 27 Jan 2025 15:34:23 +0100 Subject: [PATCH 6/8] feat(api): Pass the locale to usecases --- ...eate-or-update-certification-center-invitation-for-admin.js | 2 +- .../application/certification-center-invitations/index_test.js | 1 + .../certification-center-invitation.admin.route.test.js | 3 +++ ...or-update-certification-center-invitation-for-admin_test.js | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/api/src/team/domain/usecases/create-or-update-certification-center-invitation-for-admin.js b/api/src/team/domain/usecases/create-or-update-certification-center-invitation-for-admin.js index a9600376ce1..41b7a6c2e5c 100644 --- a/api/src/team/domain/usecases/create-or-update-certification-center-invitation-for-admin.js +++ b/api/src/team/domain/usecases/create-or-update-certification-center-invitation-for-admin.js @@ -23,7 +23,7 @@ const createOrUpdateCertificationCenterInvitationForAdmin = async function ({ const shouldCreateInvitation = !alreadyExistingPendingInvitationForThisEmail; if (shouldCreateInvitation) { - const newInvitation = CertificationCenterInvitation.create({ email, role, certificationCenterId }); + const newInvitation = CertificationCenterInvitation.create({ email, role, locale, certificationCenterId }); certificationCenterInvitation = await certificationCenterInvitationRepository.create(newInvitation); isInvitationCreated = true; } else { diff --git a/api/tests/acceptance/application/certification-center-invitations/index_test.js b/api/tests/acceptance/application/certification-center-invitations/index_test.js index 6560e31d1cf..9b7be602f69 100644 --- a/api/tests/acceptance/application/certification-center-invitations/index_test.js +++ b/api/tests/acceptance/application/certification-center-invitations/index_test.js @@ -61,6 +61,7 @@ describe('Acceptance | API | Certification center invitations', function () { attributes: { email: updatedCertificationCenterInvitation.email, role: updatedCertificationCenterInvitation.role, + language: updatedCertificationCenterInvitation.locale, 'updated-at': updatedCertificationCenterInvitation.updatedAt, }, }, diff --git a/api/tests/team/acceptance/application/certification-center-invitation/certification-center-invitation.admin.route.test.js b/api/tests/team/acceptance/application/certification-center-invitation/certification-center-invitation.admin.route.test.js index 45fd3085053..299b123f949 100644 --- a/api/tests/team/acceptance/application/certification-center-invitation/certification-center-invitation.admin.route.test.js +++ b/api/tests/team/acceptance/application/certification-center-invitation/certification-center-invitation.admin.route.test.js @@ -58,6 +58,7 @@ describe('Acceptance | Team | Application | Route | Admin | Certification Center attributes: { email: 'alex.terieur@example.net', role: 'MEMBER', + language: 'fr', 'updated-at': now, }, }, @@ -67,6 +68,7 @@ describe('Acceptance | Team | Application | Route | Admin | Certification Center attributes: { email: 'sarah.pelle@example.net', role: 'ADMIN', + language: 'fr', 'updated-at': now, }, }, @@ -119,6 +121,7 @@ describe('Acceptance | Team | Application | Route | Admin | Certification Center 'updated-at': now, email: 'some.user@example.net', role: 'ADMIN', + language: 'fr', }); }); }); diff --git a/api/tests/team/integration/domain/usecases/create-or-update-certification-center-invitation-for-admin_test.js b/api/tests/team/integration/domain/usecases/create-or-update-certification-center-invitation-for-admin_test.js index 7fb65061b1a..ecea6bdd6a6 100644 --- a/api/tests/team/integration/domain/usecases/create-or-update-certification-center-invitation-for-admin_test.js +++ b/api/tests/team/integration/domain/usecases/create-or-update-certification-center-invitation-for-admin_test.js @@ -50,6 +50,7 @@ describe('Integration | Team | UseCase | create-or-update-certification-center-i certificationCenterId, mailService, role: 'MEMBER', + locale: 'fr', }); // then @@ -69,6 +70,7 @@ describe('Integration | Team | UseCase | create-or-update-certification-center-i certificationCenterName: 'Centre des Pixous', updatedAt: now, role: 'MEMBER', + locale: 'fr', }); expect(result.certificationCenterInvitation.code).to.exist; }); @@ -109,6 +111,7 @@ describe('Integration | Team | UseCase | create-or-update-certification-center-i updatedAt: now, code: 'AAALLLPPP1', role: 'MEMBER', + locale: 'fr', }); }); From ccac159ddbbe1a0a7c0085bc6ed2bd99020ebf72 Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Thu, 23 Jan 2025 14:31:37 +0100 Subject: [PATCH 7/8] feat(admin): Add a button to send a new certification center invitation --- .../certification-centers/invitations.gjs | 35 ++++++++---- .../certification-centers/get/invitations.js | 20 +++++++ .../models/certification-center-invitation.js | 1 + .../certification-center-invitations.scss | 14 +++++ .../certification-centers/get/invitations.hbs | 1 + .../invitations-test.gjs | 2 + .../get/invitations-test.js | 53 +++++++++++++++++++ 7 files changed, 116 insertions(+), 10 deletions(-) diff --git a/admin/app/components/certification-centers/invitations.gjs b/admin/app/components/certification-centers/invitations.gjs index 743195c8bb3..0e793b4d301 100644 --- a/admin/app/components/certification-centers/invitations.gjs +++ b/admin/app/components/certification-centers/invitations.gjs @@ -1,9 +1,13 @@ import PixButton from '@1024pix/pix-ui/components/pix-button'; import { fn } from '@ember/helper'; +import { service } from '@ember/service'; import Component from '@glimmer/component'; import dayjsFormat from 'ember-dayjs/helpers/dayjs-format'; +import { t } from 'ember-intl'; export default class CertificationCenterInvitations extends Component { + @service intl; + get sortedCertificationCenterInvitations() { return this.args.certificationCenterInvitations.sortBy('updatedAt').reverse(); } @@ -32,16 +36,27 @@ export default class CertificationCenterInvitations extends Component { {{invitation.roleLabel}} {{dayjsFormat invitation.updatedAt "DD/MM/YYYY [-] HH:mm"}} - - Annuler l’invitation - +
+ + {{t "common.invitations.send-new"}} + + + Annuler l’invitation + +
{{/each}} diff --git a/admin/app/controllers/authenticated/certification-centers/get/invitations.js b/admin/app/controllers/authenticated/certification-centers/get/invitations.js index 2607515fde0..59ded0ced26 100644 --- a/admin/app/controllers/authenticated/certification-centers/get/invitations.js +++ b/admin/app/controllers/authenticated/certification-centers/get/invitations.js @@ -7,6 +7,7 @@ import isEmailValid from '../../../../utils/email-validator'; export default class AuthenticatedCertificationCentersGetInvitationsController extends Controller { @service accessControl; + @service intl; @service pixToast; @service errorResponseHandler; @service store; @@ -49,6 +50,25 @@ export default class AuthenticatedCertificationCentersGetInvitationsController e this.isLoading = false; } + @action + async sendNewCertificationCenterInvitation(certificationCenterInvitation) { + const { email, language, role } = certificationCenterInvitation; + try { + await this.store.queryRecord('certification-center-invitation', { + email, + language, + role, + certificationCenterId: this.model.certificationCenterId, + }); + + this.pixToast.sendSuccessNotification({ + message: this.intl.t('common.invitations.send-new-confirm', { invitationEmail: email }), + }); + } catch (err) { + this.errorResponseHandler.notify(err, this.CUSTOM_ERROR_MESSAGES); + } + } + _isEmailToInviteValid(email) { if (!email) { this.userEmailToInviteError = 'Ce champ est requis.'; diff --git a/admin/app/models/certification-center-invitation.js b/admin/app/models/certification-center-invitation.js index ca41e16be23..976b46655e5 100644 --- a/admin/app/models/certification-center-invitation.js +++ b/admin/app/models/certification-center-invitation.js @@ -7,6 +7,7 @@ export default class CertificationCenterInvitationModel extends Model { @attr email; @attr updatedAt; @attr role; + @attr language; @belongsTo('certification-center', { async: true, inverse: null }) certificationCenter; diff --git a/admin/app/styles/components/certification-center-invitations.scss b/admin/app/styles/components/certification-center-invitations.scss index a1890c4732a..0a4f52f7e78 100644 --- a/admin/app/styles/components/certification-center-invitations.scss +++ b/admin/app/styles/components/certification-center-invitations.scss @@ -4,6 +4,20 @@ text-align: center; } + &__actions-buttons { + display: flex; + flex-direction: column; + + button { + width: 13rem; + margin: 0.2rem; + } + + svg { + margin-right: 6px; + } + } + &-actions__button { svg { diff --git a/admin/app/templates/authenticated/certification-centers/get/invitations.hbs b/admin/app/templates/authenticated/certification-centers/get/invitations.hbs index 2ab30c7548c..f207c41c344 100644 --- a/admin/app/templates/authenticated/certification-centers/get/invitations.hbs +++ b/admin/app/templates/authenticated/certification-centers/get/invitations.hbs @@ -9,5 +9,6 @@ \ No newline at end of file diff --git a/admin/tests/integration/components/certification-centers/invitations-test.gjs b/admin/tests/integration/components/certification-centers/invitations-test.gjs index 771a7eb4c65..bda33cb687a 100644 --- a/admin/tests/integration/components/certification-centers/invitations-test.gjs +++ b/admin/tests/integration/components/certification-centers/invitations-test.gjs @@ -1,4 +1,5 @@ import { render } from '@1024pix/ember-testing-library'; +import { setupIntl } from 'ember-intl/test-support'; import { setupRenderingTest } from 'ember-qunit'; import Invitations from 'pix-admin/components/certification-centers/invitations'; import { module, test } from 'qunit'; @@ -6,6 +7,7 @@ import sinon from 'sinon'; module('Integration | Component | Certification Centers | Invitations', function (hooks) { setupRenderingTest(hooks); + setupIntl(hooks, 'fr'); module('when there is no certification center invitations', function () { test('should show "Aucune invitation en attente"', async function (assert) { diff --git a/admin/tests/unit/controllers/authenticated/certification-centers/get/invitations-test.js b/admin/tests/unit/controllers/authenticated/certification-centers/get/invitations-test.js index 396765b32d4..8c53eede607 100644 --- a/admin/tests/unit/controllers/authenticated/certification-centers/get/invitations-test.js +++ b/admin/tests/unit/controllers/authenticated/certification-centers/get/invitations-test.js @@ -85,5 +85,58 @@ module('Unit | Controller | authenticated/certification-centers/get/invitations' sinon.assert.calledWith(notificationErrorStub, { message: 'Une erreur s’est produite, veuillez réessayer.' }); assert.ok(true); }); + + module('#sendNewInvitation', function () { + test('It sends a new invitation', async function (assert) { + // given + const controller = this.owner.lookup('controller:authenticated/certification-centers/get/invitations'); + + const store = this.owner.lookup('service:store'); + const queryRecordStub = sinon.stub(); + store.queryRecord = queryRecordStub; + const certificationCenterInvitation = { + email: 'test@example.net', + language: 'en', + role: 'member', + certificationCenterId: 1, + }; + // when + await controller.sendNewCertificationCenterInvitation(certificationCenterInvitation); + + // then + assert.ok( + queryRecordStub.calledWith('certification-center-invitation', { + ...certificationCenterInvitation, + }), + ); + }); + + test('When an error occurs, it should send a notification error', async function (assert) { + // given + const controller = this.owner.lookup('controller:authenticated/certification-centers/get/invitations'); + const store = this.owner.lookup('service:store'); + const anError = Symbol('an error'); + store.queryRecord = sinon.stub().rejects(anError); + const notifyStub = sinon.stub(); + class ErrorResponseHandler extends Service { + notify = notifyStub; + } + this.owner.register('service:error-response-handler', ErrorResponseHandler); + const customErrors = Symbol('custom errors'); + controller.CUSTOM_ERROR_MESSAGES = customErrors; + const certificationCenterInvitation = { + email: 'test@example.net', + language: 'en', + role: 'member', + certificationCenterId: 1, + }; + + // when + await controller.sendNewCertificationCenterInvitation(certificationCenterInvitation); + + // then + assert.ok(notifyStub.calledWithExactly(anError, customErrors)); + }); + }); }); }); From 964facccff74969d569cad3b75715c01b6d1fd81 Mon Sep 17 00:00:00 2001 From: Theotime2005 Date: Fri, 31 Jan 2025 10:14:30 +0100 Subject: [PATCH 8/8] fix(admin): Remove isLoading Because isLoading is now automatically handled by PixButton. --- .../authenticated/certification-centers/get/invitations.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/admin/app/controllers/authenticated/certification-centers/get/invitations.js b/admin/app/controllers/authenticated/certification-centers/get/invitations.js index 59ded0ced26..33cac960208 100644 --- a/admin/app/controllers/authenticated/certification-centers/get/invitations.js +++ b/admin/app/controllers/authenticated/certification-centers/get/invitations.js @@ -27,10 +27,8 @@ export default class AuthenticatedCertificationCentersGetInvitationsController e @action async createInvitation(language, role) { - this.isLoading = true; const email = this.userEmailToInvite?.trim(); if (!this._isEmailToInviteValid(email)) { - this.isLoading = false; return; } @@ -47,7 +45,6 @@ export default class AuthenticatedCertificationCentersGetInvitationsController e } catch (err) { this.errorResponseHandler.notify(err, this.CUSTOM_ERROR_MESSAGES); } - this.isLoading = false; } @action