diff --git a/high-level-tests/e2e/cypress/integration/pix-app/campaign-assessment.feature b/high-level-tests/e2e/cypress/integration/pix-app/campaign-assessment.feature
index 1d3eebd037a..f4e3a276d91 100644
--- a/high-level-tests/e2e/cypress/integration/pix-app/campaign-assessment.feature
+++ b/high-level-tests/e2e/cypress/integration/pix-app/campaign-assessment.feature
@@ -24,6 +24,9 @@ Fonctionnalité: Campagne d'évaluation
Alors je vois l'épreuve "Qui a dit « Toute méchanceté a sa source dans la faiblesse » ?"
Lorsque je clique sur "Je passe"
Et je clique sur "Voir mes résultats"
+ Alors je vois la page de "chargement-resultats" de la campagne
+ Lorsque j'attends 3200 ms
+ Et je clique sur "Continuer"
Alors je vois un résultat global à 50%
Alors je vois 2 résultats pour la compétence
Lorsque je clique sur "J'envoie mes résultats"
diff --git a/mon-pix/app/components/pages/campaigns/results-loader.gjs b/mon-pix/app/components/pages/campaigns/results-loader.gjs
new file mode 100644
index 00000000000..b4b556124f9
--- /dev/null
+++ b/mon-pix/app/components/pages/campaigns/results-loader.gjs
@@ -0,0 +1,20 @@
+import { on } from '@ember/modifier';
+import { action } from '@ember/object';
+import { service } from '@ember/service';
+import Component from '@glimmer/component';
+
+export default class ResultsLoader extends Component {
+ @service router;
+
+ @action
+ onClick() {
+ this.router.replaceWith('campaigns.assessment.skill-review', this.args.code);
+ }
+
+
+
+ Loading...
+
+
+
+}
diff --git a/mon-pix/app/router.js b/mon-pix/app/router.js
index 25f76bb8ce8..23e12b7ca41 100644
--- a/mon-pix/app/router.js
+++ b/mon-pix/app/router.js
@@ -91,6 +91,7 @@ Router.map(function () {
this.route('fill-in-participant-external-id', { path: '/identifiant' });
});
this.route('entrance', { path: '/entree' });
+ this.route('results-loader', { path: '/chargement-resultats' });
this.route('profiles-collection', { path: '/collecte' }, function () {
this.route('start-or-resume', { path: '/' });
this.route('send-profile', { path: '/envoi-profil' });
diff --git a/mon-pix/app/routes/assessments/resume.js b/mon-pix/app/routes/assessments/resume.js
index c6210e0f19e..94e8ec78aae 100644
--- a/mon-pix/app/routes/assessments/resume.js
+++ b/mon-pix/app/routes/assessments/resume.js
@@ -109,7 +109,7 @@ export default class ResumeRoute extends Route {
if (assessment.isCertification) {
this.router.replaceWith('authenticated.certifications.results', assessment.certificationNumber);
} else if (assessment.isForCampaign) {
- this.router.replaceWith('campaigns.assessment.skill-review', assessment.codeCampaign);
+ this.router.replaceWith('campaigns.results-loader', assessment.codeCampaign);
} else if (assessment.isCompetenceEvaluation) {
this.router.replaceWith('authenticated.competences.results', assessment.competenceId, assessment.id);
} else {
diff --git a/mon-pix/app/routes/campaigns/results-loader.js b/mon-pix/app/routes/campaigns/results-loader.js
new file mode 100644
index 00000000000..090e3ac544d
--- /dev/null
+++ b/mon-pix/app/routes/campaigns/results-loader.js
@@ -0,0 +1,38 @@
+import Route from '@ember/routing/route';
+import { service } from '@ember/service';
+
+export default class ResultsLoaderRoute extends Route {
+ @service currentUser;
+ @service session;
+ @service router;
+ @service store;
+
+ beforeModel(transition) {
+ this.session.requireAuthenticationAndApprovedTermsOfService(transition);
+ }
+
+ async model() {
+ const campaign = this.modelFor('campaigns');
+ const campaignParticipation = await this.store.queryRecord('campaignParticipation', {
+ campaignId: campaign.id,
+ userId: this.currentUser.user.id,
+ });
+ return {
+ campaign,
+ campaignParticipation,
+ };
+ }
+
+ async afterModel({ campaign, campaignParticipation }) {
+ if (!campaignParticipation) {
+ this.router.replaceWith('campaigns.campaign-landing-page', campaign.code);
+ }
+ if (campaignParticipation.sharedAt !== null) {
+ this.router.replaceWith('campaigns.assessment.skill-review', campaign.code);
+ }
+ const assessment = await campaignParticipation.assessment;
+ if (campaignParticipation && !assessment.isCompleted) {
+ this.router.replaceWith('campaigns.assessment.start-or-resume', campaign.code);
+ }
+ }
+}
diff --git a/mon-pix/app/templates/campaigns/results-loader.hbs b/mon-pix/app/templates/campaigns/results-loader.hbs
new file mode 100644
index 00000000000..1846674e7a3
--- /dev/null
+++ b/mon-pix/app/templates/campaigns/results-loader.hbs
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/mon-pix/tests/unit/routes/assessments/resume-test.js b/mon-pix/tests/unit/routes/assessments/resume-test.js
index 538f88689ab..5ffe8595e15 100644
--- a/mon-pix/tests/unit/routes/assessments/resume-test.js
+++ b/mon-pix/tests/unit/routes/assessments/resume-test.js
@@ -159,7 +159,7 @@ module('Unit | Route | Assessments | Resume', function (hooks) {
// then
return promise.then(() => {
- sinon.assert.calledWith(route.router.replaceWith, 'campaigns.assessment.skill-review', 'konami');
+ sinon.assert.calledWith(route.router.replaceWith, 'campaigns.results-loader', 'konami');
assert.ok(true);
});
});
@@ -197,7 +197,7 @@ module('Unit | Route | Assessments | Resume', function (hooks) {
route.redirect(assessment);
// then
- sinon.assert.calledWith(route.router.replaceWith, 'campaigns.assessment.skill-review', 'konami');
+ sinon.assert.calledWith(route.router.replaceWith, 'campaigns.results-loader', 'konami');
assert.ok(true);
});
});