From fbf22a83b2d4c1a5700e1c70b8a212537165f315 Mon Sep 17 00:00:00 2001 From: Laurent GAY Date: Thu, 11 Sep 2025 16:46:40 +0200 Subject: [PATCH] Manage error about register - #877 --- src/views/User/RegisterView.vue | 27 ++++++++++++++++--- test/graphql/resolvers/user_test.exs | 12 +++++++++ .../components/User/RegisterView.spec.ts | 2 +- .../__snapshots__/RegisterView.spec.ts.snap | 8 ++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/views/User/RegisterView.vue b/src/views/User/RegisterView.vue index 42d9ddfd6..948cd80af 100644 --- a/src/views/User/RegisterView.vue +++ b/src/views/User/RegisterView.vue @@ -88,6 +88,8 @@ {{ t("Registrations are restricted by allowlisting.") }} + +
({ locale: "en", }); +const otherErrors = ref([]); const emailErrors = ref([]); const passwordErrors = ref([]); const moderationError = ref([]); @@ -316,26 +319,36 @@ onDone(() => { onError((error) => { (error.graphQLErrors as AbsintheGraphQLErrors).forEach( ({ field, message }) => { + let message_txt; + if (Array.isArray(message)) { + message_txt = message[0] as string; + } else { + message_txt = message as string; + } switch (field) { case "email": emailErrors.value.push({ type: "danger" as errorType, - message: message[0] as string, + message: message_txt, }); break; case "password": passwordErrors.value.push({ type: "danger" as errorType, - message: message[0] as string, + message: message_txt, }); break; case "moderation": moderationError.value.push({ type: "danger" as errorType, - message: message[0] as string, + message: message_txt, }); break; default: + otherErrors.value.push({ + type: "danger" as errorType, + message: message_txt, + }); } } ); @@ -378,6 +391,10 @@ const maxErrorType = (errors: errorMessage[]): errorType | undefined => { }, "warning"); }; +const errorOtherType = computed((): errorType | undefined => { + return maxErrorType(otherErrors.value); +}); + const errorEmailType = computed((): errorType | undefined => { return maxErrorType(emailErrors.value); }); @@ -389,6 +406,10 @@ const errorModerationType = computed((): errorType | undefined => { return maxErrorType(moderationError.value); }); +const errorOtherMessage = computed((): string => { + return otherErrors.value.map(({ message }) => message).join(" "); +}); + const errorEmailMessage = computed((): string => { return emailErrors.value.map(({ message }) => message).join(" "); }); diff --git a/test/graphql/resolvers/user_test.exs b/test/graphql/resolvers/user_test.exs index 7e32d0a40..951e685d0 100644 --- a/test/graphql/resolvers/user_test.exs +++ b/test/graphql/resolvers/user_test.exs @@ -424,6 +424,7 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: @user_creation ) + assert hd(res["errors"])["field"] == "email" assert hd(res["errors"])["message"] == ["Cette adresse e-mail est déjà utilisée."] end @@ -439,6 +440,7 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: @user_creation ) + assert hd(res["errors"])["field"] == nil assert hd(res["errors"])["message"] == "Registrations are not open" Config.put([:instance, :registrations_open], true) Config.put([:instance, :registrations_moderation], false) @@ -455,6 +457,7 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: @user_creation ) + assert hd(res["errors"])["field"] == nil assert hd(res["errors"])["message"] == "Moderation text must not be empty" Config.put([:instance, :registrations_open], true) @@ -496,6 +499,7 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: @user_creation ) + assert hd(res["errors"])["field"] == nil assert hd(res["errors"])["message"] == "Your email is not on the allowlist" Config.put([:instance, :registrations_open], true) Config.put([:instance, :registrations_moderation], false) @@ -556,6 +560,8 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: @user_creation ) + assert hd(res["errors"])["field"] == nil + assert hd(res["errors"])["message"] == "Your e-mail has been denied registration or uses a disallowed e-mail provider" @@ -578,6 +584,8 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: @user_creation ) + assert hd(res["errors"])["field"] == nil + assert hd(res["errors"])["message"] == "Your e-mail has been denied registration or uses a disallowed e-mail provider" @@ -601,6 +609,8 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: Map.put(@user_creation, :email, "test+alias@demo.tld") ) + assert hd(res["errors"])["field"] == nil + assert hd(res["errors"])["message"] == "Your e-mail has been denied registration or uses a disallowed e-mail provider" @@ -635,6 +645,8 @@ defmodule Mobilizon.GraphQL.Resolvers.UserTest do variables: @user_creation_bad_email ) + assert hd(res["errors"])["field"] == "email" + assert hd(res["errors"])["message"] == ["Email doesn't fit required format"] end diff --git a/tests/unit/specs/components/User/RegisterView.spec.ts b/tests/unit/specs/components/User/RegisterView.spec.ts index f8f08bd17..189939797 100644 --- a/tests/unit/specs/components/User/RegisterView.spec.ts +++ b/tests/unit/specs/components/User/RegisterView.spec.ts @@ -159,7 +159,7 @@ describe("Register page", () => { it("shows error with moderation", async () => { const wrapper = generateWrapper(true, { createUserHandler: vi.fn().mockResolvedValue({ - errors: [{ field: "moderation", message: ["Bad moderation."] }], + errors: [{ field: null, message: ["Bad moderation."] }], }), }); await flushPromises(); diff --git a/tests/unit/specs/components/User/__snapshots__/RegisterView.spec.ts.snap b/tests/unit/specs/components/User/__snapshots__/RegisterView.spec.ts.snap index 067399f39..72b5ebbe3 100644 --- a/tests/unit/specs/components/User/__snapshots__/RegisterView.spec.ts.snap +++ b/tests/unit/specs/components/User/__snapshots__/RegisterView.spec.ts.snap @@ -30,6 +30,10 @@ exports[`Register page > register with moderation 1`] = `
+
+ + +
@@ -114,6 +118,10 @@ exports[`Register page > register without moderation 1`] = `
+
+ + +