2025-10-06 08:47:51 +00:00
import { commonSelectors , cyParamName } from "Selectors/common" ;
2022-06-20 11:29:12 +00:00
import { ssoSelector } from "Selectors/manageSSO" ;
2022-11-09 08:02:02 +00:00
import * as common from "Support/utils/common" ;
2025-11-18 10:23:37 +00:00
import {
instanceSSOConfig ,
2025-12-12 13:43:43 +00:00
openInstanceSettings ,
2025-11-18 10:23:37 +00:00
passwordToggle ,
2025-12-12 13:43:43 +00:00
verifyTooltipDisabled ,
2025-11-18 10:23:37 +00:00
} from "Support/utils/platform/eeCommon" ;
2025-12-12 13:43:43 +00:00
import { commonText } from "Texts/common" ;
import { ssoText } from "Texts/manageSSO" ;
2022-06-20 11:29:12 +00:00
2025-11-18 10:23:37 +00:00
export const verifyLoginSettings = ( pageName ) => {
cy . get ( ssoSelector . enableSignUpToggle ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . allowedDomainInput ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . workspaceLoginUrl ) . should ( "be.visible" ) ;
cy . get ( commonSelectors . copyIcon ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . cancelButton ) . verifyVisibleElement (
"have.text" ,
ssoText . cancelButton
) ;
cy . get ( ssoSelector . saveButton ) . verifyVisibleElement (
"have.text" ,
ssoText . saveButton
) ;
cy . get ( ssoSelector . passwordEnableToggle ) . should ( "be.visible" ) ;
//Configure sign up toggle
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . enableSignUpToggle ) . check ( ) ;
cy . get ( ssoSelector . cancelButton ) . click ( ) ;
cy . get ( ssoSelector . enableSignUpToggle ) . should ( "not.be.checked" ) ;
cy . get ( ssoSelector . enableSignUpToggle ) . check ( ) ;
cy . get ( ssoSelector . saveButton ) . click ( ) ;
cy . get ( ssoSelector . enableSignUpToggle ) . should ( "be.checked" ) ;
2025-11-18 10:23:37 +00:00
cy . wait ( 500 ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . enableSignUpToggle ) . uncheck ( ) ;
cy . get ( ssoSelector . saveButton ) . click ( ) ;
cy . get ( ssoSelector . enableSignUpToggle ) . should ( "not.be.checked" ) ;
cy . clearAndType ( ssoSelector . allowedDomainInput , ssoText . allowedDomain ) ;
cy . get ( ssoSelector . saveButton ) . click ( ) ;
2025-11-24 18:04:43 +00:00
cy . verifyToastMessage (
commonSelectors . toastMessage ,
ssoText [ ` ${ pageName } SsoToast ` ]
) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . passwordEnableToggle ) . uncheck ( ) ;
cy . get ( commonSelectors . modalComponent ) . should ( "be.visible" ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . disablePasswordLoginTitle ) . verifyVisibleElement (
"have.text" ,
ssoText . disablePasswordLoginTitle
) ;
2024-03-13 12:05:36 +00:00
cy . get ( commonSelectors . modalMessage ) . verifyVisibleElement (
"have.text" ,
ssoText . passwordDisableWarning
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . superAdminInfoText ) . verifyVisibleElement (
"have.text" ,
ssoText . superAdminInfoText
) ;
cy . get ( '[data-cy="copy-icon"]:eq(1)' ) . should ( "be.visible" ) ;
2024-03-13 12:05:36 +00:00
cy . get ( commonSelectors . cancelButton ) . eq ( 1 ) . click ( ) ;
cy . get ( ssoSelector . passwordEnableToggle ) . uncheck ( ) ;
cy . get ( commonSelectors . confirmationButton ) . click ( ) ;
cy . verifyToastMessage (
commonSelectors . toastMessage ,
ssoText . passwordDisabledToast
) ;
cy . get ( ssoSelector . passwordEnableToggle ) . check ( ) ;
cy . get ( commonSelectors . saveButton ) . click ( ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . autoSSOToggle ) . should ( "be.disabled" ) ;
2025-11-24 18:04:43 +00:00
verifyTooltipDisabled (
ssoSelector . autoSSOToggle ,
2025-11-18 10:23:37 +00:00
ssoText . autoSSOToggleMessage
) ;
cy . task ( "dbConnection" , {
dbconfig : Cypress . env ( "app_db" ) ,
sql : "UPDATE sso_configs SET enabled = true WHERE sso='google' AND organization_id IS NULL;UPDATE sso_configs SET enabled = false WHERE sso IN ('git','openid') AND organization_id IS NULL;" ,
} ) ;
passwordToggle ( false , pageName === "instance" ? "instance" : "organization" ) ;
cy . reload ( ) ;
2025-11-20 12:28:09 +00:00
if ( pageName === "instance" ) {
openInstanceSettings ( ) ;
cy . get ( ssoSelector . instanceLoginListItem ) . click ( ) ;
2025-11-24 18:04:43 +00:00
} else common . navigateToManageSSO ( ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . autoSSOToggle ) . should ( "not.be.disabled" ) . check ( ) ;
cy . get ( ssoSelector . modalMessage ) . should ( "be.visible" ) ;
cy . get ( commonSelectors . confirmationButton ) . click ( ) ;
cy . get ( ssoSelector . autoSSOToggle ) . should ( "be.checked" ) ;
cy . get ( ssoSelector . passwordEnableToggle ) . check ( ) ;
2025-11-24 18:04:43 +00:00
cy . get ( commonSelectors . enablePasswordLoginTitle )
. should ( "be.visible" )
. verifyVisibleElement ( "have.text" , commonText . enablePasswordLoginTitle ) ;
2025-11-18 10:23:37 +00:00
cy . get ( commonSelectors . enablePasswordLoginModal ) . verifyVisibleElement (
"have.text" ,
commonText . enablePasswordLoginModal
) ;
cy . get ( commonSelectors . cancelButton ) . eq ( 1 ) . click ( ) ;
cy . get ( ssoSelector . passwordEnableToggle ) . should ( "not.be.checked" ) ;
cy . get ( ssoSelector . passwordEnableToggle ) . check ( ) ;
cy . get ( commonSelectors . confirmationButton ) . click ( ) ;
cy . get ( ssoSelector . passwordEnableToggle ) . should ( "be.checked" ) ;
cy . get ( ssoSelector . autoSSOToggle ) . should ( "not.be.checked" ) . and ( "be.disabled" ) ;
if ( pageName === "workspace" ) {
cy . get ( ssoSelector . allowDefaultSSOToggle ) . click ( ) ;
cy . wait ( 200 ) ;
2025-11-24 18:04:43 +00:00
cy . verifyToastMessage (
commonSelectors . toastMessage ,
ssoText . defaultSsoToast
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . allowDefaultSSOToggle ) . should ( "not.be.checked" ) ;
cy . get ( ssoSelector . allowDefaultSSOToggle ) . click ( ) ;
}
if ( pageName === "instance" ) {
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . linkReadDocumentation )
. should ( "be.visible" )
2025-11-18 10:23:37 +00:00
. and ( "have.attr" , "href" )
. and ( "include" , "/enterprise/superadmin/#instance-login" ) ;
}
instanceSSOConfig ( false ) ;
passwordToggle ( true , pageName === "instance" ? "instance" : "organization" ) ;
cy . reload ( ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . passwordEnableToggle ) . should ( "be.disabled" ) ;
common . verifyTooltipDisabled (
ssoSelector . passwordEnableToggle ,
"Password login cannot be disabled unless SSO is configured"
) ;
2025-11-18 10:23:37 +00:00
} ;
export const loginSettingPageElements = ( pageName ) => {
const pageKey = ` ${ pageName } LoginPage ` ;
const selectors = ssoSelector [ pageKey ] ;
const texts = ssoText [ pageKey ] ;
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
if ( ! selectors || ! texts ) {
throw new Error ( ` Unknown pageKey: ${ pageKey } ` ) ;
}
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
Object . entries ( selectors ) . forEach ( ( [ key , selector ] ) => {
2025-11-24 18:04:43 +00:00
cy . get ( selector ) . verifyVisibleElement ( "have.text" , texts [ key ] ) ;
2025-11-18 10:23:37 +00:00
} ) ;
2022-06-20 11:29:12 +00:00
} ;
2025-11-18 10:23:37 +00:00
export const googleSSOPageElements = ( pageName ) => {
cy . get ( ssoSelector . google ) . should ( "be.visible" ) . click ( ) ;
cy . get ( ssoSelector . cardTitle )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . googleTitle ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . statusLabel )
. should ( "be.visible" )
. and ( "have.text" , "Disabled" ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . googleEnableToggle ) . should ( "be.visible" ) . click ( ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
2025-01-27 06:40:35 +00:00
2025-11-18 10:23:37 +00:00
if ( pageName === "workspace" ) {
verifyElementText ( ssoSelector . ssoEnableModal , ssoText . googleSSOEnableModal ) ;
cy . get ( ssoSelector . modalCloseButton ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . cancelButton )
. eq ( 2 )
. verifyVisibleElement ( "have.text" , "Cancel" ) ;
cy . get ( ssoSelector . enableButton ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . googleSSOToast ) ;
cy . get ( ssoSelector . statusLabel ) . verifyVisibleElement (
"have.text" ,
ssoText . enabledLabel
) ;
}
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
cy . clearAndType ( ssoSelector . clientIdInput , ssoText . testClientId ) ;
cy . get ( ssoSelector . cancelButton ) . eq ( 1 ) . click ( ) ;
cy . get ( ssoSelector . google ) . click ( ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . googleEnableToggle ) . click ( ) ;
2025-11-18 10:23:37 +00:00
if ( pageName === "workspace" ) {
cy . get ( ssoSelector . clientIdInput ) . should ( "have.value" , "" ) ;
}
cy . clearAndType ( ssoSelector . clientIdInput , ssoText . clientId ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . googleSSOToast ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . clientIdInput ) . should ( "have.value" , ssoText . clientId ) ;
2024-03-13 12:05:36 +00:00
2025-11-24 18:04:43 +00:00
verifyLabelAndInput (
ssoSelector . googleSSOPageElements ,
ssoText . googleSSOPageElements
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . redirectUrl ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . copyIcon ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . cancelButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . cancelButton ) ;
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . saveButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . saveButton ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . googleEnableToggle ) . click ( ) ;
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
2025-11-18 10:23:37 +00:00
cy . apiLogout ( ) ;
2025-11-24 18:04:43 +00:00
if (
pageName === "workspace"
? cy . visit ( ` ${ Cypress . config ( "baseUrl" ) } /login/my-workspace ` )
: cy . visit ( ` ${ Cypress . config ( "baseUrl" ) } /login ` )
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . googleIcon ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . googleSSOText ) . verifyVisibleElement (
2024-03-13 12:05:36 +00:00
"have.text" ,
2025-11-18 10:23:37 +00:00
ssoText . googleSSOText
2024-03-13 12:05:36 +00:00
) ;
2025-11-18 10:23:37 +00:00
} ;
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
export const gitSSOPageElements = ( pageName ) => {
cy . get ( ssoSelector . git ) . should ( "be.visible" ) . click ( ) ;
cy . get ( ssoSelector . cardTitle )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . gitTitle ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . statusLabel )
. should ( "be.visible" )
. and ( "have.text" , "Disabled" ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . gitEnableToggle ) . should ( "be.visible" ) . click ( ) ;
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
if ( pageName === "workspace" ) {
verifyElementText ( ssoSelector . ssoEnableModal , ssoText . githubSSOEnableModal ) ;
cy . get ( ssoSelector . modalCloseButton ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . cancelButton )
. eq ( 2 )
. verifyVisibleElement ( "have.text" , "Cancel" ) ;
cy . get ( ssoSelector . enableButton ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . gitSSOToast ) ;
cy . get ( ssoSelector . statusLabel ) . verifyVisibleElement (
"have.text" ,
ssoText . enabledLabel
) ;
}
cy . clearAndType ( ssoSelector . hostNameInput , ssoText . hostName ) ;
cy . clearAndType ( ssoSelector . clientIdInput , ssoText . clientId ) ;
cy . clearAndType ( ssoSelector . clientSecretInput , ssoText . testClientId ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . cancelButton ) . eq ( 1 ) . click ( ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . git ) . click ( ) ;
cy . get ( ssoSelector . gitEnableToggle ) . click ( ) ;
cy . clearAndType ( ssoSelector . hostNameInput , ssoText . hostName ) ;
2024-03-13 12:05:36 +00:00
cy . clearAndType ( ssoSelector . clientIdInput , ssoText . clientId ) ;
2025-11-18 10:23:37 +00:00
cy . clearAndType ( ssoSelector . clientSecretInput , ssoText . testClientId ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
2025-11-18 10:23:37 +00:00
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . gitSSOToast ) ;
cy . get ( ssoSelector . hostNameInput ) . should ( "have.value" , ssoText . hostName ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . clientIdInput ) . should ( "have.value" , ssoText . clientId ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . clientSecretInput ) . should (
"have.value" ,
ssoText . testClientId
) ;
verifyLabelAndInput (
ssoSelector . githubSSOPageElements ,
ssoText . githubSSOPageElements
) ;
cy . get ( ssoSelector . hostNameHelpText ) . should (
"have.text" ,
ssoText . hostNameHelpText
) ;
cy . get ( ssoSelector . clientSecretLabel ) . should ( ( $el ) => {
expect ( $el . contents ( ) . first ( ) . text ( ) . trim ( ) ) . to . eq (
ssoText . clientSecretLabel
) ;
} ) ;
cy . get ( ssoSelector . encriptedLabel ) . should (
"have.text" ,
ssoText . encriptedLabel
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . clientSecretInput ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . redirectUrl ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . copyIcon ) . should ( "be.visible" ) ;
2022-06-20 11:29:12 +00:00
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . cancelButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . cancelButton ) ;
cy . get ( ssoSelector . saveButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . saveButton ) ;
cy . get ( ssoSelector . gitEnableToggle ) . click ( ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
2022-11-09 08:02:02 +00:00
2025-11-18 10:23:37 +00:00
cy . apiLogout ( ) ;
2025-11-24 18:04:43 +00:00
if (
pageName === "workspace"
? cy . visit ( ` ${ Cypress . config ( "baseUrl" ) } /login/my-workspace ` )
: cy . visit ( ` ${ Cypress . config ( "baseUrl" ) } /login ` )
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . gitIcon ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . gitSignInText ) . verifyVisibleElement (
2024-03-13 12:05:36 +00:00
"have.text" ,
2025-11-18 10:23:37 +00:00
ssoText . gitSignInText
2024-03-13 12:05:36 +00:00
) ;
2025-11-18 10:23:37 +00:00
} ;
export const oidcSSOPageElements = ( pageName ) => {
cy . wait ( 1000 ) ;
cy . get ( ssoSelector . oidc ) . click ( ) ;
2025-12-12 13:43:43 +00:00
if ( pageName === "workspace" ) {
cy . get ( '[data-cy="add-oidc-provider-button"]' ) . click ( ) ;
cy . get ( ssoSelector . oidcTitle ) . verifyVisibleElement ( "have.text" , "OIDC 1" ) ;
}
if ( pageName === "instance" ) {
cy . get ( ssoSelector . oidcTitle ) . verifyVisibleElement ( "have.text" , ssoText . oidcTitle ) ;
}
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . statusLabel )
. eq ( 0 )
. should ( "be.visible" )
. and ( "have.text" , "Disabled" ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . oidcEnableToggle ) . should ( "be.visible" ) . click ( ) ;
if ( pageName === "workspace" ) {
cy . clearAndType ( ssoSelector . clientSecretInput , ssoText . testclientSecret ) ;
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
verifyElementText ( ssoSelector . ssoEnableModal , ssoText . oidcSSOEnableModal ) ;
cy . get ( ssoSelector . modalCloseButton ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . cancelButton )
. eq ( 2 )
. verifyVisibleElement ( "have.text" , "Cancel" ) ;
cy . get ( ssoSelector . enableButton ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . oidcSSOToast ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . statusLabel )
. eq ( 0 )
. verifyVisibleElement ( "have.text" , ssoText . enabledLabel ) ;
2025-11-18 10:23:37 +00:00
2025-12-16 22:16:52 +00:00
cy . get ( '[data-cy="name-label"]' ) . verifyVisibleElement ( "have.text" , "Name" ) ;
}
2025-11-18 10:23:37 +00:00
cy . clearAndType ( ssoSelector . nameInput , ssoText . testName ) ;
cy . clearAndType ( ssoSelector . clientIdInput , ssoText . testclientId ) ;
cy . clearAndType ( ssoSelector . clientSecretInput , ssoText . testclientSecret ) ;
cy . clearAndType ( ssoSelector . wellKnownUrlInput , ssoText . testWellknownUrl ) ;
cy . get ( ssoSelector . cancelButton ) . eq ( 1 ) . click ( ) ;
2025-12-12 13:43:43 +00:00
if ( pageName === "workspace" ) {
cy . get ( '[data-cy="oidc-modal-cancel-button"]' ) . click ( ) ;
}
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . oidc ) . click ( ) ;
2025-12-12 13:43:43 +00:00
if ( pageName === "workspace" ) {
cy . get ( '[data-cy="provider-name-oidc-1"]' ) . click ( ) ;
}
if ( pageName === "instance" ) {
cy . get ( ssoSelector . oidcEnableToggle ) . click ( ) ;
}
2025-11-18 10:23:37 +00:00
if ( pageName === "workspace" ) {
2025-12-12 13:43:43 +00:00
cy . get ( ssoSelector . nameInput ) . should ( "have.value" , "OIDC 1" ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . clientIdInput ) . should ( "have.value" , "" ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . clientSecretInput ) . should (
"have.value" ,
ssoText . testclientSecret
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . wellKnownUrlInput ) . should ( "have.value" , "" ) ;
}
cy . clearAndType ( ssoSelector . nameInput , ssoText . testName ) ;
cy . clearAndType ( ssoSelector . clientIdInput , ssoText . testclientId ) ;
cy . clearAndType ( ssoSelector . clientSecretInput , ssoText . testclientSecret ) ;
cy . clearAndType ( ssoSelector . wellKnownUrlInput , ssoText . testWellknownUrl ) ;
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . oidcSSOToast ) ;
cy . get ( ssoSelector . nameInput ) . should ( "have.value" , ssoText . testName ) ;
cy . get ( ssoSelector . clientIdInput ) . should ( "have.value" , ssoText . testclientId ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . clientSecretInput ) . should (
"have.value" ,
ssoText . testclientSecret
) ;
cy . get ( ssoSelector . wellKnownUrlInput ) . should (
"have.value" ,
ssoText . testWellknownUrl
) ;
verifyLabelAndInput (
ssoSelector . oidcSSOPageElements ,
ssoText . oidcSSOPageElements
) ;
cy . get ( ssoSelector . clientSecretLabel ) . should ( ( $el ) => {
expect ( $el . contents ( ) . first ( ) . text ( ) . trim ( ) ) . to . eq (
ssoText . clientSecretLabel
) ;
} ) ;
cy . get ( ssoSelector . encriptedLabel ) . should (
"have.text" ,
ssoText . encriptedLabel
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . clientSecretInput ) . scrollIntoView ( ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . redirectUrl ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . copyIcon ) . should ( "be.visible" ) ;
//Groups Sync section
cy . get ( ssoSelector . groupsyncTitle ) . should ( "have.text" , " GROUP SYNC " ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . groupsyncToggleLabel ) . should (
"have.text" ,
"Enable group sync"
) ;
cy . get ( ssoSelector . groupsyncHelperText ) . should (
"have.text" ,
"Sync user groups from your IdP"
) ;
2025-11-18 10:23:37 +00:00
if ( pageName === "workspace" ) {
2025-11-24 18:04:43 +00:00
verifyLabelAndInput (
ssoSelector . groupsyncElements ,
ssoText . groupsyncElements
) ;
cy . get ( ssoSelector . groupsyncMappingHelperText ) . should (
"have.text" ,
ssoText . groupMappingHelperText
) ;
2025-11-18 10:23:37 +00:00
}
cy . get ( ssoSelector . cancelButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . cancelButton ) ;
cy . get ( ssoSelector . saveButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . saveButton ) ;
cy . apiLogout ( ) ;
2025-11-24 18:04:43 +00:00
if (
pageName === "workspace"
? cy . visit ( ` ${ Cypress . config ( "baseUrl" ) } /login/my-workspace ` )
: cy . visit ( ` ${ Cypress . config ( "baseUrl" ) } /login ` )
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . oidcIcon ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . oidcSSOText ) . verifyVisibleElement (
2024-03-13 12:05:36 +00:00
"have.text" ,
2025-11-18 10:23:37 +00:00
ssoText . oidcSSOText
2024-03-13 12:05:36 +00:00
) ;
2025-11-18 10:23:37 +00:00
} ;
2022-11-09 08:02:02 +00:00
2025-11-18 10:23:37 +00:00
export const ldapSSOPageElements = ( ) => {
cy . wait ( 1000 ) ;
cy . get ( ssoSelector . ldap ) . click ( ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . ldapTitle ) . verifyVisibleElement (
"have.text" ,
ssoText . ldapTitle
) ;
cy . get ( ssoSelector . statusLabel )
. eq ( 0 )
. should ( "be.visible" )
. and ( "have.text" , "Disabled" ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . ldapEnableToggle ) . should ( "be.visible" ) . click ( ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
2023-04-28 04:52:02 +00:00
2025-11-18 10:23:37 +00:00
cy . clearAndType ( ssoSelector . nameInput , ssoText . ldapName ) ;
cy . clearAndType ( ssoSelector . hostInput , ssoText . ldapHost ) ;
cy . clearAndType ( ssoSelector . portInput , ssoText . ldapPort ) ;
cy . clearAndType ( ssoSelector . baseDnInput , ssoText . ldapBaseDn ) ;
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . cancelButton ) . eq ( 1 ) . click ( ) ;
cy . get ( ssoSelector . ldap ) . click ( ) ;
cy . get ( ssoSelector . ldapEnableToggle ) . click ( ) ;
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . nameInput ) . should ( "have.value" , "" ) ;
cy . get ( ssoSelector . hostInput ) . should ( "have.value" , "" ) ;
cy . get ( ssoSelector . portInput ) . should ( "have.value" , "" ) ;
cy . get ( ssoSelector . baseDnInput ) . should ( "have.value" , "" ) ;
cy . clearAndType ( ssoSelector . nameInput , ssoText . ldapName ) ;
cy . clearAndType ( ssoSelector . hostInput , ssoText . ldapHost ) ;
cy . clearAndType ( ssoSelector . portInput , ssoText . ldapPort ) ;
cy . clearAndType ( ssoSelector . baseDnInput , ssoText . ldapBaseDn ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
2025-11-18 10:23:37 +00:00
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . ldapSSOToast ) ;
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . nameInput ) . should ( "have.value" , ssoText . ldapName ) ;
cy . get ( ssoSelector . hostInput ) . should ( "have.value" , ssoText . ldapHost ) ;
cy . get ( ssoSelector . portInput ) . should ( "have.value" , ssoText . ldapPort ) ;
cy . get ( ssoSelector . baseDnInput ) . should ( "have.value" , ssoText . ldapBaseDn ) ;
2025-11-24 18:04:43 +00:00
verifyLabelAndInput (
ssoSelector . ldapSSOPageElements ,
ssoText . ldapSSOPageElements
) ;
cy . get ( ssoSelector . baseDnHelperText ) . should (
"have.text" ,
ssoText . ldapBaseDNHelperText
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . sslToggle ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . cancelButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . cancelButton ) ;
cy . get ( ssoSelector . saveButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . saveButton ) ;
cy . get ( ssoSelector . ldapEnableToggle ) . click ( ) ;
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
cy . apiLogout ( ) ;
cy . visit ( "/login/my-workspace" ) ;
cy . get ( ssoSelector . ldapIcon ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . ldapSSOText ) . verifyVisibleElement (
2024-03-13 12:05:36 +00:00
"have.text" ,
2025-11-18 10:23:37 +00:00
ssoText . ldapSSOText
2024-03-13 12:05:36 +00:00
) ;
2025-11-18 10:23:37 +00:00
} ;
2024-03-13 12:05:36 +00:00
2025-11-18 10:23:37 +00:00
export const samlSSOPageElements = ( ) => {
cy . wait ( 1000 ) ;
cy . get ( ssoSelector . saml ) . click ( ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . samlTitle ) . verifyVisibleElement (
"have.text" ,
ssoText . samlTitle
) ;
cy . get ( ssoSelector . statusLabel )
. eq ( 0 )
. should ( "be.visible" )
. and ( "have.text" , "Disabled" ) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . samlEnableToggle ) . should ( "be.visible" ) . click ( ) ;
2024-03-13 12:05:36 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
2025-11-18 10:23:37 +00:00
cy . clearAndType ( ssoSelector . nameInput , ssoText . samlName ) ;
cy . clearAndType ( ssoSelector . samlMetadataInput , ssoText . samlMetadataInput ) ;
2025-11-24 18:04:43 +00:00
cy . clearAndType (
ssoSelector . samlGroupAttributeInput ,
ssoText . samlGroupAttributeInput
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . cancelButton ) . eq ( 1 ) . click ( ) ;
cy . get ( ssoSelector . saml ) . click ( ) ;
cy . get ( ssoSelector . samlEnableToggle ) . click ( ) ;
cy . get ( ssoSelector . nameInput ) . should ( "have.value" , "" ) ;
cy . get ( ssoSelector . samlMetadataInput ) . should ( "have.value" , "" ) ;
cy . get ( ssoSelector . samlGroupAttributeInput ) . should ( "have.value" , "" ) ;
cy . clearAndType ( ssoSelector . nameInput , ssoText . samlName ) ;
cy . clearAndType ( ssoSelector . samlMetadataInput , ssoText . samlMetadataInput ) ;
2025-11-24 18:04:43 +00:00
cy . clearAndType (
ssoSelector . samlGroupAttributeInput ,
ssoText . samlGroupAttributeInput
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . samlSSOToast ) ;
cy . get ( ssoSelector . nameInput ) . should ( "have.value" , ssoText . samlName ) ;
2025-11-24 18:04:43 +00:00
cy . get ( ssoSelector . samlMetadataInput ) . should (
"have.value" ,
ssoText . samlMetadataInput
) ;
cy . get ( ssoSelector . samlGroupAttributeInput ) . should (
"have.value" ,
ssoText . samlGroupAttributeInput
) ;
2025-11-18 10:23:37 +00:00
2025-11-24 18:04:43 +00:00
verifyLabelAndInput (
ssoSelector . samlSSOPageElements ,
ssoText . samlSSOPageElements
) ;
cy . get ( ssoSelector . baseDnHelperText ) . should (
"have.text" ,
ssoText . baseDNHelperText
) ;
cy . get ( ssoSelector . groupAttributeHelperText ) . should (
"have.text" ,
ssoText . groupAttributeHelperText
) ;
2025-11-18 10:23:37 +00:00
cy . get ( ssoSelector . copyIcon ) . eq ( 1 ) . click ( ) ;
cy . get ( ssoSelector . cancelButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . cancelButton ) ;
cy . get ( ssoSelector . saveButton )
. eq ( 1 )
. verifyVisibleElement ( "have.text" , ssoText . saveButton ) ;
cy . get ( ssoSelector . samlEnableToggle ) . click ( ) ;
cy . get ( ssoSelector . saveButton ) . eq ( 1 ) . click ( ) ;
cy . apiLogout ( ) ;
cy . visit ( "/login/my-workspace" ) ;
cy . get ( ssoSelector . samlIcon ) . should ( "be.visible" ) ;
cy . get ( ssoSelector . samlSSOText ) . verifyVisibleElement (
"have.text" ,
ssoText . samlSSOText
2024-03-13 12:05:36 +00:00
) ;
2022-11-09 08:02:02 +00:00
} ;
2022-12-09 13:12:31 +00:00
export const visitWorkspaceLoginPage = ( ) => {
cy . get ( ssoSelector . workspaceLoginUrl ) . then ( ( $temp ) => {
2022-11-09 08:02:02 +00:00
const url = $temp . text ( ) ;
common . logout ( ) ;
2024-03-13 12:05:36 +00:00
cy . wait ( 1000 ) ;
2022-11-09 08:02:02 +00:00
cy . visit ( url ) ;
} ) ;
} ;
2022-12-09 13:12:31 +00:00
export const workspaceLoginPageElements = ( workspaceName ) => {
signInPageElements ( ) ;
cy . get ( ssoSelector . workspaceSubHeader ) . verifyVisibleElement (
"have.text" ,
ssoText . workspaceSubHeader ( workspaceName )
) ;
} ;
export const signInPageElements = ( ) => {
cy . get ( ssoSelector . signInHeader ) . verifyVisibleElement (
"have.text" ,
ssoText . signInHeader
) ;
cy . get ( commonSelectors . workEmailLabel ) . verifyVisibleElement (
"have.text" ,
commonText . workEmailLabel
) ;
cy . get ( commonSelectors . passwordLabel ) . should ( ( $el ) => {
expect ( $el . contents ( ) . first ( ) . text ( ) . trim ( ) ) . to . eq (
commonText . passwordLabel
) ;
} ) ;
cy . get ( commonSelectors . forgotPasswordLink ) . verifyVisibleElement (
"have.text" ,
commonText . forgotPasswordLink
) ;
2024-12-03 06:48:49 +00:00
cy . get ( onboardingSelectors . signInButton ) . verifyVisibleElement (
2022-12-09 13:12:31 +00:00
"have.text" ,
commonText . loginButton
) ;
2024-12-09 11:30:36 +00:00
cy . get ( onboardingSelectors . loginEmailInput ) . should ( "be.visible" ) ;
cy . get ( onboardingSelectors . loginPasswordInput ) . should ( "be.visible" ) ;
2023-07-24 15:30:14 +00:00
cy . get ( "body" ) . then ( ( $el ) => {
if ( $el . text ( ) . includes ( "Google" ) ) {
cy . get ( ssoSelector . googleSSOText ) . verifyVisibleElement (
"have.text" ,
ssoText . googleSSOText
) ;
cy . get ( ssoSelector . gitSSOText ) . verifyVisibleElement (
"have.text" ,
ssoText . gitSignInText
) ;
}
} ) ;
2022-12-09 13:12:31 +00:00
} ;
export const enableSignUp = ( ) => {
common . navigateToManageSSO ( ) ;
cy . get ( "body" ) . then ( ( $el ) => {
if ( ! $el . text ( ) . includes ( "Allowed domains" ) ) {
cy . get ( ssoSelector . generalSettingsElements . generalSettings ) . click ( ) ;
}
} ) ;
cy . get ( ssoSelector . enableSignUpToggle ) . then ( ( $el ) => {
if ( ! $el . is ( ":checked" ) ) {
cy . get ( ssoSelector . enableSignUpToggle ) . check ( ) ;
cy . get ( ssoSelector . saveButton ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . ssoToast ) ;
}
} ) ;
} ;
export const disableSignUp = ( ) => {
common . navigateToManageSSO ( ) ;
cy . get ( "body" ) . then ( ( $el ) => {
if ( ! $el . text ( ) . includes ( "Allowed domains" ) ) {
cy . get ( ssoSelector . generalSettingsElements . generalSettings ) . click ( ) ;
}
} ) ;
cy . get ( ssoSelector . enableSignUpToggle ) . then ( ( $el ) => {
if ( $el . is ( ":checked" ) ) {
cy . get ( ssoSelector . enableSignUpToggle ) . uncheck ( ) ;
cy . get ( ssoSelector . saveButton ) . click ( ) ;
cy . verifyToastMessage ( commonSelectors . toastMessage , ssoText . ssoToast ) ;
}
} ) ;
} ;
export const invitePageElements = ( ) => {
cy . get ( commonSelectors . invitePageHeader ) . verifyVisibleElement (
"have.text" ,
commonText . invitePageHeader
) ;
cy . get ( commonSelectors . invitePageSubHeader ) . verifyVisibleElement (
"have.text" ,
commonText . invitePageSubHeader
) ;
cy . get ( commonSelectors . userNameInputLabel ) . verifyVisibleElement (
"have.text" ,
commonText . userNameInputLabel
) ;
cy . get ( commonSelectors . invitedUserName ) . should ( "be.visible" ) ;
2023-02-09 10:56:10 +00:00
cy . get ( commonSelectors . emailInputLabel ) . verifyVisibleElement (
2022-12-09 13:12:31 +00:00
"have.text" ,
2023-02-09 10:56:10 +00:00
commonText . emailInputLabel
2022-12-09 13:12:31 +00:00
) ;
cy . get ( commonSelectors . invitedUserEmail ) . should ( "be.visible" ) ;
cy . get ( commonSelectors . passwordLabel ) . verifyVisibleElement (
"have.text" ,
commonText . passwordLabel
) ;
2024-12-09 11:30:36 +00:00
cy . get ( onboardingSelectors . loginPasswordInput ) . should ( "be.visible" ) ;
2022-12-09 13:12:31 +00:00
cy . get ( commonSelectors . acceptInviteButton ) . verifyVisibleElement (
"have.text" ,
commonText . acceptInviteButton
) ;
cy . get ( commonSelectors . signUpTermsHelperText ) . should ( ( $el ) => {
expect ( $el . contents ( ) . first ( ) . text ( ) . trim ( ) ) . to . eq (
commonText . signUpTermsHelperText
) ;
} ) ;
cy . get ( commonSelectors . termsOfServiceLink )
. verifyVisibleElement ( "have.text" , commonText . termsOfServiceLink )
. and ( "have.attr" , "href" )
. and ( "equal" , "https://www.tooljet.com/terms" ) ;
cy . get ( commonSelectors . privacyPolicyLink )
. verifyVisibleElement ( "have.text" , commonText . privacyPolicyLink )
. and ( "have.attr" , "href" )
. and ( "equal" , "https://www.tooljet.com/privacy" ) ;
} ;
2025-09-16 15:45:28 +00:00
export const updateSsoId = ( ssoId , sso , workspaceId ) => {
2025-04-07 10:19:21 +00:00
cy . task ( "dbConnection" , {
2025-09-16 15:45:28 +00:00
dbconfig : Cypress . env ( "app_db" ) ,
2025-11-24 10:59:49 +00:00
sql : ` DELETE FROM sso_configs WHERE id=' ${ ssoId } '; ` ,
} ) . then ( ( ) => {
cy . task ( "dbConnection" , {
dbconfig : Cypress . env ( "app_db" ) ,
sql : ` UPDATE sso_configs SET id=' ${ ssoId } ' WHERE sso=' ${ sso } ' AND organization_id=' ${ workspaceId } '; ` ,
} ) ;
2023-02-16 09:23:27 +00:00
} ) ;
} ;
2024-03-13 12:05:36 +00:00
export const setSSOStatus = ( workspaceName , ssoType , enabled ) => {
let workspaceId ;
2025-04-07 10:19:21 +00:00
cy . task ( "dbConnection" , {
2024-03-13 12:05:36 +00:00
dbconfig : Cypress . env ( "app_db" ) ,
sql : ` SELECT id FROM organizations WHERE name = ' ${ workspaceName } ' ` ,
} ) . then ( ( resp ) => {
workspaceId = resp . rows [ 0 ] . id ;
2025-04-07 10:19:21 +00:00
cy . task ( "dbConnection" , {
2024-03-13 12:05:36 +00:00
dbconfig : Cypress . env ( "app_db" ) ,
sql : ` SELECT * FROM sso_configs WHERE organization_id = ' ${ workspaceId } ' AND sso = ' ${ ssoType } ' ` ,
} ) . then ( ( ssoConfigResp ) => {
if ( ssoConfigResp . rows . length > 0 ) {
2025-04-07 10:19:21 +00:00
cy . task ( "dbConnection" , {
2024-03-13 12:05:36 +00:00
dbconfig : Cypress . env ( "app_db" ) ,
2025-11-25 11:31:32 +00:00
sql : ` UPDATE sso_configs SET enabled = ${ enabled ? "true" : "false"
} WHERE organization _id = '${workspaceId}' AND sso = '${ssoType}' ` ,
2024-03-13 12:05:36 +00:00
} ) ;
}
} ) ;
} ) ;
} ;
2024-03-27 07:31:37 +00:00
export const defaultSSO = ( enable ) => {
2025-09-16 15:45:28 +00:00
cy . getAuthHeaders ( ) . then ( ( headers ) => {
2024-03-27 07:31:37 +00:00
cy . request (
{
method : "PATCH" ,
2025-11-13 12:55:04 +00:00
url : ` ${ Cypress . env ( "server_host" ) } /api/login-configs/organization-general/inherit-sso ` ,
2025-09-16 15:45:28 +00:00
headers : headers ,
2024-03-27 07:31:37 +00:00
body : { inheritSSO : enable } ,
} ,
{ log : false }
) . then ( ( response ) => {
expect ( response . status ) . to . equal ( 200 ) ;
} ) ;
} ) ;
} ;
2025-06-23 07:46:35 +00:00
export const setSignupStatus = ( enable , workspaceName = "My workspace" ) => {
2025-04-07 10:19:21 +00:00
cy . task ( "dbConnection" , {
2024-06-27 05:21:46 +00:00
dbconfig : Cypress . env ( "app_db" ) ,
sql : ` SELECT id FROM organizations WHERE name = ' ${ workspaceName } ' ` ,
} ) . then ( ( resp ) => {
const workspaceId = resp . rows [ 0 ] . id ;
2025-09-16 15:45:28 +00:00
cy . getAuthHeaders ( ) . then ( ( headers ) => {
2024-06-27 05:21:46 +00:00
cy . request ( {
2024-03-27 07:31:37 +00:00
method : "PATCH" ,
2025-04-07 10:19:21 +00:00
url : ` ${ Cypress . env ( "server_host" ) } /api/login-configs/organization-general ` ,
2025-09-16 15:45:28 +00:00
headers : headers ,
2024-03-27 07:31:37 +00:00
body : { enableSignUp : enable } ,
2024-06-27 05:21:46 +00:00
} ) . then ( ( response ) => {
expect ( response . status ) . to . equal ( 200 ) ;
} ) ;
2024-03-27 07:31:37 +00:00
} ) ;
} ) ;
} ;
export const deleteOrganisationSSO = ( workspaceName , services ) => {
let workspaceId ;
2025-04-07 10:19:21 +00:00
cy . task ( "dbConnection" , {
2024-03-13 12:05:36 +00:00
dbconfig : Cypress . env ( "app_db" ) ,
2024-03-27 07:31:37 +00:00
sql : ` select id from organizations where name=' ${ workspaceName } '; ` ,
} ) . then ( ( resp ) => {
workspaceId = resp . rows [ 0 ] . id ;
2025-04-07 10:19:21 +00:00
cy . task ( "dbConnection" , {
2024-03-27 07:31:37 +00:00
dbconfig : Cypress . env ( "app_db" ) ,
sql : ` DELETE FROM sso_configs WHERE organization_id = ' ${ workspaceId } ' AND sso IN ( ${ services
. map ( ( service ) => ` ' ${ service } ' ` )
. join ( "," ) } ) ; ` ,
} ) ;
2024-03-13 12:05:36 +00:00
} ) ;
} ;
2024-03-27 07:31:37 +00:00
export const resetDomain = ( ) => {
2025-09-16 15:45:28 +00:00
cy . getAuthHeaders ( ) . then ( ( headers ) => {
2024-03-27 07:31:37 +00:00
cy . request (
{
method : "PATCH" ,
2025-04-21 14:07:35 +00:00
url : ` ${ Cypress . env ( "server_host" ) } /api/login-configs/organization-general ` ,
2025-09-16 15:45:28 +00:00
headers : headers ,
2024-03-27 07:31:37 +00:00
body : { domain : "" } ,
} ,
{ log : false }
) . then ( ( response ) => {
expect ( response . status ) . to . equal ( 200 ) ;
} ) ;
} ) ;
2024-12-23 09:21:27 +00:00
} ;
2025-06-23 07:46:35 +00:00
2025-09-16 15:45:28 +00:00
export const enableInstanceSignup = ( enable = true ) => {
cy . getAuthHeaders ( ) . then ( ( headers ) => {
cy . request ( {
method : "PATCH" ,
url : ` ${ Cypress . env ( "server_host" ) } /api/login-configs/instance-general ` ,
headers : headers ,
body : { enableSignUp : enable } ,
} ) . then ( ( response ) => {
expect ( response . status ) . to . equal ( 200 ) ;
} ) ;
} ) ;
} ;
2025-06-23 07:46:35 +00:00
2025-09-16 15:45:28 +00:00
export const updateOIDCConfig = ( orgId ) => {
const ssoConfigId = "22f22523-7bc2-4134-891d-88bdfec073cd" ;
const sso = "'openid'" ;
const configs = ` '{
"name" : "" ,
"clientId" : "" ,
"clientSecret" : "" ,
"wellKnownUrl" : ""
} ' ` ;
const configScope = "'organization'" ;
const syncId = "a6a2f665-f96e-4c82-91cb-6e0a99c32d21" ; // Explicit id for second table
const claimName = "groups" ;
const groupMapping = "{}" ;
cy . task ( "dbConnection" , {
dbconfig : Cypress . env ( "app_db" ) ,
2025-11-24 10:59:49 +00:00
sql : ` DELETE FROM sso_config_oidc_group_sync WHERE id=' ${ syncId } ' OR sso_config_id=' ${ ssoConfigId } '; ` ,
} ) . then ( ( ) => {
cy . task ( "dbConnection" , {
dbconfig : Cypress . env ( "app_db" ) ,
sql : ` DELETE FROM sso_configs WHERE id=' ${ ssoConfigId } '; ` ,
} ) . then ( ( ) => {
cy . task ( "dbConnection" , {
dbconfig : Cypress . env ( "app_db" ) ,
sql : `
2025-09-16 15:45:28 +00:00
INSERT INTO sso _configs (
id ,
organization _id ,
sso ,
configs ,
enabled ,
config _scope
) VALUES (
'${ssoConfigId}' ,
'${orgId}' ,
$ { sso } ,
$ { configs } ,
true ,
$ { configScope }
) ;
` ,
2025-11-24 10:59:49 +00:00
} ) . then ( ( ) => {
cy . task ( "dbConnection" , {
dbconfig : Cypress . env ( "app_db" ) ,
sql : `
2025-09-16 15:45:28 +00:00
INSERT INTO sso _config _oidc _group _sync (
id ,
sso _config _id ,
organization _id ,
claim _name ,
group _mapping ,
enable _group _sync
) VALUES (
'${syncId}' ,
'${ssoConfigId}' ,
'${orgId}' ,
'${claimName}' ,
'${groupMapping}' ,
true
) ;
` ,
2025-11-24 10:59:49 +00:00
} ) ;
} ) ;
} ) ;
2025-06-23 07:46:35 +00:00
} ) ;
} ;
2025-09-16 15:45:28 +00:00
export const authResponse = ( matcher ) => {
cy . intercept ( "POST" , "/api/authorize" , ( req ) => {
req . continue ( ( res ) => {
matcher ( res . body ) ;
} ) ;
} ) . as ( "authorizeCheck" ) ;
} ;
2025-12-12 13:43:43 +00:00
export const addOktaOIDCConfig = (
2025-11-13 12:55:04 +00:00
groupMapping ,
level = "workspace" ,
extra = { }
) => {
2025-09-16 15:45:28 +00:00
const config = {
2025-12-12 13:43:43 +00:00
... ( level === "workspace" ? { configId : "22f22523-7bc2-4134-891d-88bdfec073cd" } : { } ) ,
2025-09-16 15:45:28 +00:00
type : "openid" ,
configs : {
name : "" ,
clientId : Cypress . env ( "okta_client_id" ) ,
clientSecret : Cypress . env ( "okta_client_secret" ) ,
2025-11-21 09:56:24 +00:00
codeVerifier : null ,
2025-11-12 19:58:58 +00:00
grantType : "authorization_code" ,
2025-09-16 15:45:28 +00:00
wellKnownUrl : ` https:// ${ Cypress . env ( "okta_domain" ) } /.well-known/openid-configuration ` ,
... ( level === "instance" ? { enableGroupSync : true } : { } ) ,
} ,
oidcGroupSyncs : [
{
claimName : "groups" ,
groupMapping : { ... groupMapping } ,
... ( level === "instance"
? { organizationId : extra . organizationId , id : extra . id }
: { } ) ,
} ,
] ,
enabled : true ,
} ;
return cy . apiUpdateSSOConfig ( config , level ) ;
} ;
2025-09-17 12:24:33 +00:00
2025-09-18 11:31:19 +00:00
export const uiOktaLogin = ( email , password ) => {
2025-11-24 18:04:43 +00:00
cy . log ( "Starting Okta login for:" , email ) ;
2025-11-24 10:59:49 +00:00
cy . origin (
"https://integrator-8815821.okta.com" ,
{ args : { email , password } } ,
( { email , password } ) => {
2025-11-24 18:04:43 +00:00
cy . log ( "Inside Okta origin" ) ;
2025-11-25 11:31:32 +00:00
cy . get ( 'input[name="identifier"]' , { timeout : 20000 } )
2025-11-24 18:04:43 +00:00
. should ( "be.visible" )
. type ( email ) ;
2025-11-24 10:59:49 +00:00
cy . get ( ".button-primary" ) . click ( ) ;
2025-11-25 11:31:32 +00:00
cy . get ( 'input[name="credentials.passcode"]' , { timeout : 20000 } )
2025-11-24 18:04:43 +00:00
. should ( "be.visible" )
. type ( password ) ;
2025-11-24 10:59:49 +00:00
cy . get ( ".button-primary" ) . click ( ) ;
2025-11-24 18:04:43 +00:00
cy . log ( "Okta login submitted" ) ;
2025-11-24 10:59:49 +00:00
}
) ;
2025-11-24 18:04:43 +00:00
cy . log ( "Okta login completed" ) ;
2025-09-17 12:24:33 +00:00
} ;
2025-10-06 08:47:51 +00:00
2025-11-13 12:55:04 +00:00
export const toggleSsoViaUI = (
provider ,
settingsUrl = "settings/instance-login"
) => {
cy . wait ( 1000 ) ;
const isInstance = settingsUrl === "settings/instance-login" ;
2025-10-06 08:47:51 +00:00
cy . intercept (
2025-11-13 12:55:04 +00:00
"PATCH" ,
` /api/login-configs/ ${ isInstance ? "instance" : "organization" } -sso `
) . as ( "patchInstanceSSO" ) ;
2025-10-06 08:47:51 +00:00
cy . visit ( settingsUrl ) ;
cy . wait ( 1000 ) ;
cy . get ( ` [data-cy=" ${ cyParamName ( provider ) } -label"] ` ) . click ( ) ;
2025-11-05 19:16:02 +00:00
cy . wait ( 1000 ) ;
2025-10-06 08:47:51 +00:00
cy . get ( ` [data-cy=" ${ cyParamName ( provider ) } -toggle-input"] ` ) . click ( ) ;
cy . get ( ` [data-cy="save-button"] ` ) . eq ( 1 ) . click ( ) ;
2025-11-13 12:55:04 +00:00
cy . wait ( "@patchInstanceSSO" ) . its ( "response.statusCode" ) . should ( "eq" , 200 ) ;
2025-10-06 08:47:51 +00:00
cy . wait ( 1000 ) ;
} ;
2025-11-13 12:55:04 +00:00
export const gitHubSignInWithAssertion = (
assertion = null ,
githubUsername = Cypress . env ( "GITHUB_USERNAME" ) ,
githubPassword = Cypress . env ( "GITHUB_PASSWORD" )
) => {
cy . origin (
"https://github.com" ,
{ args : { githubUsername , githubPassword , assertion } } ,
( { githubUsername , githubPassword , assertion } ) => {
cy . get ( 'input[name="login"]' , { timeout : 15000 } ) . type ( githubUsername ) ;
cy . get ( 'input[name="password"]' ) . type ( githubPassword ) ;
cy . get ( 'input[name="commit"]' ) . click ( ) ;
cy . log ( "GitHub login submitted" ) ;
cy . get ( "body" ) . then ( ( $body ) => {
if (
$body . find ( '[data-octo-click="oauth_application_authorization"]' )
. length > 0
) {
cy . get ( '[data-octo-click="oauth_application_authorization"]' ) . click ( ) ;
cy . log ( "GitHub authorization button clicked" ) ;
}
} ) ;
2025-10-06 08:47:51 +00:00
2025-11-13 12:55:04 +00:00
if ( assertion && assertion . type === "failure" ) {
cy . get (
'[alt="404 “This is not the web page you are looking for”"]'
) . should ( "be.visible" ) ;
} else if ( assertion && assertion . type === "selector" ) {
cy . get ( assertion . selector ) . should ( assertion . condition , assertion . value ) ;
2025-11-05 07:11:21 +00:00
}
2025-10-06 08:47:51 +00:00
}
2025-11-13 12:55:04 +00:00
) ;
2025-10-06 08:47:51 +00:00
} ;
2025-11-05 19:16:02 +00:00
2025-11-12 16:25:25 +00:00
/ * *
* Deletes a single test user by email from the database
* @ param { string } email - The email of the user to delete
* /
export const cleanupTestUser = ( email ) => {
2025-12-05 12:37:00 +00:00
cy . runSqlQueryOnDB (
2025-11-13 12:55:04 +00:00
` SELECT EXISTS(SELECT 1 FROM users WHERE email = ' ${ email } '); `
) . then ( ( result ) => {
cy . log ( "User existence :" , JSON . stringify ( result ? . rows ? . [ 0 ] ? . exists ) ) ;
2025-11-12 16:25:25 +00:00
if ( result ? . rows ? . [ 0 ] ? . exists ) {
2025-12-05 12:37:00 +00:00
cy . runSqlQueryOnDB ( ` CALL delete_users(ARRAY[' ${ email } ']::text[]); ` ) ;
2025-11-12 16:25:25 +00:00
}
} ) ;
} ;
2025-11-18 10:23:37 +00:00
export const verifyLabelAndInput = ( selectors , texts ) => {
Object . entries ( texts ) . forEach ( ( [ key , expectedText ] ) => {
const labelSelector = selectors [ key ] ;
2025-11-24 18:04:43 +00:00
const inputSelector = selectors [ key . replace ( "Label" , "Input" ) ] ;
2025-11-18 10:23:37 +00:00
//Verify label text
cy . get ( labelSelector )
. scrollIntoView ( )
2025-11-24 18:04:43 +00:00
. should ( "be.visible" )
. and ( "have.text" , expectedText ) ;
2025-11-18 10:23:37 +00:00
//Verify corresponding input is enabled (if exists)
if ( inputSelector ) {
cy . get ( inputSelector )
. scrollIntoView ( )
2025-11-24 18:04:43 +00:00
. should ( "be.visible" )
. and ( "be.enabled" ) ;
2025-11-18 10:23:37 +00:00
}
} ) ;
} ;
export const verifyElementText = ( selectors , texts ) => {
Object . entries ( texts ) . forEach ( ( [ key , expectedText ] ) => {
const selector = selectors [ key ] ;
cy . get ( selector )
. scrollIntoView ( )
2025-11-24 18:04:43 +00:00
. should ( "be.visible" )
. and ( "have.text" , expectedText ) ;
2025-11-18 10:23:37 +00:00
} ) ;
} ;