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