1   /**
2    * 
3    */
4   package org.melati.admin.test;
5   
6   import java.util.ArrayList;
7   
8   import junit.framework.AssertionFailedError;
9   
10  import net.sourceforge.jwebunit.html.Cell;
11  import net.sourceforge.jwebunit.html.Row;
12  import net.sourceforge.jwebunit.html.Table;
13  
14  import org.melati.JettyWebTestCase;
15  import org.melati.util.HTMLUtils;
16  
17  /**
18   * FIXME bug when id specified in url db/table/Main?id=0
19   * @author timp
20   * @since 2008/01/01
21   */
22  public class AdminJettyWebTest extends JettyWebTestCase {
23     private String dbName = "melatijunit";
24    
25    /**
26     * 
27     */
28    public AdminJettyWebTest() {
29      super();
30    }
31    /**
32     * @param name
33     */
34    public AdminJettyWebTest(String name) {
35      super(name);
36    }
37    /**
38     * If you don't know by now.
39     * @param args
40     * @throws Exception
41     */
42    public static void main(String[] args) throws Exception {
43      startServer(8080);
44    }
45  
46    // Test Page calls
47    /**
48     * 
49     */
50    public void testBadUrl() {
51      setScriptingEnabled(false);
52      beginAt("/Admin/" + dbName + "/Unknown");
53      assertTextPresent("Melati Error Template");
54    }
55    /**
56     * 
57     */
58    public void testAdminMain() {
59      setScriptingEnabled(false);
60      beginAt("/Admin/" + dbName + "/Main");
61      assertTextPresent("You need a frames enabled browser to use the Admin Suite");
62    }
63    /**
64     * 
65     */
66    public void testAdminTop() {
67      setScriptingEnabled(false);
68      beginAt("/Admin/" + dbName + "/Top");
69      assertTextPresent("Melati Database Admin Suite - Options for Melatijunit database");
70    }
71    /**
72     * 
73     */
74    public void testAdminTopWithTable() {
75      setScriptingEnabled(false);
76      beginAt("/Admin/" + dbName + "/user/Top");
77      assertTextPresent("Melati Database Admin Suite - Options for Melatijunit database");
78    }
79    /**
80     * 
81     */
82    public void testAdminTopWithTableAndTroid() {
83      setScriptingEnabled(false);
84      beginAt("/Admin/" + dbName + "/user/0/Top");
85      assertTextPresent("Melati Database Admin Suite - Options for Melatijunit database");
86    }
87    
88    /**
89     * 
90     */
91    public void testUpload() {
92      setScriptingEnabled(false);
93      beginAt("/Admin/" + dbName + "/user/Upload?field=tim");
94      assertTextPresent("File to upload:");
95    }
96    
97    /**
98     * Test that an AdminSpecialised object has its special templet included in edit.
99     */
100   public void testAdminSpecialised() { 
101     setScriptingEnabled(false);
102     loginAsAdministrator();
103     gotoPage("/Admin/admintest/uploadedfile/Main");
104     gotoRootWindow();
105     gotoFrame("admin_top");
106     setWorkingForm("goto");
107     selectOption("goto","Uploaded File");
108     assertFormPresent("goto");
109     submit();
110     setScriptingEnabled(true);
111     gotoRootWindow();
112     gotoFrame("admin_bottom");
113     gotoFrame("admin_left");
114     gotoFrame("admin_navigation");
115     clickLink("add");
116     gotoRootWindow();
117     gotoFrame("admin_bottom");
118     gotoFrame("admin_record");
119     
120     setTextField("field_filename","test.txt");
121     clickLinkWithText("Upload a new file");
122     gotoWindow("filename");
123     setTextField("file","/dist/melati/melati/src/main/java/org/melati/admin/static/file.gif");
124     
125     submit();
126     gotoFrame("admin_bottom");
127     gotoFrame("admin_record");
128     submit();
129     gotoPage("/Admin/admintest/uploadedfile/0/Edit");
130     assertTextPresent("Hi");    
131   }
132   
133   /**
134    * Test that an AdminSpecialised object invokes its own handler.
135    */
136   public void testAdminSpecialisedHandler() { 
137     setScriptingEnabled(false);
138     beginAt("/Admin/admintest/specialised/Main");
139     gotoAddRecord("Specialised");
140     setTextField("field_name", "test");
141     submit();
142     assertTextPresent("Done");
143     beginAt("/Admin/admintest/specialised/0/NotAnAdminMethod");
144     assertTextPresent("Hi, I'm Special."); 
145     // Hmm, is this intended behaviour?
146     beginAt("/Admin/admintest/specialised/0/Edit");
147     assertTextPresent("Hi, I'm Special.");        
148   }
149   
150   /**
151    * Test that if there is no primary select column on the table 
152    * no primary criteria are displayed. 
153    */
154   public void testNoPrimarySelect() { 
155     setScriptingEnabled(false);
156     beginAt("/Admin/admintest/user/PrimarySelect");
157     assertTablePresent("primarySelectTable");
158     beginAt("/Admin/admintest/uploadedfile/PrimarySelect");
159     assertTableNotPresent("primarySelectTable");
160     beginAt("/Admin/admintest/user/PrimarySelect?field_name=");
161     assertTablePresent("primarySelectTable");
162 
163     // Relies upon an object already being created in previous test
164     beginAt("/Admin/admintest/specialised/0/PrimarySelect");
165     assertTableNotPresent("primarySelectTable");
166     
167   }
168   
169 
170   /**
171    *  Getting the coverage is proof enough.
172    */
173   public void testDescendingOrder() { 
174     setScriptingEnabled(false);
175     beginAt("/Admin/admintest/user/Selection?target=admin_record&returnTarget=admin_record&field_id=0&field_order-1=1&field_order-1-toggle=true");
176     beginAt("/Admin/admintest/user/Selection?target=admin_record&returnTarget=admin_record&field_id=0&field_order-1=1&field_order-1-toggle=true");
177     beginAt("/Admin/admintest/uploadedfile/Selection?target=admin_record&returnTarget=admin_record&field_order-1=70&field_order-1-toggle=true");
178     beginAt("/Admin/admintest/uploadedfile/Selection?target=admin_record&returnTarget=admin_record&field_order-1=70&field_order-1-toggle=true");
179   }
180   /**
181    * 
182    */
183   public void testAdminBottom() {
184     setScriptingEnabled(false);
185     beginAt("/Admin/" + dbName + "/user/Bottom");
186     // Hmmm Should assert something, coverage is the thing
187   }
188   /**
189    * 
190    */
191   public void testAdminRight() {
192     setScriptingEnabled(false);
193     beginAt("/Admin/" + dbName + "/user/0/Right");
194     // Hmmm Should assert something, coverage is the thing
195   }
196   /**
197    * 
198    */
199   public void testAdminPrimarySelect() {
200     setScriptingEnabled(false);
201     beginAt("/Admin/" + dbName + "/user/PrimarySelect");
202     assertTextPresent("Full name");
203   }
204   /**
205    * 
206    */
207   public void testAdminSelection() {
208     setScriptingEnabled(false);
209     beginAt("/Admin/" + dbName + "/user/Selection?target=&returnTarget=");
210     assertTextPresent("Full name");
211     assertTextPresent("Melati guest user");
212     clickLinkWithText("Full name");
213     Table s = getTable("selectionTable");
214     ArrayList rows = s.getRows();
215     for (int i = 0; i< rows.size(); i++) { 
216       ArrayList cells = ((Row)rows.get(i)).getCells();
217       for (int j = 0; j< cells.size(); j++) { 
218         String value = ((Cell)cells.get(j)).getValue();
219         if(i == 2 && j == 2)
220           assertEquals("_guest_", value);
221         if(i == 3 && j == 2)
222           assertEquals("_administrator_", value);
223       }
224     }
225     clickLinkWithText("Full name");
226     s = getTable("selectionTable");
227     rows = s.getRows();
228     for (int i = 0; i< rows.size(); i++) { 
229       ArrayList cells = ((Row)rows.get(i)).getCells();
230       for (int j = 0; j< cells.size(); j++) { 
231         String value = ((Cell)cells.get(j)).getValue();
232         if(i == 2 && j == 2)
233           assertEquals("_administrator_", value);
234         if(i == 3 && j == 2)
235           assertEquals("_guest_", value);
236       }
237     }
238     clickLinkWithText("Full name");
239     s = getTable("selectionTable");
240     rows = s.getRows();
241     for (int i = 0; i< rows.size(); i++) { 
242       ArrayList cells = ((Row)rows.get(i)).getCells();
243       for (int j = 0; j< cells.size(); j++) { 
244         String value = ((Cell)cells.get(j)).getValue();
245         if(i == 2 && j == 2)
246           assertEquals("_guest_", value);
247         if(i == 3 && j == 2)
248           assertEquals("_administrator_", value);
249       }
250     }
251     clickLinkWithText("Full name");
252     s = getTable("selectionTable");
253     rows = s.getRows();
254     for (int i = 0; i< rows.size(); i++) { 
255       ArrayList cells = ((Row)rows.get(i)).getCells();
256       for (int j = 0; j< cells.size(); j++) { 
257         String value = ((Cell)cells.get(j)).getValue();
258         if(i == 2 && j == 2)
259           assertEquals("_administrator_", value);
260         if(i == 3 && j == 2)
261           assertEquals("_guest_", value);
262       }
263     }
264   }
265   /**
266    * Can we get to page three and back.
267    */
268   public void testSelectionPaging() { 
269     setScriptingEnabled(false);
270     beginAt("/Admin/" + dbName + "/columninfo/Selection?target=&returnTarget=");
271     clickLinkWithText(">");
272     clickLinkWithText(">");
273     clickLinkWithText(">");
274     assertTextPresent("Records 61 to 69 of 69");
275     clickLinkWithText("<");
276     clickLinkWithText("<");
277     clickLinkWithText("<");
278     assertTextPresent("Records 1 to 20 of 69");
279   }
280   /**
281    * 
282    */
283   public void testAdminEditHeader() {
284     setScriptingEnabled(false);
285     beginAt("/Admin/" + dbName + "/user/0/EditHeader");
286     assertTextPresent("User");
287     assertTextPresent("_guest_");
288   }
289   /**
290    * 
291    */
292   public void testAdminEdit() {
293     setScriptingEnabled(false);
294     beginAt("/Admin/" + dbName + "/user/0/Edit");
295     assertTextPresent("Full name");
296     assertTextPresent("_guest_");
297   }
298   
299   /**
300    * 
301    */
302   public void testAdminEditField() { 
303     setScriptingEnabled(false);
304     beginAt("/Admin/admintest/markup/Main");
305     gotoAddRecord("Markup");
306     assertEquals("&Aacute;",HTMLUtils.entityFor("\u00C1".charAt(0),false, null, false));
307     //char it = 193;
308     //System.err.println("\u00C1".charAt(0));
309     //System.err.println(new Integer("\u00C1".charAt(0)));
310     //System.err.println(new Integer("?".charAt(0)));
311     //System.err.println("Acirc=" +new Integer("Â".charAt(0)));
312     //System.err.println("");
313 
314     setTextField("field_text", "\u00C1");
315     submit();
316     assertTextPresent("Done");
317     beginAt("/Admin/admintest/markup/0/Edit");
318     assertEquals("\u00C1",getFormFieldValue("field_text"));
319     assertTextPresent("\u00C1");
320   }
321   /**
322    * @param fieldName
323    * @return value of named field
324    */
325   public String getFormFieldValue(String fieldName) { 
326     try { 
327       return getTester().getElementAttributByXPath(
328             "//input[@name='" + fieldName + "']", "value");
329     } catch (AssertionFailedError e) { 
330       System.out.println("Form element not present:" + fieldName);
331       System.out.println(getTester().getPageSource());
332       throw e;             
333     }
334     
335   }
336   /**
337    * @param fieldName
338    * @return value of named field
339    */
340   public String getFormTextareaValue(String fieldName) { 
341     return getTester().getElementTextByXPath(
342             "//textarea[@name='" + fieldName + "']");
343     
344   }
345 
346   /**
347    * Test that login is required.
348    */
349   public void testAdminEditAdministrator() {
350     setScriptingEnabled(false);
351     beginAt("/Admin/" + dbName + "/user/1/Edit");
352     assertTextPresent("You need to log in.");
353     setTextField("field_login", "_administrator55_");
354     setTextField("field_password", "FIXME");
355     checkCheckbox("rememberme");
356     submit("action");
357     setTextField("field_login", "_administrator_");
358     setTextField("field_password", "FIXME_not");
359     checkCheckbox("rememberme");
360     submit("action");
361     setTextField("field_login", "_administrator_");
362     setTextField("field_password", "FIXME");
363     checkCheckbox("rememberme");
364     submit("action");
365     assertTextPresent("Full name");
366     assertTextPresent("_administrator_");
367 
368     // Note that logging out has no effect if rememberme was chosen
369     gotoPage("/Logout/" + dbName + "");
370     gotoPage("/Admin/" + dbName + "/user/1/Edit");
371     setTextField("field_login", "_administrator_");
372     setTextField("field_password", "FIXME");
373     submit("action");
374     assertTextPresent("Updated a User Record");
375     assertTextPresent("Done");
376   }
377   /**
378    * Test that we are challenged to get into the everything db.
379    */
380   public void testEverythingIsProtected() {
381     setScriptingEnabled(false);
382     beginAt("/Admin/everything/Main");
383     assertTextPresent("You need to log in");
384     
385   }
386   /**
387    * 
388    */
389   public void testAdminTree() {
390     setScriptingEnabled(true);
391     beginAt("/Admin/" + dbName + "/user/0/Record");
392     gotoFrame("admin_edit_header");
393     assertTextPresent("_guest_");
394     assertTextPresent("[ Group membership ]");
395     clickLink("recordTree");
396     gotoRootWindow();
397     gotoFrame("admin_edit_user_0");
398     assertTextPresent("Melati guest user tree");
399     clickLinkWithText("Melati guest user");
400   }
401   /**
402    * 
403    */
404   public void testAdminTreeNoScript() {
405     setScriptingEnabled(false);
406     beginAt("/Admin/" + dbName + "/user/0/Tree");
407     assertTextPresent("Melati guest user tree");
408   }
409   /**
410    * 
411    */
412   public void testAdminTableTree() {
413     setScriptingEnabled(true);
414     beginAt("/Admin/" + dbName + "/user/Table");
415     gotoFrame("admin_navigation");
416     clickLink("tableTree");
417     gotoRootWindow();
418     gotoFrame("admin_selection");
419     assertTextPresent("User table tree");
420     assertLinkPresentWithText("Melati guest user");
421     assertLinkPresentWithText("Melati database administrator");
422   }
423   /**
424    * 
425    */
426   public void testAdminSelectionWindow() {
427     setScriptingEnabled(false);
428     beginAt("/Admin/" + dbName + "/user/SelectionWindow?returnfield=field_user");
429     assertTextPresent("Select a User");
430   }
431   /**
432    * 
433    */
434   public void testAdminSelectionWindowPrimarySelect() {
435     setScriptingEnabled(false);
436     beginAt("/Admin/" + dbName + "/user/SelectionWindowPrimarySelect?returnfield=field_user");
437     assertTextPresent("Full name");
438   }
439   /**
440    * 
441    */
442   public void testAdminSelectionWindowSelection() {
443     setScriptingEnabled(false);
444     beginAt("/Admin/" + dbName + "/user/SelectionWindowSelection?returnfield=field_user");
445     assertTextPresent("Records 1 to 2 of 2");
446   }
447   /**
448    * 
449    */
450   public void testAdminPopup() {
451     setScriptingEnabled(false);
452     beginAt("/Admin/" + dbName + "/user/PopUp");
453     assertTextPresent("Search User Table");
454   }
455   /**
456    * 
457    */
458   public void testAdminDSD() {
459     setScriptingEnabled(false);
460     beginAt("/Admin/" + dbName + "/DSD");
461     assertTextPresent("Generated for _guest_");
462     assertTextPresent("package org.melati.poem;");
463   }
464   /**
465    * Move to login
466    */
467   public void testLoginWithContinuation() {
468     setScriptingEnabled(false);
469     beginAt("/Login/" + dbName + "?continuationURL=" + contextUrl("/index.html"));
470     setTextField("field_login", "_administrator_");
471     setTextField("field_password", "FIXME");
472     checkCheckbox("rememberme");
473     submit("action");
474     assertTextPresent("Hello World!");
475   }
476   
477   /**
478    * Test setting the defaults.
479    */
480   public void testSetupStory() { 
481     setScriptingEnabled(false);
482     loginAsAdministrator();
483     gotoFrame("admin_top");
484     clickLinkWithText("Setup");
485     gotoRootWindow();
486     gotoFrame("admin_bottom");
487     assertTextPresent("Done");
488     //deleteRecord("setting","org.melati.admin.Admin.ScreenStylesheetURL", 0);
489     //deleteRecord("setting","org.melati.admin.Admin.PrimaryDisplayTable", 1);
490     //deleteRecord("setting","org.melati.admin.Admin.HomepageURL", 2);
491     //gotoPage("/Admin/" + dbName + "/setting/Main");
492     //gotoFrame("admin_bottom");
493     //gotoFrame("admin_left");
494     //gotoFrame("admin_selection");
495     //assertTextPresent("No records found");
496   }
497 
498   
499   /**
500    * Search for a set of records.
501    */
502   public void testSearchAndGoto() {
503     setScriptingEnabled(false);
504     beginAt("/Admin/" + dbName + "/Main");
505     gotoRootWindow();
506     gotoFrame("admin_top");
507     setWorkingForm("goto");
508     selectOption("goto","Column");
509     assertFormPresent("goto");
510     submit();
511     gotoRootWindow();
512     gotoFrame("admin_bottom");
513     gotoFrame("admin_left");
514     gotoFrame("admin_navigation");
515     clickLink("search");
516     gotoWindow("admin_search");
517     setTextField("field_displayname", "Id");
518     selectOption("field_order-1","Id");
519     selectOption("field_order-2","Owning table");
520     submit();
521     gotoRootWindow();
522     gotoFrame("admin_bottom");
523     gotoFrame("admin_left");
524     gotoFrame("admin_selection");
525     assertTextPresent("Records 1 to 9 of 9");
526     //String page = getPageSource();
527     //System.err.println(page);
528   }
529   /**
530    * User story.
531    */
532   public void testCreateTableStory() { 
533     setScriptingEnabled(false);
534     loginAsAdministrator();
535     gotoAddRecord("Table");
536     setTextField("field_name", "test");
537     setTextField("field_displayname", "Test");
538     setTextField("field_description", "A Test table");
539     setTextField("field_displayorder", "0");
540     selectOption("field_category","Normal");
541     submit();
542     assertTextPresent("Done");
543     String tableTroid = getElementAttributByXPath(
544         "//input[@name='" + "troid" + "']", "value");
545     gotoPage("/Admin/" + dbName + "/tableinfo/" + tableTroid + "/Main"); 
546     gotoFrame("admin_bottom");
547     gotoFrame("admin_record");
548     gotoFrame("admin_edit_header");
549     clickLinkWithText("Column");
550     gotoRootWindow();
551     gotoFrame("admin_bottom");
552     gotoFrame("admin_record");   
553     gotoFrame("admin_edit_tableinfo_" + tableTroid);
554     clickLink("create_columninfo");
555     setTextField("field_name", "test");
556     setTextField("field_description", "A Test column");
557     setTextField("field_displayorder", "0");
558     checkCheckbox("field_usercreateable");
559     checkCheckbox("field_indexed");
560     // We want to duplicate
561     //checkCheckbox("field_unique");
562     setTextField("field_displayname", "Test");
563     checkCheckbox("field_nullable");
564     setTextField("field_size", "20");
565     setTextField("field_width", "20");
566     setTextField("field_height", "1");
567     setTextField("field_precision", "1");
568     setTextField("field_scale", "1");
569     submit();
570     assertTextPresent("Done");
571     String columnTroid = getElementAttributByXPath(
572         "//input[@name='" + "troid" + "']", "value");
573     
574 
575     gotoAddRecord("Test");
576     setTextField("field_test", "test");
577     submit();
578     assertTextPresent("Done");
579     String recordTroid = getElementAttributByXPath(
580         "//input[@name='" + "troid" + "']", "value");
581     
582     clickLink("continue");
583     gotoPage("/Admin/" + dbName + "/test/" + recordTroid + "/Main"); 
584     gotoFrame("admin_bottom");    
585     gotoFrame("admin_record");
586     gotoFrame("admin_edit_test_" + recordTroid);
587     submit("action","Duplicate");
588     assertTextPresent("Done");
589     //String href = getElementAttributByXPath(
590     //    "//a[@id='" + "continue" + "']", "href");
591     //System.err.println("Continue:" + href);
592     clickLink("continue");
593     
594     // Records will be sorted by id
595     deleteRecord("test", "test", new Integer(recordTroid).intValue());
596     deleteRecord("test", "test", new Integer(recordTroid).intValue() + 1);
597     
598     gotoPage("/Admin/" + dbName + "/columninfo/" + columnTroid + "/Main"); 
599     gotoFrame("admin_bottom");    
600     gotoFrame("admin_record");
601     gotoFrame("admin_edit_columninfo_" + columnTroid);
602     submit("action","Delete");
603     assertTextPresent("Done");
604 
605     gotoPage("/Admin/" + dbName + "/tableinfo/" + tableTroid + "/Main"); 
606     gotoFrame("admin_bottom");    
607     gotoFrame("admin_record");
608     gotoFrame("admin_edit_tableinfo_" + tableTroid);
609     submit("action","Delete");
610     clickLink("edit_columninfo_" + (new Integer(columnTroid).intValue() -1));
611     submit("action","Delete");
612     assertTextPresent("Done");
613     clickLink("continue");
614     assertTextPresent("Done");
615     clickLink("continue");
616     assertTextPresent("Melati Database Admin Suite - Melatijunit database");
617   }
618   private void gotoAddRecord(String table) {
619     gotoRootWindow();
620     gotoFrame("admin_top");
621     selectOption("goto",table);
622     assertFormPresent("goto");
623     setWorkingForm("goto");
624     submit();
625     gotoRootWindow();
626     gotoFrame("admin_bottom");
627     gotoFrame("admin_left");
628     gotoFrame("admin_navigation");
629     clickLink("add");
630     gotoRootWindow();
631     gotoFrame("admin_bottom");
632     gotoFrame("admin_record");
633   }
634   /**
635    * Start and end at top window.
636    * @param tableName 
637    * @param uniqueKeyValue
638    */
639   private void deleteRecord(String tableName, String uniqueKeyValue, int troid) {
640     gotoPage("/Admin/" + dbName + "/" + tableName + "/Main");
641     gotoFrame("admin_bottom");
642     gotoFrame("admin_left");
643     gotoFrame("admin_selection");
644     clickLinkWithText(uniqueKeyValue);
645     gotoRootWindow();
646     gotoFrame("admin_bottom");
647     gotoFrame("admin_record");
648     gotoFrame("admin_edit_" + tableName + "_" + troid);
649     clickButton("delete");
650     gotoPage("/Admin/" + dbName + "/Main");
651   }
652   /**
653    * Returns us to top frame.
654    */
655   private void loginAsAdministrator() {
656     beginAt("/Admin/" + dbName + "/Main");
657     gotoFrame("admin_top");
658     clickButton("login");
659     setTextField("field_login", "_administrator_");
660     setTextField("field_password", "FIXME");
661     checkCheckbox("rememberme");
662     submit("action");
663   }
664 }