1919
2020import static org .assertj .core .api .Assertions .assertThat ;
2121import static org .assertj .core .api .Assumptions .assumeThat ;
22- import static org .assertj .core .api .InstanceOfAssertFactories .MAP ;
23- import static org .junit .jupiter .api .Assertions .assertEquals ;
2422import static org .junit .jupiter .api .Assertions .assertNull ;
2523import static org .junit .jupiter .api .Assertions .assertThrows ;
2624import static org .openqa .selenium .testing .drivers .Browser .CHROME ;
2725
2826import java .net .MalformedURLException ;
2927import java .net .URL ;
3028import java .time .Duration ;
29+ import java .util .List ;
30+ import org .junit .jupiter .api .AfterEach ;
3131import org .junit .jupiter .api .BeforeEach ;
3232import org .junit .jupiter .api .Test ;
33- import org .openqa .selenium .InvalidSelectorException ;
34- import org .openqa .selenium .JavascriptException ;
35- import org .openqa .selenium .JavascriptExecutor ;
33+ import org .openqa .selenium .By ;
34+ import org .openqa .selenium .NoAlertPresentException ;
35+ import org .openqa .selenium .WebDriver ;
36+ import org .openqa .selenium .WebElement ;
37+ import org .openqa .selenium .chrome .ChromeDriver ;
3638import org .openqa .selenium .chrome .ChromeOptions ;
39+ import org .openqa .selenium .environment .InProcessTestEnvironment ;
40+ import org .openqa .selenium .environment .webserver .AppServer ;
3741import org .openqa .selenium .support .ui .WebDriverWait ;
38- import org .openqa .selenium .testing .JupiterTestBase ;
39-
4042import org .openqa .selenium .testing .NeedsSecureServer ;
4143
4244@ NeedsSecureServer
43- class FederatedCredentialManagementTest extends JupiterTestBase {
45+ class FederatedCredentialManagementTest {
4446
45- private JavascriptExecutor jsAwareDriver ;
4647 private HasFederatedCredentialManagement fedcmDriver ;
48+ private WebDriver localDriver ;
49+ InProcessTestEnvironment environment = new InProcessTestEnvironment (true );
50+ AppServer appServer = environment .getAppServer ();
4751
4852 @ BeforeEach
4953 public void setup () {
5054 ChromeOptions options = (ChromeOptions ) CHROME .getCapabilities ();
51- // options.setAcceptInsecureCerts(true);
55+ options .setAcceptInsecureCerts (true );
5256 options .addArguments (
5357 String .format ("host-resolver-rules=MAP localhost:443 localhost:%d" , getSecurePort ()));
5458 options .addArguments ("ignore-certificate-errors" );
55- localDriver = seleniumExtension .createNewDriver (options );
59+ options .addArguments ("--enable-fedcm-without-well-known-enforcement" );
60+ localDriver = new ChromeDriver (options );
5661
5762 assumeThat (localDriver ).isInstanceOf (HasFederatedCredentialManagement .class );
58- jsAwareDriver = (JavascriptExecutor ) localDriver ;
5963 fedcmDriver = (HasFederatedCredentialManagement ) localDriver ;
6064 localDriver .get (appServer .whereIsSecure ("/fedcm/fedcm.html" ));
6165 }
6266
63- private Object triggerFedCm () {
64- return jsAwareDriver .executeScript ("triggerFedCm()" );
67+ @ AfterEach
68+ public void teardown () {
69+ localDriver .quit ();
70+ appServer .stop ();
6571 }
6672
6773 private void waitForDialog () {
68- WebDriverWait wait = new WebDriverWait (localDriver , Duration .ofSeconds (5 ));
74+ WebDriverWait wait = new WebDriverWait (localDriver , Duration .ofSeconds (20 ));
6975 wait .until (
7076 driver ->
7177 ((HasFederatedCredentialManagement ) driver ).getFederatedCredentialManagementDialog ()
@@ -87,51 +93,85 @@ void testDismissDialog() {
8793 fedcmDriver .setDelayEnabled (false );
8894 assertNull (fedcmDriver .getFederatedCredentialManagementDialog ());
8995
90- Object response = triggerFedCm ();
96+ WebElement triggerButton = localDriver .findElement (By .id ("triggerButton" ));
97+ triggerButton .click ();
9198
9299 waitForDialog ();
93100
94101 FederatedCredentialManagementDialog dialog =
95102 fedcmDriver .getFederatedCredentialManagementDialog ();
96103
97- assertEquals ("Sign in to localhost with localhost" , dialog .getTitle ());
98- assertEquals ("AccountChooser" , dialog .getDialogType ());
99-
104+ assertThat (dialog .getTitle ()).isEqualTo ("Sign in to localhost with localhost" );
105+ assertThat (dialog .getDialogType ()).isEqualTo ("AccountChooser" );
100106 dialog .cancelDialog ();
101107
102- // Check that the dialog was indeed closed (i.e. the promise now resolves).
103- assertThrows (
104- JavascriptException .class ,
105- () -> {
106- try {
107- jsAwareDriver .executeScript ("await promise" );
108- } catch (InvalidSelectorException ex ) {
109- // Due to a bug in Chromedriver (https://crbug.com/1454586), we may
110- // get an invalid selector exception here instead of a JavascriptException.
111- // Turn it into a JavascriptException to make the test pass for now.
112- throw new JavascriptException (ex .getMessage (), ex );
113- }
114- });
108+ // Check that the dialog was indeed closed. Unable to get the dialog type since the dialog was
109+ // closed.
110+ assertThrows (NoAlertPresentException .class , dialog ::getDialogType );
115111 }
116112
117113 @ Test
118114 void testSelectAccount () {
119- fedcmDriver .setDelayEnabled (false );
120115 assertNull (fedcmDriver .getFederatedCredentialManagementDialog ());
121116
122- Object response = triggerFedCm ();
117+ WebElement triggerButton = localDriver .findElement (By .id ("triggerButton" ));
118+ triggerButton .click ();
123119
124120 waitForDialog ();
125121
126122 FederatedCredentialManagementDialog dialog =
127123 fedcmDriver .getFederatedCredentialManagementDialog ();
128124
129- assertEquals ( "Sign in to localhost with localhost" , dialog . getTitle () );
130- assertEquals ( "AccountChooser" , dialog .getDialogType ());
125+ assertThat ( dialog . getTitle ()). isEqualTo ( "Sign in to localhost with localhost" );
126+ assertThat ( dialog .getDialogType ()). isEqualTo ( "AccountChooser" );
131127
132- dialog .selectAccount (0 );
128+ List <FederatedCredentialManagementAccount > accountList = dialog .getAccounts ();
129+ assertThat (accountList .size ()).isEqualTo (2 );
130+ dialog .selectAccount (1 );
131+ }
132+
133+ @ Test
134+ void testGetAccounts () {
135+ assertNull (fedcmDriver .getFederatedCredentialManagementDialog ());
136+
137+ WebElement triggerButton = localDriver .findElement (By .id ("triggerButton" ));
138+ triggerButton .click ();
139+
140+ waitForDialog ();
141+
142+ FederatedCredentialManagementDialog dialog =
143+ fedcmDriver .getFederatedCredentialManagementDialog ();
133144
134- response = jsAwareDriver .executeScript ("return await promise" );
135- assertThat (response ).asInstanceOf (MAP ).containsEntry ("token" , "a token" );
145+ assertThat (dialog .getTitle ()).isEqualTo ("Sign in to localhost with localhost" );
146+ assertThat (dialog .getDialogType ()).isEqualTo ("AccountChooser" );
147+
148+ List <FederatedCredentialManagementAccount > accountList = dialog .getAccounts ();
149+ assertThat (accountList .size ()).isEqualTo (2 );
150+
151+ FederatedCredentialManagementAccount account1 = accountList .get (0 );
152+
153+ assertThat (account1 .getName ()).isEqualTo ("John Doe" );
154+ assertThat (
account1 .
getEmail ()).
isEqualTo (
"[email protected] " );
155+ assertThat (account1 .getAccountid ()).isEqualTo ("1234" );
156+ assertThat (account1 .getGivenName ()).isEqualTo ("John" );
157+ assertThat (account1 .getIdpConfigUrl ()).contains ("/fedcm/config.json" );
158+ assertThat (account1 .getPictureUrl ()).isEqualTo ("https://idp.example/profile/123" );
159+ assertThat (account1 .getLoginState ()).isEqualTo ("SignUp" );
160+ assertThat (account1 .getTermsOfServiceUrl ())
161+ .isEqualTo ("https://rp.example/terms_of_service.html" );
162+ assertThat (account1 .getPrivacyPolicyUrl ()).isEqualTo ("https://rp.example/privacy_policy.html" );
163+
164+ FederatedCredentialManagementAccount account2 = accountList .get (1 );
165+
166+ assertThat (account2 .getName ()).isEqualTo ("Aisha Ahmad" );
167+ assertThat (
account2 .
getEmail ()).
isEqualTo (
"[email protected] " );
168+ assertThat (account2 .getAccountid ()).isEqualTo ("5678" );
169+ assertThat (account2 .getGivenName ()).isEqualTo ("Aisha" );
170+ assertThat (account2 .getIdpConfigUrl ()).contains ("/fedcm/config.json" );
171+ assertThat (account2 .getPictureUrl ()).isEqualTo ("https://idp.example/profile/567" );
172+ assertThat (account2 .getLoginState ()).isEqualTo ("SignUp" );
173+ assertThat (account2 .getTermsOfServiceUrl ())
174+ .isEqualTo ("https://rp.example/terms_of_service.html" );
175+ assertThat (account2 .getPrivacyPolicyUrl ()).isEqualTo ("https://rp.example/privacy_policy.html" );
136176 }
137177}
0 commit comments