001    package org.hackystat.projectbrowser.page.projects;
002    
003    import java.text.SimpleDateFormat;
004    import java.util.Date;
005    import java.util.Locale;
006    import java.util.Properties;
007    import java.util.logging.Logger;
008    import javax.xml.datatype.DatatypeConstants;
009    import javax.xml.datatype.XMLGregorianCalendar;
010    import org.apache.wicket.markup.html.form.Button;
011    import org.apache.wicket.markup.html.list.ListView;
012    import org.apache.wicket.util.tester.FormTester;
013    import org.apache.wicket.util.tester.WicketTester;
014    import org.hackystat.projectbrowser.ProjectBrowserApplication;
015    import org.hackystat.projectbrowser.ProjectBrowserProperties;
016    import org.hackystat.projectbrowser.authentication.SigninPage;
017    import org.hackystat.projectbrowser.page.sensordata.SensorDataPage;
018    import org.hackystat.projectbrowser.test.ProjectBrowserTestHelper;
019    import org.hackystat.sensorbase.client.SensorBaseClient;
020    import org.hackystat.sensorbase.client.SensorBaseClientException;
021    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
022    import org.hackystat.sensorbase.resource.projects.jaxb.ProjectRef;
023    import org.hackystat.utilities.tstamp.Tstamp;
024    import org.junit.After;
025    import org.junit.Test;
026    import org.junit.Assert;
027    
028    /**
029     * Tests the SensorDataPage.
030     * 
031     * @author Philip Johnson
032     * @author Randy Cox
033     */
034    public class TestProjectsPage extends ProjectBrowserTestHelper {  
035    
036     
037      private static String DEFAULT_NAME = "Default";
038    
039      private static String TEST_NEW_NAME = "TestProjectName";
040      private static String TEST_NEW_STARTDATE = "2008-01-01";
041      private static String TEST_NEW_ENDDATE = "2008-12-31";
042      private static String TEST_NEW_DESC = "Test description.";
043     
044     
045    
046      private static String TEST_EDIT_STARTDATE = "2008-01-01";
047      private static String TEST_EDIT_ENDDATE = "2008-12-31";
048      private static String TEST_EDIT_DESC = "Test description.";
049      private static String TEST_EDIT_INVITEE = TEST_INVITEE;
050     
051    
052      private static String TEST_RENAME_NAME = "TestRenameProject";
053    
054      private static String PREFIX_LIST = "projectsForm:projListPanel:projListForm:projectTable:";
055      private static String DATE_PATTERN = "yyyy-MM-dd";
056      private static String PROJECTS = ".projects";
057      private static String TRUE = "true";
058      
059      private String PROJECTS_LINK = "ProjectsPageLink";
060    //  private String LOGOUT_LINK = "LogoutLink";
061      private String PROJECTS_FORM = "projectsForm";
062      private String SIGNIN_FORM = "signinForm";
063      private String LIST_PANEL = "projectsForm:projListPanel";
064      private String EDIT_PANEL = "projectsForm:projEditPanel";
065      private String RENAME_PANEL = "projectsForm:projRenamePanel";
066      private String DELETE_PANEL = "projectsForm:projDeletePanel";
067      private String LEAVE_PANEL = "projectsForm:projLeavePanel";
068      private String REPLY_PANEL = "projectsForm:projReplyPanel";
069      private String CLEARCACHE_PANEL = "projectsForm:projClearCachePanel";
070      private String PROJECT_TABLE = "projectsForm:projListPanel:projListForm:projectTable";
071      private String EDIT_BUTTON = ":editButton";
072      private String RENAME_BUTTON = ":renameButton";
073      private String DELETE_BUTTON = ":deleteButton";
074      private String LEAVE_BUTTON = ":leaveButton";
075      private String REPLY_BUTTON = ":replyButton";
076      private String CLEARCACHE_BUTTON = ":clearCacheButton";
077    
078      private String USER = "user";
079      private String PASSWORD = "password";
080      private String SIGNIN = "Signin";
081      private String NOT_FOUND = " project not found in table list.";
082      
083    
084      /**
085       * Clean up data.
086       * 
087       * @throws Exception when communication error occurs.
088       */
089      @After
090      public void cleanup() throws Exception { 
091        SensorBaseClient client = new SensorBaseClient(getSensorBaseHostName(), TEST_USER, TEST_USER);
092        for (ProjectRef ref : client.getProjectIndex(TEST_USER).getProjectRef()) {
093          Project project = client.getProject(ref);
094          if (TEST_USER.equals(project.getOwner()) && !DEFAULT_NAME.equals(project.getName())) {
095            client.deleteProject(TEST_USER, project.getName());
096          }
097        }
098      }
099    
100      /**
101       * Logs in and navigates to the projects page.
102       * 
103       * @param tester Wicket tester
104       */
105      public void login(WicketTester tester) { 
106    
107        // Login and check for correct start page
108        tester.startPage(SigninPage.class);
109        FormTester signinForm = tester.newFormTester(SIGNIN_FORM);  
110        signinForm.setValue(USER, TEST_USER);
111        signinForm.setValue(PASSWORD, TEST_USER);
112        signinForm.submit(SIGNIN);
113        tester.assertRenderedPage(SensorDataPage.class);
114    
115        // Navigate to projects page and check that page is setup correctly
116        tester.clickLink(PROJECTS_LINK);
117        tester.assertRenderedPage(ProjectsPage.class);
118        tester.assertComponent(PROJECTS_FORM, ProjectsForm.class);
119        tester.assertVisible(LIST_PANEL);
120        tester.assertInvisible(EDIT_PANEL);
121        tester.assertInvisible(RENAME_PANEL);
122        tester.assertInvisible(LEAVE_PANEL);
123        tester.assertInvisible(DELETE_PANEL);
124        tester.assertInvisible(REPLY_PANEL);
125        tester.assertInvisible(CLEARCACHE_PANEL);
126      }
127    
128      /**
129       * Dump project info to logger.
130       * 
131       * @param project to log.
132       */
133      public void logProject(Project project) {
134        Logger logger = ((ProjectBrowserApplication) ProjectBrowserApplication.get()).getLogger();
135        logger.info("  Name = " + project.getName());
136        logger.info("  Owner = " + project.getOwner());
137        logger.info("  StartTime = " + project.getStartTime());
138        logger.info("  EndTime = " + project.getEndTime());
139        logger.info("  Description = " + project.getDescription());
140        logger.info("  Members = " + project.getMembers().getMember().toString());
141        logger.info("  Invitations = " + project.getInvitations().getInvitation().toString());
142        logger.info("  Spectators = " + project.getSpectators().getSpectator().toString());
143        Integer propertyCount = project.getProperties().getProperty().size();
144        logger.info("  Properties row count= " + propertyCount.toString());
145        if (propertyCount > 0) {
146          logger.info("    1st projectPropertyKey = "
147              + project.getProperties().getProperty().get(0).getKey());
148          logger.info("    1st projectPropertyValue = "
149              + project.getProperties().getProperty().get(0).getValue());
150        }
151      }
152    
153      /**
154       * Loop through project list in List panel and find index of project.
155       * 
156       * @param tester application
157       * @param name to look for in list
158       * @return index of project in list, -1 = not found
159       */
160      private int findProjectIndexInList(WicketTester tester, String name) {
161        ListView listView = (ListView) tester
162            .getComponentFromLastRenderedPage(PROJECT_TABLE);
163        Integer index = -1;
164        for (int i = 0; i < listView.size(); i++) {
165          Project project = (Project) listView.getList().get(i);
166          if (name.equals(project.getName())) {
167            index = i;
168            break;
169          }
170        }
171        return index;
172      }
173    
174      /**
175       * Loop through project list in List panel and find index of project.
176       * 
177       * @param tester application
178       * @param name to look for in list
179       * @return index of project in list, -1 = not found
180       */
181      private Project findProjectInList(WicketTester tester, String name) {
182        ListView listView = (ListView) tester
183            .getComponentFromLastRenderedPage(PROJECT_TABLE);
184        Project project = null;
185        for (int i = 0; i < listView.size(); i++) {
186          if (name.equals(((Project) listView.getList().get(i)).getName())) {
187            project = (Project) listView.getList().get(i);
188            break;
189          }
190        }
191        return project;
192      }
193    
194      /**
195       * Dump component tree to log for debug.
196       * 
197       * @throws SensorBaseClientException when communication error occurs.
198       */
199      public void dumpComponentTree() throws SensorBaseClientException { // NOPMD WicketTester has
200                                                                              // its own assert classes.
201        Properties testProperties = getTestProperties();
202        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
203        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
204    
205        login(tester);
206        tester.debugComponentTrees();
207      }
208    
209      /**
210       * Test navigation to projects page and rendering of project list panel.
211       * 
212       * @throws SensorBaseClientException when communication error occurs.
213       */
214      @Test
215      public void testProjectsPage() throws SensorBaseClientException { // NOPMD WicketTester has its
216                                                                        // own assert classes.
217        Properties testProperties = getTestProperties();
218        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
219        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
220    
221        // Login
222        login(tester);
223    
224        // Loop through table and make sure that test project is present
225        ListView listView = (ListView) tester
226            .getComponentFromLastRenderedPage(PROJECT_TABLE);
227        Integer index = 0;
228        Boolean found = false;
229        for (Object object : listView.getList()) {
230    
231          // Log project
232          Project project = (Project) object;
233    
234          // Check for default project and make sure all buttons are invisible
235          if (TestProjectsPage.DEFAULT_NAME.equals(project.getName())) {
236            found = true;
237            // Verify default project and state of buttons
238            tester.assertInvisible(PREFIX_LIST + index.toString() + EDIT_BUTTON);
239            tester.assertInvisible(PREFIX_LIST + index.toString() + DELETE_BUTTON);
240            tester.assertInvisible(PREFIX_LIST + index.toString() + RENAME_BUTTON);
241            tester.assertInvisible(PREFIX_LIST + index.toString() + LEAVE_BUTTON);
242            tester.assertInvisible(PREFIX_LIST + index.toString() + REPLY_BUTTON);
243            tester.assertVisible(PREFIX_LIST + index.toString() + CLEARCACHE_BUTTON);
244          }
245          else {
246            index++;
247          }
248        }
249        Assert.assertTrue(DEFAULT_NAME + NOT_FOUND, found);
250      }
251    
252      /**
253       * Create a new project, used by multiple tests.
254       * 
255       * @param tester Wicket tester
256       * @throws Exception 
257       * @throws Exception when communication error occurs.
258       */
259      private void createNewProject(WicketTester tester) throws Exception  {
260    
261        // Store project count for later testing
262        ListView listView = (ListView) tester
263            .getComponentFromLastRenderedPage(PROJECT_TABLE);
264        Integer previousListCount = listView.getList().size();
265    
266        // Push the new button
267        Button newButton = (Button) tester
268            .getComponentFromLastRenderedPage("projectsForm:projListPanel:projListForm:newButton");
269        newButton.onSubmit();
270    
271        // Assert correct panels are visible
272        tester.assertComponent(EDIT_PANEL, ProjEditPanel.class);
273        tester.assertVisible(EDIT_PANEL);
274        tester.assertInvisible(LIST_PANEL);
275        tester.assertInvisible(RENAME_PANEL);
276        tester.assertInvisible(LEAVE_PANEL);
277        tester.assertInvisible(DELETE_PANEL);
278        tester.assertInvisible(REPLY_PANEL);
279        tester.assertInvisible(CLEARCACHE_PANEL);
280    
281        // Enter test data into edit form
282        FormTester editForm = tester.newFormTester("projectsForm:projEditPanel:projEditForm");
283        editForm.setValue("projectName", TEST_NEW_NAME);
284        editForm.setValue("projectStartDate", TEST_NEW_STARTDATE);
285        editForm.setValue("projectEndDate", TEST_NEW_ENDDATE);
286        editForm.setValue("projectDesc", TEST_NEW_DESC);
287        editForm.setValue("projectInvitations", TEST_NEW_INVITEE);
288        editForm.setValue("projectSpectators", TEST_NEW_SPECTATOR);
289        editForm.submit();
290    
291        // Push save button
292        Button saveButton = (Button) tester
293            .getComponentFromLastRenderedPage("projectsForm:projEditPanel:projEditForm:saveButton");
294        saveButton.onSubmit();
295        tester.newFormTester(PROJECTS_FORM).submit();
296    
297        // Check that project list panel is active and visIble
298        tester.assertVisible(LIST_PANEL);
299        tester.assertInvisible(EDIT_PANEL);
300        tester.assertInvisible(RENAME_PANEL);
301        tester.assertInvisible(LEAVE_PANEL);
302        tester.assertInvisible(DELETE_PANEL);
303        tester.assertInvisible(REPLY_PANEL);
304        tester.assertInvisible(CLEARCACHE_PANEL);
305    
306        // Check project count, should be one more
307        ListView listViewAfter = (ListView) tester
308            .getComponentFromLastRenderedPage(PROJECT_TABLE);
309        Integer projectListCount = listViewAfter.getList().size();
310        Assert.assertEquals("An addtional project should be added to project list.",
311            (int) previousListCount + 1, (int) projectListCount);
312    
313        // Loop through table and make sure that test project is present
314        Integer index = 0;
315        Boolean found = false;
316        for (Object object : listViewAfter.getList()) {
317          Project project = (Project) object;
318    
319          // Check data within model backing the test project
320          if (TestProjectsPage.TEST_NEW_NAME.equals(project.getName())) {
321            found = true;
322    
323            // Check buttons
324            tester.assertVisible(PREFIX_LIST + index.toString() + EDIT_BUTTON);
325            tester.assertVisible(PREFIX_LIST + index.toString() + DELETE_BUTTON);
326            tester.assertVisible(PREFIX_LIST + index.toString() + RENAME_BUTTON);
327            tester.assertInvisible(PREFIX_LIST + index.toString() + LEAVE_BUTTON);
328            tester.assertInvisible(PREFIX_LIST + index.toString() + REPLY_BUTTON);
329    
330            // Check start date.
331            SimpleDateFormat format = new SimpleDateFormat(DATE_PATTERN, Locale.ENGLISH);
332            Date startDate = format.parse(TestProjectsPage.TEST_NEW_STARTDATE);
333            XMLGregorianCalendar startTime = Tstamp.makeTimestamp(startDate.getTime());
334            Assert.assertEquals("Start date should be " + TEST_NEW_STARTDATE, DatatypeConstants.EQUAL,
335                project.getStartTime().compare(startTime));
336    
337            // Check start date.
338            Date endDate = format.parse(TestProjectsPage.TEST_NEW_ENDDATE);
339            XMLGregorianCalendar endTime = Tstamp.makeTimestamp(endDate.getTime());
340            Assert.assertEquals("End date should be " + TEST_NEW_ENDDATE, DatatypeConstants.EQUAL,
341                project.getEndTime().compare(endTime));
342    
343            // Test project description.
344            Assert.assertEquals("Project description", TestProjectsPage.TEST_NEW_DESC, project
345                .getDescription());
346    
347            // Test project members.
348            Assert.assertTrue(project.getMembers().getMember().isEmpty());
349            Assert.assertTrue(project.getInvitations().getInvitation().contains(TEST_NEW_INVITEE));
350            Assert.assertTrue(project.getSpectators().getSpectator().contains(TEST_NEW_SPECTATOR));
351          }
352          else {
353            index++;
354          }
355        }
356        Assert.assertTrue(TEST_NEW_NAME + NOT_FOUND, found);
357      }
358    
359      /**
360       * Test edit of existing project.
361       * 
362       * @throws Exception when communication error occurs.
363       */
364      @Test
365      public void testProjectsEditPage() throws Exception { // NOPMD WicketTester has its own assert
366                                                            // classes.
367        Properties testProperties = getTestProperties();
368        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
369        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
370    
371        login(tester);
372        createNewProject(tester);
373    
374        ListView listView = (ListView) tester
375            .getComponentFromLastRenderedPage(PROJECT_TABLE);
376        Integer previousListCount = listView.getList().size();
377    
378        // Push the edit button
379        Integer index = findProjectIndexInList(tester, TEST_NEW_NAME);
380        Button editButton = (Button) tester
381            .getComponentFromLastRenderedPage(PREFIX_LIST
382                + index.toString() + EDIT_BUTTON);
383        editButton.onSubmit();
384    
385        // Assert correct panels are visible
386        tester.assertComponent(EDIT_PANEL, ProjEditPanel.class);
387        tester.assertVisible(EDIT_PANEL);
388        tester.assertInvisible(LIST_PANEL);
389        tester.assertInvisible(RENAME_PANEL);
390        tester.assertInvisible(LEAVE_PANEL);
391        tester.assertInvisible(DELETE_PANEL);
392        tester.assertInvisible(REPLY_PANEL);
393        tester.assertInvisible(CLEARCACHE_PANEL);
394    
395        // Enter test data into edit form
396        FormTester form = tester.newFormTester("projectsForm:projEditPanel:projEditForm");
397        form.setValue("projectStartDate", TEST_EDIT_STARTDATE);
398        form.setValue("projectEndDate", TEST_EDIT_ENDDATE);
399        form.setValue("projectDesc", TEST_EDIT_DESC);
400        form.setValue("projectInvitations", TEST_EDIT_INVITEE);
401        form.setValue("projectSpectators", TEST_EDIT_SPECTATOR);
402        form.submit();
403    
404        // Push save button
405        Button button = (Button) tester
406            .getComponentFromLastRenderedPage("projectsForm:projEditPanel:projEditForm:saveButton");
407        button.onSubmit();
408    
409        // Check project count, should be one more
410        listView = (ListView) tester
411            .getComponentFromLastRenderedPage(PROJECT_TABLE);
412        Integer projectListCount = listView.getList().size();
413        Assert.assertEquals("No additional project should be added to project list.",
414            (int) previousListCount, (int) projectListCount);
415    
416        // Loop through table and make sure that test rename project is present
417        index = 0;
418        Boolean found = false;
419        for (Object object : listView.getList()) {
420          Project project = (Project) object;
421    
422          // Check data within model backing the test project
423          if (TestProjectsPage.TEST_NEW_NAME.equals(project.getName())) {
424            found = true;
425    
426            // Check start date.
427            SimpleDateFormat format = new SimpleDateFormat(DATE_PATTERN, Locale.ENGLISH);
428            Date startDate = format.parse(TEST_EDIT_STARTDATE);
429            XMLGregorianCalendar startTime = Tstamp.makeTimestamp(startDate.getTime());
430            Assert.assertEquals("Start date should be " + TEST_EDIT_STARTDATE, DatatypeConstants.EQUAL,
431                project.getStartTime().compare(startTime));
432    
433            // Check start date.
434            Date endDate = format.parse(TEST_EDIT_ENDDATE);
435            XMLGregorianCalendar endTime = Tstamp.makeTimestamp(endDate.getTime());
436            Assert.assertEquals("End date should be " + TEST_EDIT_ENDDATE, DatatypeConstants.EQUAL,
437                project.getEndTime().compare(endTime));
438    
439            // Test project description.
440            Assert.assertEquals("Project description", TEST_EDIT_DESC, project.getDescription());
441    
442            // Test project members.
443            Assert.assertTrue(project.getMembers().getMember().isEmpty());
444            Assert.assertTrue(project.getInvitations().getInvitation().contains(TEST_EDIT_INVITEE));
445            Assert.assertTrue(project.getSpectators().getSpectator().contains(TEST_EDIT_SPECTATOR));
446          }
447          else {
448            index++;
449          }
450        }
451        Assert.assertTrue(TEST_NEW_NAME + NOT_FOUND, found);
452      }
453    
454      /**
455       * Test creating a new project.
456       * 
457       * @throws Exception when communication error occurs.
458       */
459      @Test
460      public void testProjectsNewPage() throws Exception { // NOPMD WicketTester has its own assert
461                                                            // classes.
462        Properties testProperties = getTestProperties();
463        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
464        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
465    
466        // Login
467        login(tester);
468    
469        // Create new project and test it
470        createNewProject(tester);
471      }
472    
473    
474      /**
475       * Test renaming of project.
476       * 
477       * @throws Exception when communication error occurs.
478       */
479      @Test
480      public void testProjectsRenamePage() throws Exception { // NOPMD WicketTester has its own assert
481                                                              // classes.
482    
483        Properties testProperties = getTestProperties();
484        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
485        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
486    
487        login(tester);
488        createNewProject(tester);
489    
490        ListView listView = (ListView) tester
491            .getComponentFromLastRenderedPage(PROJECT_TABLE);
492        Integer previousListCount = listView.getList().size();
493    
494        // Push the edit button
495        Integer index = findProjectIndexInList(tester, TEST_NEW_NAME);
496        Button renameButton = (Button) tester
497            .getComponentFromLastRenderedPage(PREFIX_LIST
498                + index.toString() + RENAME_BUTTON);
499        renameButton.onSubmit();
500    
501        // Assert correct panels are visible
502        tester.assertComponent(RENAME_PANEL, ProjRenamePanel.class);
503        tester.assertInvisible(EDIT_PANEL);
504        tester.assertInvisible(LIST_PANEL);
505        tester.assertVisible(RENAME_PANEL);
506        tester.assertInvisible(LEAVE_PANEL);
507        tester.assertInvisible(DELETE_PANEL);
508        tester.assertInvisible(REPLY_PANEL);
509        tester.assertInvisible(CLEARCACHE_PANEL);
510    
511        // Enter test data into edit form
512        FormTester renameForm = tester.newFormTester("projectsForm:projRenamePanel:projRenameForm");
513        renameForm.setValue("projectRename", TEST_RENAME_NAME);
514        renameForm.submit();
515    
516        // Push save button
517        Button renameSaveButton = (Button) tester.getComponentFromLastRenderedPage(
518          "projectsForm:projRenamePanel:projRenameForm:renameButton");
519        renameSaveButton.onSubmit();
520    
521        // Check project count, should be one more
522        listView = (ListView) tester
523            .getComponentFromLastRenderedPage(PROJECT_TABLE);
524        Integer projectListCount = listView.getList().size();
525        Assert.assertEquals("No additional project should be added to project list.",
526            (int) previousListCount, (int) projectListCount);
527    
528        // Loop through table and make sure that test rename project is present
529        index = 0;
530        Boolean found = false;
531        for (Object object : listView.getList()) {
532          Project project = (Project) object;
533    
534          // Check data within model backing the test project
535          if (TestProjectsPage.TEST_RENAME_NAME.equals(project.getName())) {
536            found = true;
537    
538            // Check start date.
539            SimpleDateFormat format = new SimpleDateFormat(DATE_PATTERN, Locale.ENGLISH);
540            Date startDate = format.parse(TestProjectsPage.TEST_NEW_STARTDATE);
541            XMLGregorianCalendar startTime = Tstamp.makeTimestamp(startDate.getTime());
542            Assert.assertEquals("Start date should be " + TEST_NEW_STARTDATE, DatatypeConstants.EQUAL,
543                project.getStartTime().compare(startTime));
544    
545            // Check start date.
546            Date endDate = format.parse(TestProjectsPage.TEST_NEW_ENDDATE);
547            XMLGregorianCalendar endTime = Tstamp.makeTimestamp(endDate.getTime());
548            Assert.assertEquals("End date should be " + TEST_NEW_ENDDATE, DatatypeConstants.EQUAL,
549                project.getEndTime().compare(endTime));
550    
551            // Test project data
552            Assert.assertEquals("Project description", TestProjectsPage.TEST_NEW_DESC, project
553                .getDescription());
554            Assert.assertTrue(project.getMembers().getMember().isEmpty());
555            Assert.assertTrue(project.getInvitations().getInvitation().contains(TEST_NEW_INVITEE));
556            Assert.assertTrue(project.getSpectators().getSpectator().contains(TEST_NEW_SPECTATOR));
557          }
558          else {
559            index++;
560          }
561        }
562        Assert.assertTrue(TEST_RENAME_NAME + NOT_FOUND, found);
563      }
564    
565      /**
566       * Test the deletion of a project.
567       * 
568       * @throws Exception when communication error occurs.
569       */
570      @Test
571      public void testProjectsDeletePage() throws Exception { // NOPMD WicketTester has its own assert
572    
573        Properties testProperties = getTestProperties();
574        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
575        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
576    
577        login(tester);
578        createNewProject(tester);
579    
580        ListView listView = (ListView) tester
581            .getComponentFromLastRenderedPage(PROJECT_TABLE);
582        Integer previousListCount = listView.getList().size();
583    
584        // Push the edit button
585        Integer index = findProjectIndexInList(tester, TEST_NEW_NAME);
586        Button deleteButton = (Button) tester
587            .getComponentFromLastRenderedPage(PREFIX_LIST
588                + index.toString() + DELETE_BUTTON);
589        deleteButton.onSubmit();
590    
591        // Assert correct panels are visible
592        tester.assertComponent(DELETE_PANEL, ProjDeletePanel.class);
593        tester.assertInvisible(EDIT_PANEL);
594        tester.assertInvisible(LIST_PANEL);
595        tester.assertInvisible(RENAME_PANEL);
596        tester.assertInvisible(LEAVE_PANEL);
597        tester.assertVisible(DELETE_PANEL);
598        tester.assertInvisible(REPLY_PANEL);
599        tester.assertInvisible(CLEARCACHE_PANEL);
600    
601        // Push cancel button
602        Button cancelDeleteButton = (Button) tester.getComponentFromLastRenderedPage(
603          "projectsForm:projDeletePanel:projDeleteForm:cancelButton");
604        cancelDeleteButton.onSubmit();
605        tester.newFormTester(PROJECTS_FORM).submit();
606    
607        // Assert correct panels are visible
608        tester.assertComponent(LIST_PANEL, ProjListPanel.class);
609        tester.assertInvisible(EDIT_PANEL);
610        tester.assertVisible(LIST_PANEL);
611        tester.assertInvisible(RENAME_PANEL);
612        tester.assertInvisible(LEAVE_PANEL);
613        tester.assertInvisible(DELETE_PANEL);
614        tester.assertInvisible(REPLY_PANEL);
615        tester.assertInvisible(CLEARCACHE_PANEL);
616    
617        // Push the delete button again
618        index = findProjectIndexInList(tester, TEST_NEW_NAME);
619        deleteButton = (Button) tester
620            .getComponentFromLastRenderedPage(PREFIX_LIST
621                + index.toString() + DELETE_BUTTON);
622        deleteButton.onSubmit();
623    
624        // Push delete button
625        Button deleteDeleteButton = (Button) tester.getComponentFromLastRenderedPage(
626          "projectsForm:projDeletePanel:projDeleteForm:deleteButton");
627        deleteDeleteButton.onSubmit();
628    
629        // Check project count, should be one more
630        listView = (ListView) tester
631            .getComponentFromLastRenderedPage(PROJECT_TABLE);
632        Integer projectListCount = listView.getList().size();
633        Assert.assertEquals("One project should be reomoved to project list.",
634            (int) previousListCount - 1, (int) projectListCount);
635    
636        // Loop through table and make sure that test rename project is present
637        Boolean found = false;
638        for (Object object : listView.getList()) {
639          Project project = (Project) object;
640    
641          // Check data within model backing the test project
642          if (TestProjectsPage.TEST_NEW_NAME.equals(project.getName())) {
643            found = true;
644          }
645        }
646        Assert.assertFalse(TEST_NEW_NAME + " project should have been deleted.", found);
647      }
648    
649      /**
650       * Test the acceptance of an invitation to join a group.
651       * 
652       * @throws Exception when communication error occurs.
653       */
654      @Test
655      public void testProjectsReplyAcceptPage() throws Exception { // NOPMD WicketTester has its own
656                                                                    // assert classes.
657    
658        Properties testProperties = getTestProperties();
659        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
660        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
661    
662        // Login and create new record with a test invitee
663        login(tester);
664        createNewProject(tester);
665    
666        // Login as test invitee
667        tester.startPage(SigninPage.class);
668        FormTester signinForm = tester.newFormTester(SIGNIN_FORM);
669        signinForm.setValue(USER, TEST_INVITEE);
670        signinForm.setValue(PASSWORD, TEST_INVITEE);
671        signinForm.submit(SIGNIN);
672        tester.assertRenderedPage(SensorDataPage.class);
673    
674        // Navigate to projects page and check that page is setup correctly
675        tester.clickLink(PROJECTS_LINK);
676        tester.assertRenderedPage(ProjectsPage.class);
677        tester.assertComponent(PROJECTS_FORM, ProjectsForm.class);
678        tester.assertVisible(LIST_PANEL);
679        tester.assertInvisible(EDIT_PANEL);
680        tester.assertInvisible(RENAME_PANEL);
681        tester.assertInvisible(LEAVE_PANEL);
682        tester.assertInvisible(DELETE_PANEL);
683        tester.assertInvisible(REPLY_PANEL);
684        tester.assertInvisible(CLEARCACHE_PANEL);
685    
686        // Store project count for later compare
687        ListView listView = (ListView) tester
688            .getComponentFromLastRenderedPage(PROJECT_TABLE);
689        Integer previousListCount = listView.getList().size();
690    
691        // Check that all button invisible except reply button
692        Integer index = findProjectIndexInList(tester, TEST_NEW_NAME);
693        tester.assertInvisible(PREFIX_LIST + index.toString() + EDIT_BUTTON);
694        tester.assertInvisible(PREFIX_LIST + index.toString() + DELETE_BUTTON);
695        tester.assertInvisible(PREFIX_LIST + index.toString() + RENAME_BUTTON);
696        tester.assertInvisible(PREFIX_LIST + index.toString() + LEAVE_BUTTON);
697        tester.assertVisible(PREFIX_LIST + index.toString() + REPLY_BUTTON);
698    
699        // Push the edit button
700        Button replyButton = (Button) tester
701            .getComponentFromLastRenderedPage(PREFIX_LIST
702                + index.toString() + REPLY_BUTTON);
703        replyButton.onSubmit();
704    
705        // Assert correct panels are visible
706        tester.assertComponent(REPLY_PANEL, ProjReplyPanel.class);
707        tester.assertInvisible(EDIT_PANEL);
708        tester.assertInvisible(LIST_PANEL);
709        tester.assertInvisible(RENAME_PANEL);
710        tester.assertInvisible(LEAVE_PANEL);
711        tester.assertInvisible(DELETE_PANEL);
712        tester.assertVisible(REPLY_PANEL);
713        tester.assertInvisible(CLEARCACHE_PANEL);
714    
715        // Push cancel button
716        Button cancelReplyButton = (Button) tester
717            .getComponentFromLastRenderedPage("projectsForm:projReplyPanel:projReplyForm:cancelButton");
718        cancelReplyButton.onSubmit();
719        tester.newFormTester(PROJECTS_FORM).submit();
720    
721        // Assert correct panels are visible
722        tester.assertComponent(LIST_PANEL, ProjListPanel.class);
723        tester.assertInvisible(EDIT_PANEL);
724        tester.assertVisible(LIST_PANEL);
725        tester.assertInvisible(RENAME_PANEL);
726        tester.assertInvisible(LEAVE_PANEL);
727        tester.assertInvisible(DELETE_PANEL);
728        tester.assertInvisible(REPLY_PANEL);
729        tester.assertInvisible(CLEARCACHE_PANEL);
730    
731        // Push the delete button again
732        index = findProjectIndexInList(tester, TEST_NEW_NAME);
733        replyButton = (Button) tester
734            .getComponentFromLastRenderedPage(PREFIX_LIST
735                + index.toString() + REPLY_BUTTON);
736        replyButton.onSubmit();
737    
738        // Push save button
739        Button acceptButton = (Button) tester
740            .getComponentFromLastRenderedPage("projectsForm:projReplyPanel:projReplyForm:acceptButton");
741        acceptButton.onSubmit();
742        tester.newFormTester(PROJECTS_FORM).submit();
743    
744        // Check project count
745        listView = (ListView) tester
746            .getComponentFromLastRenderedPage(PROJECT_TABLE);
747        Integer projectListCount = listView.getList().size();
748        Assert.assertEquals("Should have same amount of projects.", (int) previousListCount,
749            (int) projectListCount);
750        Project project = findProjectInList(tester, TEST_NEW_NAME);
751    
752        // Check if project found and check buttons
753        index = findProjectIndexInList(tester, TEST_NEW_NAME);
754        Assert.assertTrue(TEST_NEW_NAME + " project not found.", (index >= 0));
755        tester.assertInvisible(PREFIX_LIST + index.toString() + EDIT_BUTTON);
756        tester.assertInvisible(PREFIX_LIST + index.toString() + DELETE_BUTTON);
757        tester.assertInvisible(PREFIX_LIST + index.toString() + RENAME_BUTTON);
758        tester.assertVisible(PREFIX_LIST + index.toString() + LEAVE_BUTTON);
759        tester.assertInvisible(PREFIX_LIST + index.toString() + REPLY_BUTTON);
760    
761        // Login as test user again
762    
763        tester.startPage(SigninPage.class);
764        signinForm = tester.newFormTester(SIGNIN_FORM);
765        signinForm.setValue(USER, TEST_USER);
766        signinForm.setValue(PASSWORD, TEST_USER);
767        signinForm.submit(SIGNIN);
768        tester.assertRenderedPage(SensorDataPage.class);
769    
770        // Check if invitee is a member and not an invitee
771        tester.clickLink(PROJECTS_LINK);
772        project = findProjectInList(tester, TEST_NEW_NAME);
773        Assert.assertEquals("Invitee should now be a member.", TEST_INVITEE, project.getMembers()
774            .getMember().get(0));
775        Assert.assertEquals("Invitee should not be an invitee.", 0, project.getInvitations()
776            .getInvitation().size());
777    
778      }
779    
780      /**
781       * Test the declining of an invitation to join a group.
782       * 
783       * @throws Exception when communication error occurs.
784       */
785      @Test
786      public void testProjectsReplyDeclinePage() throws Exception { // NOPMD WicketTester has its own
787                                                                    // assert classes.
788        Properties testProperties = getTestProperties();
789        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
790        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
791    
792        // Login and create new record with a test invitee
793        login(tester);
794        createNewProject(tester);
795    
796        // Login as test invitee
797    
798        tester.startPage(SigninPage.class);
799        FormTester signinForm = tester.newFormTester(SIGNIN_FORM);
800        signinForm.setValue(USER, TEST_INVITEE);
801        signinForm.setValue(PASSWORD, TEST_INVITEE);
802        signinForm.submit(SIGNIN);
803        tester.assertRenderedPage(SensorDataPage.class);
804    
805        // Navigate to projects page and check that page is setup correctly
806        tester.clickLink(PROJECTS_LINK);
807        tester.assertRenderedPage(ProjectsPage.class);
808        tester.assertComponent(PROJECTS_FORM, ProjectsForm.class);
809        tester.assertVisible(LIST_PANEL);
810        tester.assertInvisible(EDIT_PANEL);
811        tester.assertInvisible(RENAME_PANEL);
812        tester.assertInvisible(LEAVE_PANEL);
813        tester.assertInvisible(DELETE_PANEL);
814        tester.assertInvisible(REPLY_PANEL);
815        tester.assertInvisible(CLEARCACHE_PANEL);
816    
817        // Store project count for later compare
818        ListView listView = (ListView) tester
819            .getComponentFromLastRenderedPage(PROJECT_TABLE);
820        Integer previousListCount = listView.getList().size();
821    
822        // Check that all button invisible except reply button
823        Integer index = findProjectIndexInList(tester, TEST_NEW_NAME);
824        tester.assertInvisible(PREFIX_LIST + index.toString() + EDIT_BUTTON);
825        tester.assertInvisible(PREFIX_LIST + index.toString() + DELETE_BUTTON);
826        tester.assertInvisible(PREFIX_LIST + index.toString() + RENAME_BUTTON);
827        tester.assertInvisible(PREFIX_LIST + index.toString() + LEAVE_BUTTON);
828        tester.assertVisible(PREFIX_LIST + index.toString() + REPLY_BUTTON);
829    
830        // Push the edit button
831        Button replyButton = (Button) tester
832            .getComponentFromLastRenderedPage(PREFIX_LIST
833                + index.toString() + REPLY_BUTTON);
834        replyButton.onSubmit();
835    
836        // Assert correct panels are visible
837        tester.assertComponent(REPLY_PANEL, ProjReplyPanel.class);
838        tester.assertInvisible(EDIT_PANEL);
839        tester.assertInvisible(LIST_PANEL);
840        tester.assertInvisible(RENAME_PANEL);
841        tester.assertInvisible(LEAVE_PANEL);
842        tester.assertInvisible(DELETE_PANEL);
843        tester.assertVisible(REPLY_PANEL);
844        tester.assertInvisible(CLEARCACHE_PANEL);
845    
846        // Push save button
847        Button declineButton = (Button) tester.getComponentFromLastRenderedPage(
848          "projectsForm:projReplyPanel:projReplyForm:declineButton");
849        declineButton.onSubmit();
850        tester.newFormTester(PROJECTS_FORM).submit();
851    
852        // Check project count
853        listView = (ListView) tester
854            .getComponentFromLastRenderedPage(PROJECT_TABLE);
855        Integer projectListCount = listView.getList().size();
856        Assert.assertEquals("Should have one less project.", (int) previousListCount - 1,
857            (int) projectListCount);
858    
859        // Check to see if project is gone.
860        Project project = findProjectInList(tester, TEST_NEW_NAME);
861        Assert.assertNull("Project should be gone, after decline.", project);
862    
863        // Login as test user again
864    
865        tester.startPage(SigninPage.class);
866        signinForm = tester.newFormTester(SIGNIN_FORM);
867        signinForm.setValue(USER, TEST_USER);
868        signinForm.setValue(PASSWORD, TEST_USER);
869        signinForm.submit(SIGNIN);
870        tester.assertRenderedPage(SensorDataPage.class);
871    
872        // Check if invitee is a member and not an invitee
873        tester.clickLink(PROJECTS_LINK);
874        project = findProjectInList(tester, TEST_NEW_NAME);
875        Assert.assertEquals("Invitee should not be a member.", 0, project.getMembers().getMember()
876            .size());
877        Assert.assertEquals("Invitee should not be an invitee.", 0, project.getInvitations()
878            .getInvitation().size());
879    
880      }
881    
882      /**
883       * Test leaving a project.
884       * 
885       * @throws Exception when communication error occurs.
886       */
887      @Test
888      public void testProjectsLeavePage() throws Exception { // NOPMD WicketTester has its own assert
889                                                              // classes.
890    
891        Properties testProperties = getTestProperties();
892        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
893        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
894    
895        // Login and create new record with a test invitee
896        login(tester);
897        createNewProject(tester);
898    
899        // Login as test invitee
900        tester.startPage(SigninPage.class);
901        FormTester signinForm = tester.newFormTester(SIGNIN_FORM);
902        signinForm.setValue(USER, TEST_INVITEE);
903        signinForm.setValue(PASSWORD, TEST_INVITEE);
904        signinForm.submit(SIGNIN);
905        tester.assertRenderedPage(SensorDataPage.class);
906    
907        // Navigate to projects page and check that page is setup correctly
908        tester.clickLink(PROJECTS_LINK);
909        tester.assertRenderedPage(ProjectsPage.class);
910        tester.assertComponent(PROJECTS_FORM, ProjectsForm.class);
911        tester.assertVisible(LIST_PANEL);
912        tester.assertInvisible(EDIT_PANEL);
913        tester.assertInvisible(RENAME_PANEL);
914        tester.assertInvisible(LEAVE_PANEL);
915        tester.assertInvisible(DELETE_PANEL);
916        tester.assertInvisible(REPLY_PANEL);
917        tester.assertInvisible(CLEARCACHE_PANEL);
918    
919        // Store project count for later compare
920        ListView listView = (ListView) tester
921            .getComponentFromLastRenderedPage(PROJECT_TABLE);
922        Integer previousListCount = listView.getList().size();
923    
924        // Check that all button invisible except reply button
925        Integer index = findProjectIndexInList(tester, TEST_NEW_NAME);
926        tester.assertInvisible(PREFIX_LIST + index.toString() + EDIT_BUTTON);
927        tester.assertInvisible(PREFIX_LIST + index.toString() + DELETE_BUTTON);
928        tester.assertInvisible(PREFIX_LIST + index.toString() + RENAME_BUTTON);
929        tester.assertInvisible(PREFIX_LIST + index.toString() + LEAVE_BUTTON);
930        tester.assertVisible(PREFIX_LIST + index.toString() + REPLY_BUTTON);
931    
932        // Push the edit button
933        Button replyButton = (Button) tester
934            .getComponentFromLastRenderedPage(PREFIX_LIST
935                + index.toString() + REPLY_BUTTON);
936        replyButton.onSubmit();
937    
938        // Assert correct panels are visible
939        tester.assertComponent(REPLY_PANEL, ProjReplyPanel.class);
940        tester.assertInvisible(EDIT_PANEL);
941        tester.assertInvisible(LIST_PANEL);
942        tester.assertInvisible(RENAME_PANEL);
943        tester.assertInvisible(LEAVE_PANEL);
944        tester.assertInvisible(DELETE_PANEL);
945        tester.assertVisible(REPLY_PANEL);
946        tester.assertInvisible(CLEARCACHE_PANEL);
947    
948        // Push save button
949        Button acceptButton = (Button) tester
950            .getComponentFromLastRenderedPage("projectsForm:projReplyPanel:projReplyForm:acceptButton");
951        acceptButton.onSubmit();
952        tester.newFormTester(PROJECTS_FORM).submit();
953    
954        // Check project count
955        listView = (ListView) tester
956            .getComponentFromLastRenderedPage(PROJECT_TABLE);
957        Integer projectListCount = listView.getList().size();
958        Assert.assertEquals("Should have same amount of projects.", (int) previousListCount,
959            (int) projectListCount);
960    
961        Project project = findProjectInList(tester, TEST_NEW_NAME);
962    
963        // Check if project found and check buttons
964        index = findProjectIndexInList(tester, TEST_NEW_NAME);
965        Assert.assertTrue(TEST_NEW_NAME + " project not found.", (index >= 0));
966        tester.assertInvisible(PREFIX_LIST + index.toString() + EDIT_BUTTON);
967        tester.assertInvisible(PREFIX_LIST + index.toString() + DELETE_BUTTON);
968        tester.assertInvisible(PREFIX_LIST + index.toString() + RENAME_BUTTON);
969        tester.assertVisible(PREFIX_LIST + index.toString() + LEAVE_BUTTON);
970        tester.assertInvisible(PREFIX_LIST + index.toString() + REPLY_BUTTON);
971    
972        // Push the leave button
973        Button leaveButton = (Button) tester
974            .getComponentFromLastRenderedPage(PREFIX_LIST
975                + index.toString() + LEAVE_BUTTON);
976        leaveButton.onSubmit();
977    
978        // Assert correct panels are visible
979        tester.assertComponent(LEAVE_PANEL, ProjLeavePanel.class);
980        tester.assertInvisible(EDIT_PANEL);
981        tester.assertInvisible(LIST_PANEL);
982        tester.assertInvisible(RENAME_PANEL);
983        tester.assertVisible(LEAVE_PANEL);
984        tester.assertInvisible(DELETE_PANEL);
985        tester.assertInvisible(REPLY_PANEL);
986        tester.assertInvisible(CLEARCACHE_PANEL);
987    
988        // Push cancel button
989        Button cancelLeaveButton = (Button) tester
990            .getComponentFromLastRenderedPage("projectsForm:projLeavePanel:projLeaveForm:cancelButton");
991        cancelLeaveButton.onSubmit();
992        tester.newFormTester(PROJECTS_FORM).submit();
993    
994        // Push the delete button again
995        index = findProjectIndexInList(tester, TEST_NEW_NAME);
996        leaveButton = (Button) tester
997            .getComponentFromLastRenderedPage(PREFIX_LIST
998                + index.toString() + LEAVE_BUTTON);
999        leaveButton.onSubmit();
1000    
1001        // Push save button
1002        Button leaveLeaveButton = (Button) tester
1003            .getComponentFromLastRenderedPage("projectsForm:projLeavePanel:projLeaveForm:leaveButton");
1004        leaveLeaveButton.onSubmit();
1005        tester.newFormTester(PROJECTS_FORM).submit();
1006    
1007        // Assert correct panels are visible
1008        tester.assertComponent(LIST_PANEL, ProjListPanel.class);
1009        tester.assertInvisible(EDIT_PANEL);
1010        tester.assertVisible(LIST_PANEL);
1011        tester.assertInvisible(RENAME_PANEL);
1012        tester.assertInvisible(LEAVE_PANEL);
1013        tester.assertInvisible(DELETE_PANEL);
1014        tester.assertInvisible(REPLY_PANEL);
1015        tester.assertInvisible(CLEARCACHE_PANEL);
1016    
1017        // Check to see if project is gone.
1018        project = findProjectInList(tester, TEST_NEW_NAME);
1019        Assert.assertNull("Project should be gone, after decline.", project);
1020    
1021        // Login as test user again
1022        tester.startPage(SigninPage.class);
1023        signinForm = tester.newFormTester(SIGNIN_FORM);
1024        signinForm.setValue(USER, TEST_USER);
1025        signinForm.setValue(PASSWORD, TEST_USER);
1026        signinForm.submit(SIGNIN);
1027        tester.assertRenderedPage(SensorDataPage.class);
1028    
1029        // Check if invitee is a member and not an invitee
1030        tester.clickLink(PROJECTS_LINK);
1031        project = findProjectInList(tester, TEST_NEW_NAME);
1032        Assert.assertEquals("Invitee should not be a member.", 0, project.getMembers().getMember()
1033            .size());
1034        Assert.assertEquals("Invitee should not be an invitee.", 0, project.getInvitations()
1035            .getInvitation().size());
1036      }
1037      
1038      /**
1039       * Test project clear cache.
1040       * 
1041       * @throws Exception when communication error occurs.
1042       */
1043      @Test
1044      public void testProjectsClearCachePage() throws Exception { // NOPMD WicketTester has its own 
1045                                                                  // assert classes.
1046    
1047        Properties testProperties = getTestProperties();
1048        testProperties.put(ProjectBrowserProperties.AVAILABLEPAGE_KEY + PROJECTS, TRUE);
1049        WicketTester tester = new WicketTester(new ProjectBrowserApplication(testProperties));
1050    
1051        login(tester);
1052        createNewProject(tester);
1053    
1054        // Push the button
1055        Integer index = findProjectIndexInList(tester, TEST_NEW_NAME);
1056        Button clearCacheButton = (Button) tester
1057            .getComponentFromLastRenderedPage(PREFIX_LIST
1058                + index.toString() + CLEARCACHE_BUTTON);
1059        clearCacheButton.onSubmit();
1060    
1061        // Assert correct panels are visible
1062        tester.assertComponent(CLEARCACHE_PANEL, ProjClearCachePanel.class);
1063        tester.assertInvisible(EDIT_PANEL);
1064        tester.assertInvisible(LIST_PANEL);
1065        tester.assertInvisible(RENAME_PANEL);
1066        tester.assertInvisible(LEAVE_PANEL);
1067        tester.assertInvisible(DELETE_PANEL);
1068        tester.assertInvisible(REPLY_PANEL);
1069        tester.assertVisible(CLEARCACHE_PANEL);
1070    
1071        // Push save button
1072        Button button = (Button) tester.getComponentFromLastRenderedPage(
1073          "projectsForm:projClearCachePanel:projClearCacheForm:clearCacheButton");
1074        button.onSubmit();
1075        
1076        tester.assertRenderedPage(ProjectsPage.class);
1077        tester.assertComponent(PROJECTS_FORM, ProjectsForm.class);
1078        tester.assertVisible(LIST_PANEL);
1079        tester.assertInvisible(EDIT_PANEL);
1080        tester.assertInvisible(RENAME_PANEL);
1081        tester.assertInvisible(LEAVE_PANEL);
1082        tester.assertInvisible(DELETE_PANEL);
1083        tester.assertInvisible(REPLY_PANEL);
1084        tester.assertInvisible(CLEARCACHE_PANEL);
1085    
1086        // Push the button
1087        clearCacheButton.onSubmit();
1088    
1089        // Assert correct panels are visible
1090        tester.assertComponent(CLEARCACHE_PANEL, ProjClearCachePanel.class);
1091        tester.assertInvisible(EDIT_PANEL);
1092        tester.assertInvisible(LIST_PANEL);
1093        tester.assertInvisible(RENAME_PANEL);
1094        tester.assertInvisible(LEAVE_PANEL);
1095        tester.assertInvisible(DELETE_PANEL);
1096        tester.assertInvisible(REPLY_PANEL);
1097        tester.assertVisible(CLEARCACHE_PANEL);
1098    
1099        // Push save button
1100        Button cancelButton = (Button) tester.getComponentFromLastRenderedPage(
1101          "projectsForm:projClearCachePanel:projClearCacheForm:cancelButton");
1102        cancelButton.onSubmit();
1103        
1104        tester.assertRenderedPage(ProjectsPage.class);
1105        tester.assertComponent(PROJECTS_FORM, ProjectsForm.class);
1106        tester.assertVisible(LIST_PANEL);
1107        tester.assertInvisible(EDIT_PANEL);
1108        tester.assertInvisible(RENAME_PANEL);
1109        tester.assertInvisible(LEAVE_PANEL);
1110        tester.assertInvisible(DELETE_PANEL);
1111        tester.assertInvisible(REPLY_PANEL);
1112        tester.assertInvisible(CLEARCACHE_PANEL);
1113      }
1114    }