]> source.dussan.org Git - archiva.git/blob
b4be7084693fa7107917de2faa11f32be0ef09cc
[archiva.git] /
1 package org.apache.maven.archiva.web.test;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *   http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import com.thoughtworks.selenium.DefaultSelenium;
23 import com.thoughtworks.selenium.Selenium;
24 import junit.framework.TestCase;
25 import org.codehaus.plexus.util.StringUtils;
26
27 import java.io.File;
28 import java.util.Calendar;
29 import java.util.Iterator;
30 import java.util.Map;
31 import java.util.Properties;
32
33 /**
34  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
35  * @version $Id$
36  */
37 public abstract class AbstractSeleniumTestCase
38     extends TestCase
39 {
40     public static final String CHECKBOX_CHECK = "on";
41
42     public static final String CHECKBOX_UNCHECK = "off";
43
44     private Selenium sel;
45
46     protected String adminUsername;
47
48     protected String adminPassword;
49
50     protected String adminFullName = getApplicationName() + " Admin";
51
52     protected String adminEmail = "admin@localhost.localdomain";
53
54     protected String maxWaitTimeInMs;
55
56     protected String baseUrl;
57
58     public void setUp()
59         throws Exception
60     {
61         super.setUp();
62
63         Properties p = new Properties();
64         p.load ( this.getClass().getClassLoader().getResourceAsStream( "it.properties" ) );
65
66         baseUrl = p.getProperty( "BASE_URL" );
67         maxWaitTimeInMs = p.getProperty( "MAX_WAIT_TIME_IN_MS" );
68         adminUsername = p.getProperty( "ADMIN_USERNAME" );
69         adminPassword = p.getProperty( "ADMIN_PASSWORD" );
70         String seleniumHost = p.getProperty( "SELENIUM_HOST" );
71         int seleniumPort = Integer.parseInt( (p.getProperty( "SELENIUM_PORT" ) ) );
72
73         String browser = System.getProperty( "browser" );
74         if ( StringUtils.isEmpty( browser ) )
75         {
76             browser = p.getProperty( "SELENIUM_BROWSER" );
77         }
78
79         sel = new DefaultSelenium( seleniumHost, seleniumPort, browser, baseUrl );
80         sel.start();
81         initialize();
82     }
83
84     public void tearDown()
85         throws Exception
86     {
87         sel.stop();
88     }
89
90     public Selenium getSelenium()
91     {
92         return sel;
93     }
94
95     public abstract String getBaseUrl();
96
97     /**
98      * We create an admin user if it doesn't exist
99      */
100     protected void initialize()
101     {
102         open( getWebContext() );
103
104         if ( getTitle().endsWith( "Create Admin User" ) )
105         {
106             assertCreateAdminUserPage();
107             submitCreateAdminUserPage( adminFullName, adminEmail, adminPassword, adminPassword );
108             assertLoginPage();
109             submitLoginPage( adminUsername, adminPassword );
110             postAdminUserCreation();
111             logout();
112         }
113     }
114
115     /**
116      * where webapp initial configurations can be done
117      */
118     protected void postAdminUserCreation()
119     {
120         if ( getTitle().endsWith( "Continuum - Configuration" ) )
121         {
122                 setFieldValue("baseUrl", baseUrl);
123                 clickButtonWithValue( "Save" );
124         }
125     }
126
127     protected abstract String getApplicationName();
128
129     /**
130      * some webapps have
131      *
132      * @return the page prefix set by the webapp
133      */
134     protected String getTitlePrefix()
135     {
136         return "";
137     }
138
139     protected abstract String getInceptionYear();
140
141     protected String getWebContext()
142     {
143         return "/";
144     }
145
146     public void open( String url )
147     {
148         sel.open( url );
149     }
150
151     public String getTitle()
152     {
153         return sel.getTitle();
154     }
155
156     public String getHtmlContent()
157     {
158         return getSelenium().getHtmlSource();
159     }
160
161     public void assertTextPresent( String text )
162     {
163         assertTrue( "'" + text + "' isn't present.", sel.isTextPresent( text ) );
164     }
165
166     public void assertTextNotPresent( String text )
167     {
168         assertFalse( "'" + text + "' is present.", sel.isTextPresent( text ) );
169     }
170
171     public void assertElementPresent( String elementLocator )
172     {
173         assertTrue( "'" + elementLocator + "' isn't present.", isElementPresent( elementLocator ) );
174     }
175
176     public void assertElementNotPresent( String elementLocator )
177     {
178         assertFalse( "'" + elementLocator + "' is present.", isElementPresent( elementLocator ) );
179     }
180
181     public void assertLinkPresent( String text )
182     {
183         assertTrue( "The link '" + text + "' isn't present.", isElementPresent( "link=" + text ) );
184     }
185
186     public void assertLinkNotPresent( String text )
187     {
188         assertFalse( "The link '" + text + "' is present.", isElementPresent( "link=" + text ) );
189     }
190
191     public void assertImgWithAlt( String alt )
192     {
193         assertElementPresent( "//img[@alt='" + alt + "']" );
194     }
195
196     public void assertImgWithAltAtRowCol( boolean isALink, String alt, int row, int column )
197     {
198         String locator = "//tr[" + row + "]/td[" + column + "]/";
199         locator += isALink ? "a/" : "";
200         locator += "img[@alt='" + alt + "']";
201
202         assertElementPresent( locator );
203     }
204
205     public void assertCellValueFromTable( String expected, String tableElement, int row, int column )
206     {
207         assertEquals( expected, getCellValueFromTable( tableElement, row, column ) );
208     }
209
210     public boolean isTextPresent( String text )
211     {
212         return sel.isTextPresent( text );
213     }
214
215     public boolean isLinkPresent( String text )
216     {
217         return isElementPresent( "link=" + text );
218     }
219
220     public boolean isElementPresent( String locator )
221     {
222         return sel.isElementPresent( locator );
223     }
224
225     public void waitPage()
226     {
227         waitPage( 180000 );
228     }
229
230     public void waitPage( int nbMillisecond )
231     {
232         sel.waitForPageToLoad( String.valueOf( nbMillisecond ) );
233     }
234
235     public void assertPage( String title )
236     {
237         assertEquals( getTitlePrefix() + title, getTitle() );
238         assertHeader();
239         assertFooter();
240     }
241
242     public abstract void assertHeader();
243
244     
245     public void assertFooter()
246     {
247         int currentYear = Calendar.getInstance().get( Calendar.YEAR );
248         assertTrue( getSelenium().getText( "xpath=//div[@id='footer']/div[1]" ).endsWith(
249             "Copyright © " + getInceptionYear() + "-" + currentYear + " The Apache Software Foundation" ) );
250     }
251
252     public String getFieldValue( String fieldName )
253     {
254         return sel.getValue( fieldName );
255     }
256
257     public String getCellValueFromTable( String tableElement, int row, int column )
258     {
259         return getSelenium().getTable( tableElement + "." + row + "." + column );
260     }
261
262     public void selectValue( String locator, String value )
263     {
264         getSelenium().select( locator, "label=" + value );
265     }
266
267     public void submit()
268     {
269         clickLinkWithXPath( "//input[@type='submit']" );
270     }
271
272     public void assertButtonWithValuePresent( String text )
273     {
274         assertTrue( "'" + text + "' button isn't present", isButtonWithValuePresent( text ) );
275     }
276
277     public void assertButtonWithValueNotPresent( String text )
278     {
279         assertFalse( "'" + text + "' button is present", isButtonWithValuePresent( text ) );
280     }
281
282     public boolean isButtonWithValuePresent( String text )
283     {
284         return isElementPresent( "//button[@value='" + text + "']" ) || isElementPresent( "//input[@value='" + text + "']" );
285     }
286
287     public void clickButtonWithValue( String text )
288     {
289         clickButtonWithValue( text, true );
290     }
291
292     public void clickButtonWithValue( String text, boolean wait )
293     {
294         assertButtonWithValuePresent( text );
295
296         if ( isElementPresent( "//button[@value='" + text + "']" ) )
297         {
298             clickLinkWithXPath( "//button[@value='" + text + "']", wait );
299         }
300         else
301         {
302             clickLinkWithXPath( "//input[@value='" + text + "']", wait );
303         }
304     }
305
306     public void clickSubmitWithLocator( String locator )
307     {
308         clickLinkWithLocator( locator );
309     }
310
311     public void clickSubmitWithLocator( String locator, boolean wait )
312     {
313         clickLinkWithLocator( locator, wait );
314     }
315
316     public void clickImgWithAlt( String alt )
317     {
318         clickLinkWithLocator( "//img[@alt='" + alt + "']" );
319     }
320
321     public void clickLinkWithText( String text )
322     {
323         clickLinkWithText( text, true );
324     }
325
326     public void clickLinkWithText( String text, boolean wait )
327     {
328         clickLinkWithLocator( "link=" + text, wait );
329     }
330
331     public void clickLinkWithXPath( String xpath )
332     {
333         clickLinkWithXPath( xpath, true );
334     }
335
336     public void clickLinkWithXPath( String xpath, boolean wait )
337     {
338         clickLinkWithLocator( "xpath=" + xpath, wait );
339     }
340
341     public void clickLinkWithLocator( String locator )
342     {
343         clickLinkWithLocator( locator, true );
344     }
345
346     public void clickLinkWithLocator( String locator, boolean wait )
347     {
348         assertElementPresent( locator );
349         sel.click( locator );
350         if ( wait )
351         {
352             waitPage();
353         }
354     }
355
356     public void setFieldValues( Map fieldMap )
357     {
358         Map.Entry entry;
359
360         for ( Iterator entries = fieldMap.entrySet().iterator(); entries.hasNext(); )
361         {
362             entry = (Map.Entry) entries.next();
363
364             sel.type( (String) entry.getKey(), (String) entry.getValue() );
365         }
366     }
367
368     public void setFieldValue( String fieldName, String value )
369     {
370         sel.type( fieldName, value );
371     }
372
373     public void checkField( String locator )
374     {
375         sel.check( locator );
376     }
377
378     public void uncheckField( String locator )
379     {
380         sel.uncheck( locator );
381     }
382
383     public boolean isChecked( String locator )
384     {
385         return sel.isChecked( locator );
386     }
387
388     //////////////////////////////////////
389     // Login
390     //////////////////////////////////////
391     public void goToLoginPage()
392     {
393         clickLinkWithText( "Login" );
394
395         assertLoginPage();
396     }
397
398     public void login( String username, String password )
399     {
400         login( username, password, true, "Login Page" );
401     }
402
403     public void login( String username, String password, boolean valid, String assertReturnPage )
404     {
405         if ( isLinkPresent( "Login" ) )
406         {
407             goToLoginPage();
408
409             submitLoginPage( username, password, false, valid, assertReturnPage );
410         }
411     }
412
413     public void assertLoginPage()
414     {
415         assertPage( "Login Page" );
416         assertTextPresent( "Login" );
417         assertTextPresent( "Username" );
418         assertTextPresent( "Password" );
419         assertTextPresent( "Remember Me" );
420         assertFalse( isChecked( "rememberMe" ) );
421     }
422
423     public void submitLoginPage( String username, String password )
424     {
425         submitLoginPage( username, password, false, true, "Login Page" );
426     }
427
428     public void submitLoginPage( String username, String password, boolean validUsernamePassword )
429     {
430         submitLoginPage( username, password, false, validUsernamePassword, "Login Page" );
431     }
432
433     public void submitLoginPage( String username, String password, boolean rememberMe, boolean validUsernamePassword,
434                                  String assertReturnPage )
435     {
436         assertLoginPage();
437         setFieldValue( "username", username );
438         setFieldValue( "password", password );
439         if ( rememberMe )
440         {
441             checkField( "rememberMe" );
442         }
443         clickButtonWithValue( "Login" );
444
445         if ( validUsernamePassword )
446         {
447             //assertTextPresent( "Current User:" );
448             assertTextPresent( username );
449             assertLinkPresent( "Edit Details" );
450             assertLinkPresent( "Logout" );
451         }
452         else
453         {
454             if ( "Login Page".equals( assertReturnPage ) )
455             {
456                 assertLoginPage();
457             }
458             else
459             {
460                 assertPage( assertReturnPage );
461             }
462         }
463     }
464
465     public boolean isAuthenticated()
466     {
467         return !( isLinkPresent( "Login" ) && isLinkPresent( "Register" ) );
468     }
469
470     //////////////////////////////////////
471     // Logout
472     //////////////////////////////////////
473     public void logout()
474     {
475         assertTrue( "User wasn't authenticated.", isAuthenticated() );
476         clickLinkWithText( "Logout" );
477         assertFalse( "The user is always authenticated after a logout.", isAuthenticated() );
478     }
479
480     //////////////////////////////////////
481     // My Account
482     //////////////////////////////////////
483     public void goToMyAccount()
484     {
485         clickLinkWithText( "Edit Details" );
486     }
487
488     public void assertMyAccountDetails( String username, String newFullName, String newEmailAddress )
489         throws Exception
490     {
491         assertPage( "Account Details" );
492
493         //isTextPresent( "Username" );
494         assertTextPresent( "Username:" );
495         assertElementPresent( "registerForm_user_username" );
496         assertCellValueFromTable( username, "//form/table", 0, 1 );
497
498         assertTextPresent( "Full Name*:" );
499         assertElementPresent( "user.fullName" );
500         assertEquals( newFullName, getFieldValue( "user.fullName" ) );
501
502         assertTextPresent( "Email Address*:" );
503         assertElementPresent( "user.email" );
504         assertEquals( newEmailAddress, getFieldValue( "user.email" ) );
505         
506         assertTextPresent("Current Password*:");
507         assertElementPresent("oldPassword");
508
509         assertTextPresent( "New Password*:" );
510         assertElementPresent( "user.password" );
511
512         assertTextPresent( "Confirm Password*:" );
513         assertElementPresent( "user.confirmPassword" );
514
515         assertTextPresent( "Last Password Change" );
516         assertElementPresent( "registerForm_user_timestampLastPasswordChange" );
517
518     }
519
520     public void editMyUserInfo( String newFullName, String newEmailAddress, String oldPassword, String newPassword,
521                                 String confirmNewPassword )
522     {
523         goToMyAccount();
524
525         setFieldValue( "user.fullName", newFullName );
526         setFieldValue( "user.email", newEmailAddress );
527         setFieldValue( "oldPassword", oldPassword );
528         setFieldValue( "user.password", newPassword );
529         setFieldValue( "user.confirmPassword", confirmNewPassword );
530         clickButtonWithValue( "Submit" );
531     }
532
533     //////////////////////////////////////
534     // Users
535     //////////////////////////////////////
536     public void assertUsersListPage()
537     {
538         assertPage( "[Admin] User List" );
539     }
540
541     public void assertCreateUserPage()
542     {
543         assertPage( "[Admin] User Create" );
544         assertTextPresent( "Username" );
545         assertTextPresent( "Full Name" );
546         assertTextPresent( "Email Address" );
547         assertTextPresent( "Password" );
548         assertTextPresent( "Confirm Password" );
549     }
550
551     public void assertUserRolesPage()
552     {
553         assertPage( "[Admin] User Edit" );
554         assertTextPresent( "[Admin] User Roles" );
555         assertTextPresent( "Assigned Roles" );
556         assertTextPresent( "Available Roles" );
557     }
558
559     public void assertDeleteUserPage( String username )
560     {
561         assertPage( "[Admin] User Delete" );
562         assertTextPresent( "[Admin] User Delete" );
563         assertTextPresent( "The following user will be deleted: " + username );
564         assertButtonWithValuePresent( "Delete User" );
565     }
566
567     //////////////////////////////////////
568     // Create Admin User
569     //////////////////////////////////////
570     public void assertCreateAdminUserPage()
571     {
572         assertPage( "Create Admin User" );
573         assertTextPresent( "Create Admin User" );
574         assertTextPresent( "Username" );
575         assertElementPresent( "user.username" );
576         assertTextPresent( "Full Name" );
577         assertElementPresent( "user.fullName" );
578         assertTextPresent( "Email Address" );
579         assertElementPresent( "user.email" );
580         assertTextPresent( "Password" );
581         assertElementPresent( "user.password" );
582         assertTextPresent( "Confirm Password" );
583         assertElementPresent( "user.confirmPassword" );
584     }
585
586     public void submitCreateAdminUserPage( String fullName, String email, String password, String confirmPassword )
587     {
588         setFieldValue( "user.fullName", fullName );
589         setFieldValue( "user.email", email );
590         setFieldValue( "user.password", password );
591         setFieldValue( "user.confirmPassword", confirmPassword );
592         submit();
593         waitPage();
594     }
595
596     public String getBasedir()
597     {
598         String basedir = System.getProperty( "basedir" );
599
600         if ( basedir == null )
601         {
602             basedir = new File( "" ).getAbsolutePath();
603         }
604
605         return basedir;
606     }    
607     
608 }