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
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
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
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
176 }
177 /**
178 *
179 */
180 public void testAdminRight() {
181 setScriptingEnabled(false);
182 beginAt("/Admin/" + dbName + "/user/0/Right");
183
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
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
433
434
435
436
437
438
439
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
505
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
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 }