2626import com .descope .model .auth .AuthenticationServices ;
2727import com .descope .model .auth .InviteOptions ;
2828import com .descope .model .client .Client ;
29+ import com .descope .model .magiclink .LoginOptions ;
2930import com .descope .model .mgmt .ManagementServices ;
31+ import com .descope .model .user .User ;
3032import com .descope .model .user .request .BatchUserPasswordHashed ;
3133import com .descope .model .user .request .BatchUserPasswordPbkdf2 ;
3234import com .descope .model .user .request .BatchUserPasswordSha ;
@@ -797,7 +799,7 @@ void testGenerateEnchantedLinkForTestUserForSuccess() {
797799 @ Test
798800 void testGenerateEmbeddedLinkForEmptyLoginId () {
799801 ServerCommonException thrown = assertThrows (ServerCommonException .class ,
800- () -> userService .generateEmbeddedLink ("" , null ));
802+ () -> userService .generateEmbeddedLink ("" , null , 0 ));
801803 assertNotNull (thrown );
802804 assertEquals ("The Login ID argument is invalid" , thrown .getMessage ());
803805 }
@@ -809,7 +811,7 @@ void testGenerateEmbeddedLinkForSuccess() {
809811 doReturn (mockResponse ).when (apiProxy ).post (any (), any (), any ());
810812 try (MockedStatic <ApiProxyBuilder > mockedApiProxyBuilder = mockStatic (ApiProxyBuilder .class )) {
811813 mockedApiProxyBuilder .when (() -> ApiProxyBuilder .buildProxy (any (), any ())).thenReturn (apiProxy );
812- String response = userService .generateEmbeddedLink ("someLoginId" , null );
814+ String response = userService .generateEmbeddedLink ("someLoginId" , null , 0 );
813815 Assertions .assertThat (response ).isEqualTo ("someToken" );
814816 }
815817 }
@@ -1068,11 +1070,11 @@ void testFunctionalGenerateEmbeddedLink() {
10681070 UserResponse user = createResponse .getUser ();
10691071 assertNotNull (user );
10701072 Assertions .assertThat (user .getLoginIds ()).contains (loginId );
1071- String token = userService .generateEmbeddedLink (loginId , null );
1073+ String token = userService .generateEmbeddedLink (loginId , null , 0 );
10721074 AuthenticationInfo authInfo = magicLinkService .verify (token );
10731075 assertNotNull (authInfo .getToken ());
10741076 assertThat (authInfo .getToken ().getJwt ()).isNotBlank ();
1075- token = userService .generateEmbeddedLink (loginId , mapOf ("kuku" , "kiki" ));
1077+ token = userService .generateEmbeddedLink (loginId , mapOf ("kuku" , "kiki" ), 0 );
10761078 final long now = System .currentTimeMillis ();
10771079 authInfo = magicLinkService .verify (token );
10781080 assertNotNull (authInfo .getToken ());
@@ -1121,7 +1123,7 @@ void testFunctionalGenerateEmbeddedLinkWithPhoneAsID() {
11211123 UserResponse user = createResponse .getUser ();
11221124 assertNotNull (user );
11231125 Assertions .assertThat (user .getLoginIds ()).contains (cleanPhone );
1124- String token = userService .generateEmbeddedLink (phone , null );
1126+ String token = userService .generateEmbeddedLink (phone , null , 0 );
11251127 AuthenticationInfo authInfo = magicLinkService .verify (token );
11261128 assertNotNull (authInfo .getToken ());
11271129 assertThat (authInfo .getToken ().getJwt ()).isNotBlank ();
@@ -1131,6 +1133,69 @@ void testFunctionalGenerateEmbeddedLinkWithPhoneAsID() {
11311133 userService .delete (phone );
11321134 }
11331135
1136+ @ Test
1137+ void testGenerateSignUpEmbeddedLinkForEmptyLoginId () {
1138+ ServerCommonException thrown = assertThrows (ServerCommonException .class ,
1139+ () -> userService .generateSignUpEmbeddedLink ("" , null , false , false , null , 0 ));
1140+ assertNotNull (thrown );
1141+ assertEquals ("The Login ID argument is invalid" , thrown .getMessage ());
1142+ }
1143+
1144+ @ Test
1145+ void testGenerateSignUpEmbeddedLinkForSuccess () {
1146+ GenerateEmbeddedLinkResponse mockResponse = new GenerateEmbeddedLinkResponse ("someSignUpToken" );
1147+ ApiProxy apiProxy = mock (ApiProxy .class );
1148+ doReturn (mockResponse ).when (apiProxy ).post (any (), any (), any ());
1149+ try (MockedStatic <ApiProxyBuilder > mockedApiProxyBuilder = mockStatic (ApiProxyBuilder .class )) {
1150+ mockedApiProxyBuilder .when (() -> ApiProxyBuilder .buildProxy (any (), any ())).thenReturn (apiProxy );
1151+ User user = User .builder ().name ("Test User" ).email ("test@example.com" ).build ();
1152+ LoginOptions loginOptions = LoginOptions .builder ().stepup (false ).mfa (false ).build ();
1153+ String response = userService .generateSignUpEmbeddedLink ("someLoginId" , user , true , false , loginOptions , 300 );
1154+ Assertions .assertThat (response ).isEqualTo ("someSignUpToken" );
1155+ }
1156+ }
1157+
1158+ @ RetryingTest (value = 3 , suspendForMs = 30000 , onExceptions = RateLimitExceededException .class )
1159+ void testFunctionalGenerateSignUpEmbeddedLink () {
1160+ String loginId = TestUtils .getRandomName ("signup-" );
1161+ String email = TestUtils .getRandomName ("test-" ) + "@descope.com" ;
1162+ String phone = "+1-555-555-5555" ;
1163+
1164+ User user = User .builder ()
1165+ .name ("Test Signup User" )
1166+ .email (email )
1167+ .phone (phone )
1168+ .build ();
1169+
1170+ LoginOptions loginOptions = LoginOptions .builder ()
1171+ .stepup (false )
1172+ .mfa (false )
1173+ .customClaims (mapOf ("signup" , true ))
1174+ .build ();
1175+
1176+ // Test generateSignUpEmbeddedLink with basic parameters
1177+ String token = userService .generateSignUpEmbeddedLink (loginId , user , true , true , loginOptions , 300 );
1178+ assertNotNull (token );
1179+ assertThat (token ).isNotBlank ();
1180+
1181+ // Verify the token by using magic link verify
1182+ AuthenticationInfo authInfo = magicLinkService .verify (token );
1183+ assertNotNull (authInfo .getToken ());
1184+ assertThat (authInfo .getToken ().getJwt ()).isNotBlank ();
1185+
1186+ // Verify custom claims are present
1187+ Map <String , Object > claims = authInfo .getToken ().getClaims ();
1188+ assertThat (claims ).containsKey ("signup" );
1189+ assertEquals (true , claims .get ("signup" ));
1190+
1191+ // Clean up - delete the created user
1192+ try {
1193+ userService .delete (loginId );
1194+ } catch (DescopeException e ) {
1195+ // User might not exist if sign-up didn't complete, ignore
1196+ }
1197+ }
1198+
11341199 @ RetryingTest (value = 3 , suspendForMs = 30000 , onExceptions = RateLimitExceededException .class )
11351200 void testFunctionalBatch () throws Exception {
11361201 String loginId = TestUtils .getRandomName ("u-" );
0 commit comments