@@ -596,4 +596,115 @@ void testUserBaseParameters() {
596596 Assertions .assertEquals (0 ,
597597 requestInfo .url ().queryParameterNames ().size ());
598598 }
599+
600+ @ Test
601+ @ Order (42 )
602+ @ DisplayName ("Test login with TOTP token" )
603+ void testLoginWithTOTPToken () {
604+ // Test basic login with TOTP token
605+ Request requestInfo = userInstance .login ("test@example.com" , "password" , "123456" ).request ();
606+
607+ // Verify request format
608+ Assertions .assertEquals ("POST" , requestInfo .method ());
609+ Assertions .assertEquals ("/v3/user-session" , requestInfo .url ().encodedPath ());
610+
611+ // Verify request body
612+ String requestBody = requestInfo .body ().toString ();
613+ Assertions .assertTrue (requestBody .contains ("\" tfa_token\" :\" 123456\" " ));
614+ }
615+
616+ @ Test
617+ @ Order (43 )
618+ @ DisplayName ("Test login with MFA parameters" )
619+ void testLoginWithMFAParameters () {
620+ // Test login with both token and secret (token should be used)
621+ Request requestInfo = userInstance .login ("test@example.com" , "password" , "123456" , "test-secret" ).request ();
622+
623+ // Verify request format
624+ Assertions .assertEquals ("POST" , requestInfo .method ());
625+ Assertions .assertEquals ("/v3/user-session" , requestInfo .url ().encodedPath ());
626+
627+ // Verify request body uses token
628+ String requestBody = requestInfo .body ().toString ();
629+ Assertions .assertTrue (requestBody .contains ("\" tfa_token\" :\" 123456\" " ));
630+ }
631+
632+ @ Test
633+ @ Order (44 )
634+ @ DisplayName ("Test login validation" )
635+ void testLoginValidation () {
636+ // Test with missing required parameters
637+ Assertions .assertThrows (IllegalArgumentException .class ,
638+ () -> userInstance .login (null , "password" , "123456" ).request ());
639+
640+ Assertions .assertThrows (IllegalArgumentException .class ,
641+ () -> userInstance .login ("test@example.com" , null , "123456" ).request ());
642+
643+ Assertions .assertThrows (IllegalArgumentException .class ,
644+ () -> userInstance .login ("test@example.com" , "password" , null ).request ());
645+ }
646+
647+ @ Test
648+ @ Order (45 )
649+ @ DisplayName ("Test TOTP generation from MFA secret" )
650+ void testTOTPGenerationFromSecret () {
651+ // Test login with MFA secret only
652+ Request requestInfo = userInstance .login ("test@example.com" , "password" , null , "test-secret" ).request ();
653+
654+ // Verify request format
655+ Assertions .assertEquals ("POST" , requestInfo .method ());
656+ Assertions .assertEquals ("/v3/user-session" , requestInfo .url ().encodedPath ());
657+
658+ // Verify generated TOTP format
659+ String requestBody = requestInfo .body ().toString ();
660+ Assertions .assertTrue (requestBody .contains ("\" tfa_token\" :\" " ));
661+
662+ // Extract TOTP token and verify it's 6 digits
663+ String token = requestBody .split ("\" tfa_token\" :\" " )[1 ].split ("\" " )[0 ];
664+ Assertions .assertTrue (token .matches ("\\ d{6}" ), "TOTP should be 6 digits" );
665+ }
666+
667+ @ Test
668+ @ Order (46 )
669+ @ DisplayName ("Test invalid MFA secret handling" )
670+ void testInvalidMFASecret () {
671+ // Test with invalid MFA secret
672+ IllegalArgumentException exception = Assertions .assertThrows (
673+ IllegalArgumentException .class ,
674+ () -> userInstance .login ("test@example.com" , "password" , null , "invalid-secret" ).request ()
675+ );
676+
677+ Assertions .assertTrue (exception .getMessage ().contains ("Invalid MFA secret key" ));
678+ }
679+
680+ @ Test
681+ @ Order (47 )
682+ @ DisplayName ("Test TOTP token priority over MFA secret" )
683+ void testTOTPPriority () {
684+ // When both token and secret are provided, token should be used
685+ Request requestInfo = userInstance .login ("test@example.com" , "password" , "123456" , "test-secret" ).request ();
686+ String requestBody = requestInfo .body ().toString ();
687+
688+ // Should use provided token, not generate from secret
689+ Assertions .assertTrue (requestBody .contains ("\" tfa_token\" :\" 123456\" " ));
690+ }
691+
692+ @ Test
693+ @ Order (48 )
694+ @ DisplayName ("Test null/empty MFA parameters" )
695+ void testNullEmptyMFAParams () {
696+ // Test with both null
697+ IllegalArgumentException exception1 = Assertions .assertThrows (
698+ IllegalArgumentException .class ,
699+ () -> userInstance .login ("test@example.com" , "password" , null , null ).request ()
700+ );
701+ Assertions .assertTrue (exception1 .getMessage ().contains ("Either tfaToken or mfaSecret must be provided" ));
702+
703+ // Test with empty secret
704+ IllegalArgumentException exception2 = Assertions .assertThrows (
705+ IllegalArgumentException .class ,
706+ () -> userInstance .login ("test@example.com" , "password" , null , "" ).request ()
707+ );
708+ Assertions .assertTrue (exception2 .getMessage ().contains ("Either tfaToken or mfaSecret must be provided" ));
709+ }
599710}
0 commit comments