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.exception.TestingEngineResponseException;
11 import net.sourceforge.jwebunit.html.Cell;
12 import net.sourceforge.jwebunit.html.Row;
13 import net.sourceforge.jwebunit.html.Table;
14
15 import org.melati.JettyWebTestCase;
16 import org.melati.util.HTMLUtils;
17
18
19
20
21
22
23 public class AdminJettyWebTest extends JettyWebTestCase {
24 private String dbName = "admintest";
25
26 public AdminJettyWebTest() {
27 super();
28 }
29 public AdminJettyWebTest(String name) {
30 super(name);
31 }
32
33
34
35
36
37 public static void main(String[] args) throws Exception {
38 startServer(8080);
39 }
40
41
42
43
44
45
46
47
48
49 protected void setUp() throws Exception {
50 super.setUp();
51 setScriptingEnabled(true);
52 beginAt("/");
53
54 }
55
56
57
58
59
60 public void testBadUrl() {
61 try {
62 gotoPage("/Admin/" + dbName + "/Unknown");
63 } catch (TestingEngineResponseException e) {
64 assertEquals(400, e.getHttpStatusCode());
65 }
66 assertTextPresent("Melati Error Template");
67 }
68
69
70
71 public void testAdminMain() {
72 gotoPage("/Admin/" + dbName + "/Main");
73 assertTextPresent("Melati Database Admin Suite - Admintest database");
74 }
75
76
77
78 public void testAdminTop() {
79 gotoPage("/Admin/" + dbName + "/Top");
80 assertTextPresent("Melati Database Admin Suite - Options for Admintest database");
81 }
82
83
84
85 public void testAdminTopWithTable() {
86 gotoPage("/Admin/" + dbName + "/user/Top");
87 assertTextPresent("Melati Database Admin Suite - Options for Admintest database");
88 }
89
90
91
92 public void testAdminTopWithTableAndTroid() {
93 gotoPage("/Admin/" + dbName + "/user/0/Top");
94 assertTextPresent("Melati Database Admin Suite - Options for Admintest database");
95 }
96
97
98
99
100 public void testUpload() {
101 gotoPage("/Admin/" + dbName + "/user/Upload?field=tim");
102 assertTextPresent("File to upload:");
103 }
104
105 public void testProxyNotAllowed() {
106 try {
107 gotoPage("/Admin/" + dbName + "/Proxy?http://google.com/");
108 fail("Should have bombed");
109 } catch (TestingEngineResponseException e) {
110 e = null;
111 }
112 }
113 public void testProxy() {
114 beginAt("/Display/" + dbName + "?template=org.melati.admin.test.ProxyCaller");
115 clickLinkWithText("CV");
116 }
117 public void testHttpXmlRequestProxy() {
118 beginAt("/Display/" + dbName + "?template=org.melati.admin.test.ProxyCaller");
119 clickLinkWithText("check");
120 }
121
122
123
124 public void testAdminSpecialised() {
125 loginAsAdministrator();
126 gotoPage("/Admin/admintest/uploadedfile/Main");
127 gotoRootWindow();
128 gotoFrame("admin_top");
129 setWorkingForm("gotoform");
130 selectOption("table","Uploaded File");
131 assertFormPresent("gotoform");
132 submit();
133 gotoRootWindow();
134 gotoFrame("admin_bottom");
135 gotoFrame("admin_left");
136 gotoFrame("admin_navigation");
137 clickLink("add");
138 gotoRootWindow();
139 gotoFrame("admin_bottom");
140 gotoFrame("admin_record");
141
142 setTextField("field_filename","test.txt");
143 clickLinkWithText("Upload a new file");
144 gotoWindow("filename");
145 setTextField("file","/dist/melati/melati/src/main/java/org/melati/admin/static/file.gif");
146
147 submit();
148 gotoRootWindow();
149 gotoFrame("admin_bottom");
150 gotoFrame("admin_record");
151 setScriptingEnabled(false);
152 submit();
153 gotoPage("/Admin/admintest/uploadedfile/0/Edit");
154 assertTextPresent("Hi");
155 }
156
157
158
159
160 public void testAdminSpecialisedHandler() {
161 setScriptingEnabled(false);
162 gotoPage("/Admin/admintest/specialised/Main");
163 gotoAddRecord("Specialised");
164 setTextField("field_name", "test");
165 submit();
166 assertTextPresent("Done");
167 gotoPage("/Admin/admintest/specialised/0/NotAnAdminMethod");
168 assertTextPresent("Hi, I'm Special.");
169
170 gotoPage("/Admin/admintest/specialised/0/Edit");
171 assertTextPresent("Hi, I'm Special.");
172 }
173
174
175
176
177
178 public void testNoPrimarySelect() {
179 setScriptingEnabled(false);
180 gotoPage("/Admin/admintest/specialised/Main");
181 gotoAddRecord("Specialised");
182 setTextField("field_name", "test");
183 submit();
184 gotoPage("/Admin/admintest/specialised/0/NotAnAdminMethod");
185 assertTextPresent("Hi, I'm Special.");
186
187 gotoPage("/Admin/admintest/specialised/0/Edit");
188 assertTextPresent("Hi, I'm Special.");
189
190 gotoPage("/Admin/admintest/user/PrimarySelect");
191 assertTablePresent("primarySelectTable");
192 gotoPage("/Admin/admintest/uploadedfile/PrimarySelect");
193 assertTableNotPresent("primarySelectTable");
194 gotoPage("/Admin/admintest/user/PrimarySelect?field_name=");
195 assertTablePresent("primarySelectTable");
196
197 gotoPage("/Admin/admintest/specialised/0/PrimarySelect");
198 assertTableNotPresent("primarySelectTable");
199
200 }
201
202
203
204
205
206 public void testDescendingOrder() {
207 gotoPage("/Admin/admintest/user/Selection?target=admin_record&returnTarget=admin_record&field_id=0&field_order-1=1&field_order-1-toggle=true");
208 gotoPage("/Admin/admintest/user/Selection?target=admin_record&returnTarget=admin_record&field_id=0&field_order-1=1&field_order-1-toggle=true");
209 gotoPage("/Admin/admintest/uploadedfile/Selection?target=admin_record&returnTarget=admin_record&field_order-1=70&field_order-1-toggle=true");
210 gotoPage("/Admin/admintest/uploadedfile/Selection?target=admin_record&returnTarget=admin_record&field_order-1=70&field_order-1-toggle=true");
211 }
212
213 public void testSelectionJSON() throws Exception {
214
215
216 try {
217 gotoPage("/Admin/admintest/user/SelectionJSON?field_include-0=11");
218 } catch (TestingEngineResponseException e) {
219 e = null;
220 }
221 }
222
223
224
225 public void testAdminBottom() {
226 gotoPage("/Admin/" + dbName + "/user/Bottom");
227
228 }
229
230
231
232 public void testAdminRecord() {
233 gotoPage("/Admin/" + dbName + "/user/0/Record");
234
235 }
236
237
238
239 public void testAdminPrimarySelect() {
240 gotoPage("/Admin/" + dbName + "/user/PrimarySelect");
241 assertTextPresent("Full name");
242 }
243
244
245
246 public void testAdminSelection() {
247 gotoPage("/Admin/" + dbName + "/user/Selection?target=&returnTarget=");
248 assertTextPresent("Full name");
249 assertTextPresent("Melati guest user");
250 clickLinkWithText("Full name");
251 Table s = getTable("selectionTable");
252 ArrayList<?> rows = s.getRows();
253 for (int i = 0; i< rows.size(); i++) {
254 ArrayList<?> cells = ((Row)rows.get(i)).getCells();
255 for (int j = 0; j< cells.size(); j++) {
256 String value = ((Cell)cells.get(j)).getValue();
257 if(i == 2 && j == 2)
258 assertEquals("_guest_", value.trim());
259 if(i == 3 && j == 2)
260 assertEquals("_administrator_", value.trim());
261 }
262 }
263 clickLinkWithText("Full name");
264 s = getTable("selectionTable");
265 rows = s.getRows();
266 for (int i = 0; i< rows.size(); i++) {
267 ArrayList<?> cells = ((Row)rows.get(i)).getCells();
268 for (int j = 0; j< cells.size(); j++) {
269 String value = ((Cell)cells.get(j)).getValue();
270 if(i == 2 && j == 2)
271 assertEquals("_administrator_", value.trim());
272 if(i == 3 && j == 2)
273 assertEquals("_guest_", value.trim());
274 }
275 }
276 clickLinkWithText("Full name");
277 s = getTable("selectionTable");
278 rows = s.getRows();
279 for (int i = 0; i< rows.size(); i++) {
280 ArrayList<?> cells = ((Row)rows.get(i)).getCells();
281 for (int j = 0; j< cells.size(); j++) {
282 String value = ((Cell)cells.get(j)).getValue();
283 if(i == 2 && j == 2)
284 assertEquals("_guest_", value.trim());
285 if(i == 3 && j == 2)
286 assertEquals("_administrator_", value.trim());
287 }
288 }
289 clickLinkWithText("Full name");
290 s = getTable("selectionTable");
291 rows = s.getRows();
292 for (int i = 0; i< rows.size(); i++) {
293 ArrayList<?> cells = ((Row)rows.get(i)).getCells();
294 for (int j = 0; j< cells.size(); j++) {
295 String value = ((Cell)cells.get(j)).getValue();
296 if(i == 2 && j == 2)
297 assertEquals("_administrator_", value.trim());
298 if(i == 3 && j == 2)
299 assertEquals("_guest_", value.trim());
300 }
301 }
302 }
303
304
305
306 public void testSelectionPaging() {
307 gotoPage("/Admin/" + dbName + "/columnInfo/Selection?target=&returnTarget=");
308 clickLinkWithText(">");
309 clickLinkWithText(">");
310 clickLinkWithText(">");
311 assertTextPresent("Records 61 to 80 of 90");
312 clickLinkWithText("<");
313 clickLinkWithText("<");
314 clickLinkWithText("<");
315 assertTextPresent("Records 1 to 20 of 90");
316 }
317
318
319
320 public void testAdminEditHeader() {
321 gotoPage("/Admin/" + dbName + "/parent/0/EditHeader");
322 clickLink("admin_edit_Parent_0");
323 gotoWindow("admin_edit_Parent_0");
324 assertElementPresent("selection");
325
326 }
327
328
329
330 public void testAdminEdit() {
331 gotoPage("/Admin/" + dbName + "/user/0/Edit");
332 assertTextPresent("Full name");
333 assertTextPresent("_guest_");
334 clickLinkWithText("More ...");
335 assertLinkNotPresentWithText("More ...");
336 }
337
338
339
340
341 public void testAdminEditFieldNoJS() {
342 gotoPage("/Admin/admintest/markup/Main");
343 gotoAddRecord("Markup");
344 assertEquals("Á",HTMLUtils.entityFor("\u00C1".charAt(0),false, null, false));
345
346
347
348
349
350
351
352 setTextField("field_text", "\u00C1");
353 setScriptingEnabled(false);
354 submit("action", "Create");
355 assertTextPresent("Done");
356 gotoPage("/Admin/admintest/markup/0/Edit");
357 assertEquals("\u00C1",getFormFieldValue("field_text"));
358 assertTextPresent("\u00C1");
359 }
360
361
362 public void brokenestAdminEditField() {
363 gotoPage("/Admin/admintest/markup/Main");
364 gotoAddRecord("Markup");
365 assertEquals("Á",HTMLUtils.entityFor("\u00C1".charAt(0),false, null, false));
366
367
368
369
370
371
372
373 setTextField("field_text", "\u00C1");
374 submit();
375
376 submit("action");
377 gotoPage("/Admin/admintest/markup/Selection");
378 assertEquals("\u00C1",getFormFieldValue("field_text"));
379 assertTextPresent("\u00C1");
380 }
381
382
383
384
385 public String getFormFieldValue(String fieldName) {
386 try {
387 return getTester().getElementAttributeByXPath(
388 "//input[@name='" + fieldName + "']", "value");
389 } catch (AssertionFailedError e) {
390 System.out.println("Form element not present:" + fieldName);
391 System.out.println(getTester().getPageSource());
392 throw e;
393 }
394
395 }
396
397
398
399
400 public String getFormTextareaValue(String fieldName) {
401 return getTester().getElementTextByXPath(
402 "//textarea[@name='" + fieldName + "']");
403
404 }
405
406
407
408
409 public void testAdminEditAdministrator() {
410 gotoPage("/Admin/" + dbName + "/user/1/Edit");
411 assertTextPresent("You need to log in.");
412 setTextField("field_login", "_administrator55_");
413 setTextField("field_password", "FIXME");
414 checkCheckbox("rememberme");
415 submit("action");
416 setTextField("field_login", "_administrator_");
417 setTextField("field_password", "FIXME_not");
418 checkCheckbox("rememberme");
419 submit("action");
420 setTextField("field_login", "_administrator_");
421 setTextField("field_password", "FIXME");
422 checkCheckbox("rememberme");
423 submit("action");
424 assertTextPresent("Full name");
425 assertTextPresent("_administrator_");
426
427
428 gotoPage("/Logout/" + dbName + "");
429 gotoPage("/Admin/" + dbName + "/user/1/Edit");
430 setTextField("field_login", "_administrator_");
431 setTextField("field_password", "FIXME");
432 assertTextFieldEquals("field_email", "");
433 setTextField("field_email", "test@test.com");
434 submit("action", "Update");
435 assertTextFieldEquals("field_email", "test@test.com");
436 submit("action", "Update");
437 assertNotNull("Main body element should have id 'edit'", getElementById("edit"));
438 }
439
440
441
442 public void testEverythingIsProtected() {
443 gotoPage("/Admin/everything/Main");
444 assertTextPresent("You need to log in");
445
446 }
447
448
449
450 public void testAdminTree() {
451 gotoPage("/Admin/" + dbName + "/user/0/Record");
452 gotoFrame("admin_edit_header");
453 assertTextPresent("_guest_");
454 assertTextPresent("[ Group membership ]");
455 clickLink("recordTree");
456 gotoRootWindow();
457 gotoFrame("admin_edit_User_0");
458 assertTextPresent("Melati guest user tree");
459 clickLinkWithText("Melati guest user");
460 }
461
462
463
464 public void testAdminTreeNoScript() {
465 gotoPage("/Admin/" + dbName + "/user/0/Tree");
466 assertTextPresent("Melati guest user tree");
467 }
468
469
470
471 public void testAdminTableTree() {
472 gotoPage("/Admin/" + dbName + "/user/Table");
473 gotoFrame("admin_navigation");
474 clickLink("tableTree");
475 gotoRootWindow();
476 gotoFrame("admin_selection");
477 assertTextPresent("User table tree");
478 assertLinkPresentWithText("Melati guest user");
479 assertLinkPresentWithText("Melati database administrator");
480 }
481
482
483
484 public void testAdminSelectionWindow() {
485 gotoPage("/Admin/" + dbName + "/user/SelectionWindow?returnfield=field_user");
486 assertTextPresent("Select a User");
487 }
488
489
490
491 public void testAdminSelectionWindowPrimarySelect() {
492 gotoPage("/Admin/" + dbName + "/user/SelectionWindowPrimarySelect?returnfield=field_user");
493 assertTextPresent("Full name");
494 }
495
496
497
498 public void testAdminSelectionWindowSelection() {
499 gotoPage("/Admin/" + dbName + "/user/SelectionWindowSelection?returnfield=field_user");
500 assertTextPresent("Records 1 to 2 of 2");
501 }
502
503
504
505 public void testAdminSelectionCSV() {
506 gotoPage("/Admin/" + dbName + "/columnInfo/Selection");
507 assertTextPresent("Records 1 to 20 of 90");
508 clickLink("csv");
509 gotoWindow("_columnInfocsv");
510 assertTextPresent("\"0\",\"0\",\"id\",\"10\",\"false\",");
511 }
512
513
514
515 public void testAdminPopup() {
516 gotoPage("/Admin/" + dbName + "/user/PopUp");
517 assertTextPresent("Search User Table");
518 }
519
520
521
522 public void testAdminDSD() {
523 gotoPage("/Admin/" + dbName + "/DSD");
524 assertTextPresent("Generated for _guest_");
525 assertTextPresent("package org.melati.admin.test;");
526 }
527
528
529
530 public void testLoginWithContinuation() {
531 gotoPage("/Login/" + dbName + "?continuationURL=" + contextUrl("/index.html"));
532 setTextField("field_login", "_administrator_");
533 setTextField("field_password", "FIXME");
534 checkCheckbox("rememberme");
535 submit("action");
536 assertTextPresent("Hello World!");
537 }
538
539
540
541
542 public void testSetupStory() {
543 loginAsAdministrator();
544 gotoFrame("admin_top");
545 clickLinkWithText("Setup");
546 gotoRootWindow();
547 gotoFrame("admin_bottom");
548 gotoFrame("admin_record");
549 gotoFrame("admin_edit_setting");
550 assertNotNull(getElementById("blank"));
551 }
552
553
554
555 public void testSetupStoryNoJS() {
556 loginAsAdministrator();
557 gotoFrame("admin_top");
558 setScriptingEnabled(false);
559 clickLinkWithText("Setup");
560 gotoRootWindow();
561 gotoFrame("admin_bottom");
562 assertTextPresent("Done");
563 }
564
565
566
567
568
569 public void testSearchAndGoto() {
570
571 gotoPage("/Admin/" + dbName + "/Main");
572 gotoRootWindow();
573 gotoFrame("admin_top");
574 setWorkingForm("gotoform");
575 selectOption("table","Column");
576 assertFormPresent("gotoform");
577 submit();
578 gotoRootWindow();
579 gotoFrame("admin_bottom");
580 gotoFrame("admin_left");
581 gotoFrame("admin_navigation");
582 clickLink("search");
583 gotoWindow("admin_search");
584 setTextField("field_displayname", "Id");
585 selectOptionByValue("field_order-1","42");
586 selectOptionByValue("field_order-2","43");
587 submit();
588 gotoRootWindow();
589 gotoFrame("admin_bottom");
590 gotoFrame("admin_left");
591 gotoFrame("admin_selection");
592 assertTextPresent("Records 1 to 15 of 15");
593
594
595 }
596
597
598
599 public void testCreateTableStory() {
600 setScriptingEnabled(false);
601 loginAsAdministrator();
602 gotoAddRecord("Table");
603 setTextField("field_name", "test");
604 setTextField("field_displayname", "Test");
605 setTextField("field_description", "A Test table");
606 setTextField("field_displayorder", "0");
607 selectOptionByValue("field_category","3");
608 submit();
609 assertTextPresent("Done");
610 String tableTroid = getElementAttributeByXPath(
611 "//input[@name='" + "troid" + "']", "value");
612 gotoPage("/Admin/" + dbName + "/tableinfo/" + tableTroid + "/Main");
613 System.err.println("Found created table troid " + tableTroid);
614 gotoFrame("admin_bottom");
615 gotoFrame("admin_record");
616 gotoFrame("admin_edit_header");
617 clickLinkWithText("Column");
618 gotoRootWindow();
619 gotoFrame("admin_bottom");
620 gotoFrame("admin_record");
621 gotoFrame("admin_edit_tableInfo_" + tableTroid);
622 clickLink("create_columnInfo");
623 setTextField("field_name", "test");
624 setTextField("field_description", "A Test column");
625 setTextField("field_displayorder", "0");
626 checkCheckbox("field_usercreateable");
627 checkCheckbox("field_indexed");
628
629
630 setTextField("field_displayname", "Test");
631 checkCheckbox("field_nullable");
632 setTextField("field_size", "20");
633 setTextField("field_width", "20");
634 setTextField("field_height", "1");
635 setTextField("field_precision", "1");
636 setTextField("field_scale", "1");
637 submit();
638 assertTextPresent("Done");
639 String columnTroid = getElementAttributeByXPath(
640 "//input[@name='" + "troid" + "']", "value");
641 System.err.println("Found created troid " + columnTroid);
642 gotoAddRecord("Test");
643 setTextField("field_test", "test");
644 submit();
645 assertTextPresent("Done");
646 String recordTroid = getElementAttributeByXPath(
647 "//input[@name='" + "troid" + "']", "value");
648
649 clickLink("continue");
650 gotoPage("/Admin/" + dbName + "/test/" + recordTroid + "/Main");
651 gotoFrame("admin_bottom");
652 gotoFrame("admin_record");
653 gotoFrame("admin_edit_test_" + recordTroid);
654 submit("action","Duplicate");
655 assertTextPresent("Done");
656
657
658
659 clickLink("continue");
660
661
662 deleteRecord("test", "test", new Integer(recordTroid).intValue());
663 deleteRecord("test", "test", new Integer(recordTroid).intValue() + 1);
664
665 gotoPage("/Admin/" + dbName + "/columnInfo/" + columnTroid + "/Main");
666 gotoFrame("admin_bottom");
667 gotoFrame("admin_record");
668 gotoFrame("admin_edit_columnInfo_" + columnTroid);
669 submit("action","Delete");
670 assertTextPresent("Done");
671
672 int c = new Integer(columnTroid).intValue() -1;
673 columnTroid = new Integer(c).toString();
674 gotoPage("/Admin/" + dbName + "/columninfo/" + columnTroid + "/Main");
675 gotoFrame("admin_bottom");
676 gotoFrame("admin_record");
677 gotoFrame("admin_edit_columnInfo_" + columnTroid);
678 submit("action","Delete");
679 assertTextPresent("Done");
680
681 gotoPage("/Admin/" + dbName + "/tableinfo/" + tableTroid + "/Main");
682 gotoFrame("admin_bottom");
683 gotoFrame("admin_record");
684 gotoFrame("admin_edit_tableInfo_" + tableTroid);
685 submit("action","Delete");
686
687
688 setScriptingEnabled(true);
689 assertTextPresent("Done");
690
691 clickLink("continue");
692
693 assertTextPresent("Melati Database Admin Suite - Admintest database");
694 }
695
696 private void gotoAddRecord(String table) {
697 gotoRootWindow();
698 gotoFrame("admin_top");
699 selectOption("table",table);
700 assertFormPresent("gotoform");
701 setWorkingForm("gotoform");
702 submit();
703 gotoRootWindow();
704 gotoFrame("admin_bottom");
705
706
707 gotoFrame("admin_left");
708 gotoFrame("admin_navigation");
709 clickLink("add");
710 gotoRootWindow();
711 gotoFrame("admin_bottom");
712 gotoFrame("admin_record");
713 }
714
715
716
717
718
719 private void deleteRecord(String tableName, String uniqueKeyValue, int troid) {
720 gotoPage("/Admin/" + dbName + "/" + tableName + "/Main");
721 gotoFrame("admin_bottom");
722 gotoFrame("admin_left");
723 gotoFrame("admin_selection");
724 clickLinkWithText(uniqueKeyValue);
725 gotoRootWindow();
726 gotoFrame("admin_bottom");
727 gotoFrame("admin_record");
728 gotoFrame("admin_edit_" + tableName + "_" + troid);
729 clickButton("delete");
730 gotoPage("/Admin/" + dbName + "/Main");
731 }
732
733
734
735 private void loginAsAdministrator() {
736 gotoPage("/Admin/" + dbName + "/Top");
737
738 clickButton("login");
739 setTextField("field_login", "_administrator_");
740 setTextField("field_password", "FIXME");
741 checkCheckbox("rememberme");
742 submit("action");
743 }
744
745
746 public void testCopy() throws Exception {
747 try {
748 gotoPage("/Copy/everything");
749 } catch (TestingEngineResponseException e) {
750 e = null;
751 }
752 try {
753 gotoPage("/Copy/everything/everything");
754 } catch (TestingEngineResponseException e) {
755 e = null;
756 }
757
758 gotoPage("/Copy/everything/everything2");
759
760 }
761 }