@Test
  public void testChildren() throws RepositoryException {
    when(mockRes1.getPath()).thenReturn(RDF_PATH + "/res1");
    when(mockRes2.getPath()).thenReturn(RDF_PATH + "/res2");
    when(mockRes3.getPath()).thenReturn(RDF_PATH + "/res3");
    when(mockResourceNode.hasNodes()).thenReturn(true);
    final Stream<FedoraResource> first = of(mockRes1, mockRes2, mockRes3);
    final Stream<FedoraResource> second = of(mockRes1, mockRes2, mockRes3);
    when(mockResource.getChildren()).thenReturn(first).thenReturn(second);

    try (final ChildrenRdfContext context = new ChildrenRdfContext(mockResource, idTranslator)) {
      final Model results = context.collect(toModel());
      final Resource subject = idTranslator.reverse().convert(mockResource);

      final StmtIterator stmts =
          results.listStatements(subject, RdfLexicon.HAS_CHILD_COUNT, (RDFNode) null);

      assertTrue("There should have been a statement!", stmts.hasNext());
      final Statement stmt = stmts.nextStatement();
      assertTrue("Object should be a literal! " + stmt.getObject(), stmt.getObject().isLiteral());
      assertEquals(3, stmt.getInt());

      assertFalse("There should not have been a second statement!", stmts.hasNext());
    }
  }
  @Test
  public void acl02Test() throws RepositoryException {
    final String agent = "Editors";
    final String accessTo = "/box/bag/collection";
    final String acl = "/acls/02";
    final String auth = acl + "/authorization.ttl";

    when(mockNodeService.find(mockSession, acl)).thenReturn(mockAclResource);
    when(mockProperty.getString()).thenReturn(acl);
    when(mockAclResource.getPath()).thenReturn(acl);
    when(mockResource.getPath()).thenReturn(accessTo);
    when(mockResource.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getResourceRdfStream(accessTo, acl));

    when(mockAuthorizationResource1.getTypes()).thenReturn(Arrays.asList(WEBAC_AUTHORIZATION));
    when(mockAuthorizationResource1.getPath()).thenReturn(auth);
    when(mockAuthorizationResource1.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(auth, TTL));

    when(mockAclResource.getChildren())
        .thenReturn(Arrays.asList(mockAuthorizationResource1).iterator());

    final Map<String, List<String>> roles = roleProvider.getRoles(mockNode, true);

    assertEquals("There should be exactly one agent in the role map", 1, roles.size());
    assertEquals("The agent should have exactly two modes", 2, roles.get(agent).size());
    assertTrue(
        "The agent should be able to read", roles.get(agent).contains(WEBAC_MODE_READ_VALUE));
    assertTrue(
        "The agent should be able to write", roles.get(agent).contains(WEBAC_MODE_WRITE_VALUE));
  }
  @Test
  public void acl01Test2() throws RepositoryException {
    final String accessTo = "/webacl_box2";
    final String acl = "/acls/01";
    final String auth = acl + "/authorization.ttl";

    when(mockNodeService.find(mockSession, acl)).thenReturn(mockAclResource);
    when(mockProperty.getString()).thenReturn(acl);
    when(mockAclResource.getPath()).thenReturn(acl);
    when(mockResource.getPath()).thenReturn(accessTo);
    when(mockResource.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getResourceRdfStream(accessTo, acl));

    when(mockAuthorizationResource1.getTypes()).thenReturn(Arrays.asList(WEBAC_AUTHORIZATION));
    when(mockAuthorizationResource1.getPath()).thenReturn(auth);
    when(mockAuthorizationResource1.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(auth, TTL));

    when(mockAclResource.getChildren())
        .thenReturn(Arrays.asList(mockAuthorizationResource1).iterator());

    final Map<String, List<String>> roles = roleProvider.getRoles(mockNode, true);

    assertTrue("There should be no agents associated with this object", roles.isEmpty());
  }
  /* (non-Javadoc)
   * Test that an in-repository resource used as a target for acl:agentClass has
   * the rdf:type of foaf:Group. This test mocks a foaf:Group resource and should
   * therefore retrieve two agents.
   */
  @Test
  public void acl09Test1() throws RepositoryException {
    final String agent1 = "person1";
    final String agent2 = "person2";
    final String accessTo = "/anotherCollection";

    final String groupResource = "/group/foo";
    final String acl = "/acls/09";
    final String auth = acl + "/authorization.ttl";
    final String group = acl + "/group.ttl";

    when(mockNodeService.find(mockSession, acl)).thenReturn(mockAclResource);
    when(mockNodeService.find(mockSession, groupResource)).thenReturn(mockAgentClassResource);
    when(mockProperty.getString()).thenReturn(acl);
    when(mockAclResource.getPath()).thenReturn(acl);
    when(mockResource.getPath()).thenReturn(accessTo);
    when(mockResource.getTypes()).thenReturn(new ArrayList<>());
    when(mockResource.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getResourceRdfStream(accessTo, acl));

    when(mockAuthorizationResource1.getTypes()).thenReturn(Arrays.asList(WEBAC_AUTHORIZATION));
    when(mockAuthorizationResource1.getPath()).thenReturn(auth);
    when(mockAuthorizationResource1.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(auth, TTL));

    when(mockAgentClassResource.getTypes()).thenReturn(Arrays.asList(FOAF_GROUP));
    when(mockAgentClassResource.getPath()).thenReturn(groupResource);
    when(mockAgentClassResource.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(group, TTL));

    when(mockAclResource.getChildren())
        .thenReturn(Arrays.asList(mockAuthorizationResource1).iterator());

    final Map<String, List<String>> roles = roleProvider.getRoles(mockNode, true);

    assertEquals("There should be exactly two agents", 2, roles.size());
    assertEquals("The agent should have two modes", 2, roles.get(agent1).size());
    assertTrue(
        "The agent should be able to read", roles.get(agent1).contains(WEBAC_MODE_READ_VALUE));
    assertTrue(
        "The agent should be able to write", roles.get(agent1).contains(WEBAC_MODE_WRITE_VALUE));
  }
  @Test
  public void acl04Test() throws RepositoryException {
    final String agent1 = "http://xmlns.com/foaf/0.1/Agent";
    final String agent2 = "Editors";
    final String accessTo = "/public_collection";
    final String acl = "/acls/04";
    final String auth1 = acl + "/auth1.ttl";
    final String auth2 = acl + "/auth2.ttl";

    when(mockNodeService.find(mockSession, acl)).thenReturn(mockAclResource);
    when(mockProperty.getString()).thenReturn(acl);
    when(mockAclResource.getPath()).thenReturn(acl);
    when(mockResource.getPath()).thenReturn(accessTo);
    when(mockResource.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getResourceRdfStream(accessTo, acl));

    when(mockAuthorizationResource1.getTypes()).thenReturn(Arrays.asList(WEBAC_AUTHORIZATION));
    when(mockAuthorizationResource1.getPath()).thenReturn(auth1);
    when(mockAuthorizationResource1.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(auth1, TTL));

    when(mockAuthorizationResource2.getTypes()).thenReturn(Arrays.asList(WEBAC_AUTHORIZATION));
    when(mockAuthorizationResource2.getPath()).thenReturn(auth2);
    when(mockAuthorizationResource2.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(auth2, TTL));

    when(mockAclResource.getChildren())
        .thenReturn(
            Arrays.asList(mockAuthorizationResource1, mockAuthorizationResource2).iterator());

    final Map<String, List<String>> roles = roleProvider.getRoles(mockNode, true);

    assertEquals("There should be exactly two agents", 2, roles.size());
    assertEquals("The agent should have one mode", 1, roles.get(agent1).size());
    assertTrue(
        "The agent should be able to read", roles.get(agent1).contains(WEBAC_MODE_READ_VALUE));
    assertEquals("The agent should have two modes", 2, roles.get(agent2).size());
    assertTrue(
        "The agent should be able to read", roles.get(agent2).contains(WEBAC_MODE_READ_VALUE));
    assertTrue(
        "The agent should be able to write", roles.get(agent2).contains(WEBAC_MODE_READ_VALUE));
  }
  @Test
  public void acl03Test2() throws RepositoryException {
    final String agent = "Restricted";
    final String accessTo = "/dark/archive";
    final String acl = "/acls/03";
    final String auth1 = acl + "/auth_restricted.ttl";
    final String auth2 = acl + "/auth_open.ttl";

    when(mockNodeService.find(mockSession, acl)).thenReturn(mockAclResource);
    when(mockProperty.getString()).thenReturn(acl);
    when(mockAclResource.getPath()).thenReturn(acl);
    when(mockResource.getPath()).thenReturn(accessTo);
    when(mockResource.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getResourceRdfStream(accessTo, acl));

    when(mockAuthorizationResource1.getTypes()).thenReturn(Arrays.asList(WEBAC_AUTHORIZATION));
    when(mockAuthorizationResource1.getPath()).thenReturn(auth1);
    when(mockAuthorizationResource1.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(auth1, TTL));

    when(mockAuthorizationResource2.getTypes()).thenReturn(Arrays.asList(WEBAC_AUTHORIZATION));
    when(mockAuthorizationResource2.getPath()).thenReturn(auth2);
    when(mockAuthorizationResource2.getTriples(anyObject(), eq(PropertiesRdfContext.class)))
        .thenReturn(getRdfStreamFromResource(auth2, TTL));

    when(mockAclResource.getChildren())
        .thenReturn(
            Arrays.asList(mockAuthorizationResource1, mockAuthorizationResource2).iterator());

    final Map<String, List<String>> roles = roleProvider.getRoles(mockNode, true);

    assertEquals("There should be exactly one agent", 1, roles.size());
    assertEquals("The agent should have one mode", 1, roles.get(agent).size());
    assertTrue(
        "The agent should be able to read", roles.get(agent).contains(WEBAC_MODE_READ_VALUE));
  }