From ddeade97756b37ca68b0a8a2e0aefbe718f55b28 Mon Sep 17 00:00:00 2001 From: Nima Shkouhfar Date: Sun, 29 Sep 2024 04:35:02 -0400 Subject: [PATCH] Changes: - First draft of test coverage improvement for storybooks - code's page html rendering issue fixed --- src/login/pages/Code.tsx | 10 +- stories/login/pages/Code.stories.tsx | 39 ++++++ .../pages/DeleteAccountConfirm.stories.tsx | 30 ++++ .../login/pages/DeleteCredential.stories.tsx | 10 ++ stories/login/pages/Error.stories.tsx | 35 +++++ .../pages/FrontchannelLogout.stories.tsx | 11 ++ .../pages/IdpReviewUserProfile.stories.tsx | 44 ++++++ stories/login/pages/Info.stories.tsx | 39 ++++++ stories/login/pages/Login.stories.tsx | 128 ++++++++++++++++++ .../login/pages/LoginConfigTotp.stories.tsx | 21 +++ .../login/pages/LoginIdpLinkEmail.stories.tsx | 46 +++++++ stories/login/pages/Register.stories.tsx | 62 +++++++++ stories/login/pages/Terms.stories.tsx | 29 ++++ 13 files changed, 503 insertions(+), 1 deletion(-) diff --git a/src/login/pages/Code.tsx b/src/login/pages/Code.tsx index 576a2ccd..4bca62f6 100644 --- a/src/login/pages/Code.tsx +++ b/src/login/pages/Code.tsx @@ -2,6 +2,7 @@ import { getKcClsx } from "keycloakify/login/lib/kcClsx"; import type { PageProps } from "keycloakify/login/pages/PageProps"; import type { KcContext } from "../KcContext"; import type { I18n } from "../i18n"; +import { kcSanitize } from "keycloakify/lib/kcSanitize"; export default function Code(props: PageProps, I18n>) { const { kcContext, i18n, doUseDefaultCss, Template, classes } = props; @@ -30,7 +31,14 @@ export default function Code(props: PageProps ) : ( -

{code.error}

+ code.error && ( +

+ ) )} diff --git a/stories/login/pages/Code.stories.tsx b/stories/login/pages/Code.stories.tsx index 0fcdf87f..b93125bf 100644 --- a/stories/login/pages/Code.stories.tsx +++ b/stories/login/pages/Code.stories.tsx @@ -16,3 +16,42 @@ type Story = StoryObj; export const Default: Story = { render: () => }; +export const WithErrorCode: Story = { + render: () => ( + + ) +}; +export const WithFrenchLanguage: Story = { + render: () => ( + + ) +}; +export const WithHtmlErrorMessage: Story = { + render: () => ( + Try again" + } + }} + /> + ) +}; diff --git a/stories/login/pages/DeleteAccountConfirm.stories.tsx b/stories/login/pages/DeleteAccountConfirm.stories.tsx index 501fa0c4..0d865dfe 100644 --- a/stories/login/pages/DeleteAccountConfirm.stories.tsx +++ b/stories/login/pages/DeleteAccountConfirm.stories.tsx @@ -16,3 +16,33 @@ type Story = StoryObj; export const Default: Story = { render: () => }; +export const WithAIAFlow: Story = { + render: () => ( + + ) +}; +export const WithoutAIAFlow: Story = { + render: () => ( + + ) +}; +export const WithCustomButtonStyle: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/DeleteCredential.stories.tsx b/stories/login/pages/DeleteCredential.stories.tsx index 7b211a52..38619d5b 100644 --- a/stories/login/pages/DeleteCredential.stories.tsx +++ b/stories/login/pages/DeleteCredential.stories.tsx @@ -16,3 +16,13 @@ type Story = StoryObj; export const Default: Story = { render: () => }; +export const WithCustomCredentialLabel: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/Error.stories.tsx b/stories/login/pages/Error.stories.tsx index 7b12410e..e64ea3f8 100644 --- a/stories/login/pages/Error.stories.tsx +++ b/stories/login/pages/Error.stories.tsx @@ -26,3 +26,38 @@ export const WithAnotherMessage: Story = { /> ) }; + +export const WithHtmlErrorMessage: Story = { + render: () => ( + Error: Something went wrong. Go back" + } + }} + /> + ) +}; +export const FrenchError: Story = { + render: () => ( + + ) +}; +export const WithSkipLink: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/FrontchannelLogout.stories.tsx b/stories/login/pages/FrontchannelLogout.stories.tsx index 9dacf0b0..cdef7c2c 100644 --- a/stories/login/pages/FrontchannelLogout.stories.tsx +++ b/stories/login/pages/FrontchannelLogout.stories.tsx @@ -16,3 +16,14 @@ type Story = StoryObj; export const Default: Story = { render: () => }; +export const WithoutRedirectUrl: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/IdpReviewUserProfile.stories.tsx b/stories/login/pages/IdpReviewUserProfile.stories.tsx index 6778e77d..93eb5b30 100644 --- a/stories/login/pages/IdpReviewUserProfile.stories.tsx +++ b/stories/login/pages/IdpReviewUserProfile.stories.tsx @@ -16,3 +16,47 @@ type Story = StoryObj; export const Default: Story = { render: () => }; +export const WithFormValidationErrors: Story = { + render: () => ( + ["email", "firstName"].includes(fieldName), + get: (fieldName: string) => { + if (fieldName === "email") return "Invalid email format."; + if (fieldName === "firstName") return "First name is required."; + } + } + }} + /> + ) +}; +export const WithReadOnlyFields: Story = { + render: () => ( + + ) +}; +export const WithPrefilledFormFields: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/Info.stories.tsx b/stories/login/pages/Info.stories.tsx index 195061f3..81884dce 100644 --- a/stories/login/pages/Info.stories.tsx +++ b/stories/login/pages/Info.stories.tsx @@ -55,3 +55,42 @@ export const WithRequiredActions: Story = { /> ) }; +export const WithPageRedirect: Story = { + render: () => ( + + ) +}; +export const WithoutClientBaseUrl: Story = { + render: () => ( + + ) +}; +export const WithMessageHeader: Story = { + render: () => ( + + ) +}; +export const WithAdvancedMessage: Story = { + render: () => ( + important information." } + }} + /> + ) +}; diff --git a/stories/login/pages/Login.stories.tsx b/stories/login/pages/Login.stories.tsx index 075d1f98..a3743adb 100644 --- a/stories/login/pages/Login.stories.tsx +++ b/stories/login/pages/Login.stories.tsx @@ -231,3 +231,131 @@ export const WithErrorMessage: Story = { /> ) }; + +export const WithOneSocialProvider: Story = { + render: args => ( + + ) +}; + +export const WithTwoSocialProviders: Story = { + render: args => ( + + ) +}; +export const WithNoSocialProviders: Story = { + render: args => ( + + ) +}; +export const WithMoreThanTwoSocialProviders: Story = { + render: args => ( + + ) +}; +export const WithSocialProvidersAndWithoutRememberMe: Story = { + render: args => ( + + ) +}; diff --git a/stories/login/pages/LoginConfigTotp.stories.tsx b/stories/login/pages/LoginConfigTotp.stories.tsx index 5d38df9b..743d38c2 100644 --- a/stories/login/pages/LoginConfigTotp.stories.tsx +++ b/stories/login/pages/LoginConfigTotp.stories.tsx @@ -41,3 +41,24 @@ export const WithError: Story = { /> ) }; +export const WithAppInitiatedAction: Story = { + render: () => ( + + ) +}; + +export const WithPreFilledUserLabel: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/LoginIdpLinkEmail.stories.tsx b/stories/login/pages/LoginIdpLinkEmail.stories.tsx index a58ae2d3..e855eed5 100644 --- a/stories/login/pages/LoginIdpLinkEmail.stories.tsx +++ b/stories/login/pages/LoginIdpLinkEmail.stories.tsx @@ -16,3 +16,49 @@ type Story = StoryObj; export const Default: Story = { render: () => }; +export const WithIdpAlias: Story = { + render: () => ( + + ) +}; +export const WithoutIdpAlias: Story = { + render: () => ( + + ) +}; + +export const WithCustomRealmDisplayName: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/Register.stories.tsx b/stories/login/pages/Register.stories.tsx index 09cdf249..8ab6c16d 100644 --- a/stories/login/pages/Register.stories.tsx +++ b/stories/login/pages/Register.stories.tsx @@ -215,3 +215,65 @@ export const WithTermsAcceptance: Story = { /> ) }; +export const WithTermsNotAccepted: Story = { + render: args => ( + fieldName === "termsAccepted", + get: (fieldName: string) => (fieldName === "termsAccepted" ? "You must accept the terms." : undefined) + } + }} + /> + ) +}; +export const WithFieldErrors: Story = { + render: () => ( + ["username", "email"].includes(fieldName), + get: fieldName => { + if (fieldName === "username") return "Username is required."; + if (fieldName === "email") return "Invalid email format."; + } + } + }} + /> + ) +}; +export const WithReadOnlyFields: Story = { + render: () => ( + + ) +}; +export const WithAutoGeneratedUsername: Story = { + render: () => ( + + ) +}; diff --git a/stories/login/pages/Terms.stories.tsx b/stories/login/pages/Terms.stories.tsx index f5837b07..631fe685 100644 --- a/stories/login/pages/Terms.stories.tsx +++ b/stories/login/pages/Terms.stories.tsx @@ -45,3 +45,32 @@ export const French: Story = { /> ) }; +export const WithErrorMessage: Story = { + render: () => ( + true, + get: () => "An error occurred while processing your request." + } + }} + /> + ) +}; + +export const Spanish: Story = { + render: () => ( + Mis términos en Español

" + } + } + }} + /> + ) +};