@Test
  public void testUpdateConfiguration() throws Exception {
    // READ request to storage
    RequestContext.Builder storageReq =
        new RequestContext.Builder()
            .requestType(RequestType.READ)
            .resourcePath(new ResourcePath("/testApp/storage"));
    assertAuthzDecision(storageReq.securityContext(anonymous), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(user), AuthzDecision.ACCEPT);
    assertAuthzDecision(storageReq.securityContext(evil), AuthzDecision.REJECT);

    // Find and remove storage rule
    RequestContext reqCtx = new RequestContext.Builder();
    ResourceState config = client.read(reqCtx, "/admin/applications/testApp/resources/uri-policy");
    List<ResourceState> rules =
        (List<ResourceState>) config.getProperty(URIPolicyConfigResource.RULES_PROPERTY);

    ResourceState storageRule = null;
    for (ResourceState rule : rules) {
      if (rule.getProperty("uriPattern").equals("/testApp/storage*")) {
        storageRule = rule;
        break;
      }
    }
    Assert.assertNotNull(storageRule);
    rules.remove(storageRule);

    // Update config with removed storage rule
    client.update(reqCtx, "/admin/applications/testApp/resources/uri-policy", config);

    // READ request to storage
    assertAuthzDecision(storageReq.securityContext(anonymous), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(user), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(evil), AuthzDecision.IGNORE);

    // Remove section about deniedUsers and add it back
    storageRule.removeProperty("deniedUsers");
    rules.add(storageRule);
    client.update(reqCtx, "/admin/applications/testApp/resources/uri-policy", config);

    // READ request to storage now allowed even for 'evil'
    assertAuthzDecision(storageReq.securityContext(anonymous), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(user), AuthzDecision.ACCEPT);
    assertAuthzDecision(storageReq.securityContext(evil), AuthzDecision.ACCEPT);
  }
  @Test
  public void testAuthorizationRequest() throws Exception {
    // Request to 'client' page
    RequestContext.Builder clientReq =
        new RequestContext.Builder()
            .requestType(RequestType.READ)
            .resourcePath(new ResourcePath("/testApp/client/some"));
    assertAuthzDecision(clientReq.securityContext(anonymous), AuthzDecision.ACCEPT);
    assertAuthzDecision(clientReq.securityContext(user), AuthzDecision.ACCEPT);
    assertAuthzDecision(clientReq.securityContext(evil), AuthzDecision.ACCEPT);

    // request to /app/some
    RequestContext.Builder appReq =
        new RequestContext.Builder()
            .requestType(RequestType.READ)
            .resourcePath(new ResourcePath("/testApp/app/some"));
    assertAuthzDecision(appReq.securityContext(anonymous), AuthzDecision.IGNORE);
    assertAuthzDecision(appReq.securityContext(user), AuthzDecision.IGNORE);
    assertAuthzDecision(appReq.securityContext(evil), AuthzDecision.IGNORE);

    // request to /app/some
    RequestContext.Builder appIndexReq =
        new RequestContext.Builder()
            .requestType(RequestType.READ)
            .resourcePath(new ResourcePath("/testApp/app/index.html"));
    assertAuthzDecision(appIndexReq.securityContext(anonymous), AuthzDecision.ACCEPT);
    assertAuthzDecision(appIndexReq.securityContext(user), AuthzDecision.ACCEPT);
    assertAuthzDecision(appIndexReq.securityContext(evil), AuthzDecision.ACCEPT);

    // READ request to storage
    RequestContext.Builder storageReq =
        new RequestContext.Builder()
            .requestType(RequestType.READ)
            .resourcePath(new ResourcePath("/testApp/storage"));
    assertAuthzDecision(storageReq.securityContext(anonymous), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(user), AuthzDecision.ACCEPT);
    assertAuthzDecision(storageReq.securityContext(evil), AuthzDecision.REJECT);

    // READ some collection in storage
    storageReq.resourcePath(new ResourcePath("/testApp/storage/todomvc"));
    assertAuthzDecision(storageReq.securityContext(anonymous), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(user), AuthzDecision.ACCEPT);
    assertAuthzDecision(storageReq.securityContext(evil), AuthzDecision.REJECT);

    // CREATE request to storage
    storageReq.requestType(RequestType.CREATE);
    assertAuthzDecision(storageReq.securityContext(anonymous), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(user), AuthzDecision.IGNORE);
    assertAuthzDecision(storageReq.securityContext(evil), AuthzDecision.IGNORE);
  }