1 Reply Latest reply on Sep 8, 2009 9:16 PM by cdunphy

    Testing pages protected by an admin role

      I am having all kinds of fun with the powerful integration testing framework that comes with Seam.  I have one problem that I am hoping to resolve.


      I have the following directive in my global pages.xml file to protect access to the admin interface:


      <page view-id="/admin/*">
          <restrict>#{s:hasRole('admin')}</restrict>
      </page>



      This works well and I am thus able to protect the admin interface nicely.  However, it is breaking some tests.  Here is one example.  The test to successfully create a user works, but the test where validation should fail because of a missing field doesn't work, and it is because of the role issue.  I have confirmed that if I disable the restriction in pages.xml that both tests pass.


      Interestingly, the it is NOT choking on the line (in the login FacesRequest):



      assert (Boolean) getValue("#{identity.hasRole('admin')}");



      It is choking in that it says validation passes for the processValidation() phase in the  createUserFailTest1() test. That should NOT be the case as I have clearly disabled a required field.  Again, if I remove the role restriction the validation fails as expected.


      Any idea how I can enhance the test below so that it will work for both tests?  If I can solve this one hurdle I am off to the races!  This is VERY cool stuff.


      // Chris


      public class CreateUserTest extends DBUnitSeamTest {
      
           static final String REAL_NAME = "Barney Purple Dinosaur";
           static final String USER_NAME = "barney";
           static final String EMAIL = "barney.dinosair@fake.com";
           static final boolean ADMIN_FLAG = true;
      
           @Override
           protected void prepareDBUnitOperations() {
                beforeTestOperations.add(new DataSetOperation("mockdata.xml"));
           }
      
           /**
            * <p>
            * This should fail in the process validation phase because we are omitting
            * a required field.
            * </p>
            * 
            * @throws Exception
            */
           @Test
           public void createUserFailTest1() throws Exception {
      
                new FacesRequest("/login.xhtml") {
                     @Override
                     protected void invokeApplication() {
                          setValue("#{credentials.username}",
                                    AuthenticatorTest.TEST_ADMIN_USER_1);
                          setValue("#{credentials.password}",
                                    AuthenticatorTest.TEST_ADMIN_PASSWORD_1);
                          invokeMethod("#{authenticator.authenticate}");
      
                          // The user has admin permissions!
                          assert (Boolean) getValue("#{identity.hasRole('admin')}");
                     }
                }.run();
      
                new FacesRequest("/admin/UserEdit.xhtml") {
      
                     EscalationRoleList escalationRoleList;
      
                     @Override
                     protected void processValidations() throws Exception {
      
                          escalationRoleList = (EscalationRoleList) Component
                                    .getInstance("escalationRoleList");
                          validateValue("#{user.role}", escalationRoleList
                                    .getResultList().get(0));
      
                          validateValue("#{user.admin}", ADMIN_FLAG);
                          validateValue("#{user.realname}", REAL_NAME);
                          // This should break validation
                          // validateValue("#{user.username}", USER_NAME);
                          validateValue("#{user.email}", EMAIL);
      
                          assert isValidationFailure();
                     }
      
                }.run();
           }
      
           @Test
           public void createUserTest() throws Exception {
      
                new FacesRequest("/login.xhtml") {
                     @Override
                     protected void invokeApplication() {
                          setValue("#{credentials.username}",
                                    AuthenticatorTest.TEST_ADMIN_USER_1);
                          setValue("#{credentials.password}",
                                    AuthenticatorTest.TEST_ADMIN_PASSWORD_1);
                          invokeMethod("#{authenticator.authenticate}");
                     }
                }.run();
      
                new FacesRequest("/admin/UserEdit.xhtml") {
      
                     EscalationRoleList escalationRoleList;
      
                     @Override
                     protected void processValidations() throws Exception {
      
                          escalationRoleList = (EscalationRoleList) Component
                                    .getInstance("escalationRoleList");
      
                          validateValue("#{user.role}", escalationRoleList
                                    .getResultList().get(0));
                          validateValue("#{user.admin}", ADMIN_FLAG);
                          validateValue("#{user.realname}", REAL_NAME);
                          validateValue("#{user.username}", USER_NAME);
                          validateValue("#{user.email}", EMAIL);
      
                          assert !isValidationFailure();
                     }
      
                     @Override
                     protected void updateModelValues() throws Exception {
                          setValue("#{user.role}", escalationRoleList.getResultList()
                                    .get(0));
                          setValue("#{user.admin}", ADMIN_FLAG);
                          setValue("#{user.realname}", REAL_NAME);
                          setValue("#{user.username}", USER_NAME);
                          setValue("#{user.email}", EMAIL);
                     }
      
                     @Override
                     protected void invokeApplication() {
                          invokeMethod("#{userHome.persist}");
                     }
      
                     @Override
                     protected void renderResponse() {
                          // Let's make sure that this user got saved.
                          assert (Boolean) getValue("#{userHome.managed}");
                          assert (Boolean) getValue("#{user.admin}");
                          assert getValue("#{user.realname}").equals(REAL_NAME);
                          assert getValue("#{user.username}").equals(USER_NAME);
                          assert getValue("#{user.role.label}").equals(
                                    escalationRoleList.getResultList().get(0).getLabel());
      
                     }
      
                }.run();
           }
      }









        • 1. Re: Testing pages protected by an admin role

          I was able to solve the problem after checking out page 243 of the Seam 2.1.1.GA reference documentation.  Basically, I just need to disable security for that test!  Nice!


          I call Identity.setSecurityEnabled(false) at the beginning of the test and I am back in Happy Fun Land(TM).



          @Test
               public void createUserFailTest1() throws Exception {
          
                    Identity.setSecurityEnabled(false);
          
                    new FacesRequest("/admin/UserEdit.xhtml") {
          
                         EscalationRoleList escalationRoleList;
          
                         @Override
                         protected void processValidations() throws Exception {
          
                              // Disable security for this test
          
                              // Again here, the user has admin permissions
                              // assert (Boolean) getValue("#{identity.hasRole('admin')}");
          
                              escalationRoleList = (EscalationRoleList) Component
                                        .getInstance("escalationRoleList");
                              validateValue("#{user.role}", escalationRoleList
                                        .getResultList().get(0));
          
                              validateValue("#{user.admin}", ADMIN_FLAG);
                              validateValue("#{user.realname}", REAL_NAME);
                              // This should break validation
                              // validateValue("#{user.username}", USER_NAME);
                              validateValue("#{user.email}", EMAIL);
          
                              assert isValidationFailure();
          
                         }
          
                    }.run();
               }




          Again, bugs in seam-gen aside (esp with GlassFish EAR projects), I am loving Seam!


          // Chris