mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Guy Paddock
24.24.2017 6f65305de961bd47493caf48ce59a5645bb35209
Reformat `BasicRequestsTest` test

As we're going to be making a lot of changes in this area, the tests should at least be legible first.
1 files modified
300 ■■■■ changed files
opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java 300 ●●●● patch | view | raw | blame | history
opendj-rest2ldap/src/test/java/org/forgerock/opendj/rest2ldap/BasicRequestsTest.java
@@ -12,6 +12,7 @@
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2013-2016 ForgeRock AS.
 * Portions Copyright 2017 Rosie Applications, Inc.
 */
package org.forgerock.opendj.rest2ldap;
@@ -95,8 +96,12 @@
    public void testQueryAll() throws Exception {
        final Connection connection = newConnection();
        final List<ResourceResponse> resources = new LinkedList<>();
        final QueryResponse result = connection.query(
                newAuthConnectionContext(), newQueryRequest("").setQueryFilter(NO_FILTER), resources);
        final QueryResponse result =
            connection.query(
                newAuthConnectionContext(),
                newQueryRequest("").setQueryFilter(NO_FILTER),
                resources);
        assertThat(resources).hasSize(5);
        assertThat(result.getPagedResultsCookie()).isNull();
        assertThat(result.getTotalPagedResults()).isEqualTo(-1);
@@ -108,6 +113,7 @@
        final List<ResourceResponse> resources = new LinkedList<>();
        final QueryResponse result = connection.query(newAuthConnectionContext(),
                newQueryRequest("").setQueryFilter(QueryFilter.<JsonPointer> alwaysFalse()), resources);
        assertThat(resources).hasSize(0);
        assertThat(result.getPagedResultsCookie()).isNull();
        assertThat(result.getTotalPagedResults()).isEqualTo(-1);
@@ -119,30 +125,49 @@
        final List<ResourceResponse> resources = new ArrayList<>();
        // Read first page.
        QueryResponse result = connection.query(
                newAuthConnectionContext(), newQueryRequest("").setQueryFilter(NO_FILTER).setPageSize(2), resources);
        QueryResponse result =
            connection.query(
                newAuthConnectionContext(),
                newQueryRequest("").setQueryFilter(NO_FILTER).setPageSize(2), resources);
        assertThat(result.getPagedResultsCookie()).isNotNull();
        assertThat(resources).hasSize(2);
        assertThat(resources.get(0).getId()).isEqualTo("test1");
        assertThat(resources.get(1).getId()).isEqualTo("test2");
        String cookie = result.getPagedResultsCookie();
        resources.clear();
        // Read second page.
        result = connection.query(newAuthConnectionContext(),
                newQueryRequest("").setQueryFilter(NO_FILTER).setPageSize(2).setPagedResultsCookie(cookie), resources);
        result =
            connection.query(
                newAuthConnectionContext(),
                newQueryRequest("")
                    .setQueryFilter(NO_FILTER)
                    .setPageSize(2)
                    .setPagedResultsCookie(cookie),
                resources);
        assertThat(result.getPagedResultsCookie()).isNotNull();
        assertThat(resources).hasSize(2);
        assertThat(resources.get(0).getId()).isEqualTo("test3");
        assertThat(resources.get(1).getId()).isEqualTo("test4");
        cookie = result.getPagedResultsCookie();
        resources.clear();
        // Read third page.
        result = connection.query(newAuthConnectionContext(),
                newQueryRequest("").setQueryFilter(NO_FILTER).setPageSize(2).setPagedResultsCookie(cookie), resources);
        result =
            connection.query(
                newAuthConnectionContext(),
                newQueryRequest("")
                    .setQueryFilter(NO_FILTER)
                    .setPageSize(2)
                    .setPagedResultsCookie(cookie),
                resources);
        assertThat(result.getPagedResultsCookie()).isNull();
        assertThat(resources).hasSize(1);
        assertThat(resources.get(0).getId()).isEqualTo("test5");
@@ -152,8 +177,16 @@
    public void testQueryPageResultsIndexed() throws Exception {
        final Connection connection = newConnection();
        final List<ResourceResponse> resources = new ArrayList<>();
        QueryResponse result = connection.query(newAuthConnectionContext(),
                newQueryRequest("").setQueryFilter(NO_FILTER).setPageSize(2).setPagedResultsOffset(1), resources);
        QueryResponse result =
            connection.query(
                newAuthConnectionContext(),
                newQueryRequest("")
                    .setQueryFilter(NO_FILTER)
                    .setPageSize(2)
                    .setPagedResultsOffset(1),
                resources);
        assertThat(result.getPagedResultsCookie()).isNotNull();
        assertThat(resources).hasSize(2);
        assertThat(resources.get(0).getId()).isEqualTo("test3");
@@ -165,6 +198,7 @@
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        final ResourceResponse resource = connection.delete(context, newDeleteRequest("/test1"));
        checkResourcesAreEqual(resource, getTestUser1(12345));
        connection.read(context, newReadRequest("/test1"));
    }
@@ -173,7 +207,9 @@
    public void testDeleteMVCCMatch() throws Exception {
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        final ResourceResponse resource = connection.delete(context, newDeleteRequest("/test1").setRevision("12345"));
        final ResourceResponse resource =
            connection.delete(context, newDeleteRequest("/test1").setRevision("12345"));
        checkResourcesAreEqual(resource, getTestUser1(12345));
        connection.read(context, newReadRequest("/test1"));
    }
@@ -182,6 +218,7 @@
    public void testDeleteMVCCNoMatch() throws Exception {
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        connection.delete(context, newDeleteRequest("/test1").setRevision("12346"));
    }
@@ -189,6 +226,7 @@
    public void testDeleteNotFound() throws Exception {
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        connection.delete(context, newDeleteRequest("/missing"));
    }
@@ -199,6 +237,7 @@
        final ResourceResponse resource1 = connection.patch(context,
                newPatchRequest("/test1", add("/name/displayName", "changed")));
        checkResourcesAreEqual(resource1, getTestUser1Updated(12345));
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, getTestUser1Updated(12345));
    }
@@ -209,6 +248,7 @@
        final Context context = newAuthConnectionContext(requests);
        final Connection connection = newConnection();
        final ResourceResponse resource1 = connection.patch(context, newPatchRequest("/test1"));
        checkResourcesAreEqual(resource1, getTestUser1(12345));
        /*
@@ -227,11 +267,16 @@
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        final JsonValue newContent = getTestUser1(12345);
        newContent.put("description", asList("one", "two"));
        final ResourceResponse resource1 =
                connection.patch(context,
                                 newPatchRequest("/test1", add("/description", asList("one", "two"))));
                                 newPatchRequest(
                                    "/test1",
                                    add("/description", asList("one", "two"))));
        checkResourcesAreEqual(resource1, newContent);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, newContent);
    }
@@ -241,26 +286,37 @@
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        final JsonValue newContent = getTestUser1(12345);
        newContent.put("description", asList("one", "two"));
        final ResourceResponse resource1 = connection.patch(
            context, newPatchRequest("/test1", add("/description/-", "one"), add("/description/-", "two")));
        final ResourceResponse resource1 =
            connection.patch(
                context,
                newPatchRequest("/test1", add("/description/-", "one"),
                                          add("/description/-", "two")));
        checkResourcesAreEqual(resource1, newContent);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, newContent);
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchConstantAttribute() throws Exception {
        newConnection().patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/schemas", asList("junk"))));
        newConnection().patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/schemas", asList("junk"))));
    }
    @Test
    public void testPatchDeleteOptionalAttribute() throws Exception {
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        connection.patch(context, newPatchRequest("/test1", add("/description", asList("one", "two"))));
        final ResourceResponse resource1 = connection.patch(context, newPatchRequest("/test1", remove("/description")));
        checkResourcesAreEqual(resource1, getTestUser1(12345));
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, getTestUser1(12345));
    }
@@ -270,34 +326,52 @@
        final Context context = newAuthConnectionContext();
        final Connection connection = newConnection();
        final JsonValue newContent = getTestUser1(12345);
        newContent.put("singleNumber", 100);
        newContent.put("multiNumber", asList(200, 300));
        final ResourceResponse resource1 = connection.patch(context, newPatchRequest("/test1",
        final ResourceResponse resource1 =
            connection.patch(
                context,
                newPatchRequest(
                    "/test1",
            add("/singleNumber", 0),
            add("/multiNumber", asList(100, 200)),
            increment("/singleNumber", 100),
            increment("/multiNumber", 100)));
        checkResourcesAreEqual(resource1, newContent);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, newContent);
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchMissingRequiredAttribute() throws Exception {
        newConnection().patch(newAuthConnectionContext(), newPatchRequest("/test1", remove("/name/surname")));
        newConnection().patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", remove("/name/surname")));
    }
    @Test
    public void testPatchModifyOptionalAttribute() throws Exception {
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext();
        connection.patch(context, newPatchRequest("/test1", add("/description", asList("one", "two"))));
        connection.patch(
            context,
            newPatchRequest("/test1", add("/description", asList("one", "two"))));
        final ResourceResponse resource1 =
                connection.patch(context, newPatchRequest("/test1", add("/description", asList("three"))));
            connection.patch(
                context,
                newPatchRequest("/test1", add("/description", asList("three"))));
        final JsonValue newContent = getTestUser1(12345);
        newContent.put("description", asList("one", "two", "three"));
        checkResourcesAreEqual(resource1, newContent);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, newContent);
    }
@@ -305,29 +379,42 @@
    @Test(expectedExceptions = NotSupportedException.class)
    public void testPatchMultiValuedAttributeIndexAppend() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/description/0", "junk")));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/description/0", "junk")));
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchMultiValuedAttributeIndexAppendWithList() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/description/-",
                asList("one", "two"))));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/description/-", asList("one", "two"))));
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchMultiValuedAttributeWithSingleValue() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/description", "one")));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/description", "one")));
    }
    @Test
    public void testPatchMVCCMatch() throws Exception {
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext();
        final ResourceResponse resource1 = connection.patch(
                context, newPatchRequest("/test1", add("/name/displayName", "changed")).setRevision("12345"));
        final ResourceResponse resource1 =
            connection.patch(
                context,
                newPatchRequest(
                    "/test1", add("/name/displayName", "changed")).setRevision("12345"));
        checkResourcesAreEqual(resource1, getTestUser1Updated(12345));
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, getTestUser1Updated(12345));
    }
@@ -335,9 +422,12 @@
    @Test(expectedExceptions = PreconditionFailedException.class)
    public void testPatchMVCCNoMatch() throws Exception {
        final Connection connection = newConnection();
        connection.patch(
                newAuthConnectionContext(),
                newPatchRequest("/test1", add("/name/displayName", "changed")).setRevision("12346"));
            newPatchRequest(
                "/test1",
                add("/name/displayName", "changed")).setRevision("12346"));
    }
    @Test(expectedExceptions = NotFoundException.class)
@@ -350,7 +440,9 @@
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchReadOnlyAttribute() throws Exception {
        // Etag is read-only.
        newConnection().patch(newAuthConnectionContext(), newPatchRequest("/test1", add("_rev", "99999")));
        newConnection().patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("_rev", "99999")));
    }
    @Test
@@ -363,9 +455,15 @@
            field("_rev", "12345"),
            field("name", object(field("displayName", "Humpty"),
                                 field("surname", "Dumpty")))));
        final ResourceResponse resource1 = connection.patch(context, newPatchRequest("/test1",
            replace("/name", object(field("displayName", "Humpty"), field("surname", "Dumpty")))));
        final ResourceResponse resource1 =
            connection.patch(
                context,
                newPatchRequest("/test1",
                replace("/name", object(field("displayName", "Humpty"),
                                        field("surname",     "Dumpty")))));
        checkResourcesAreEqual(resource1, expected);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, expected);
    }
@@ -374,18 +472,23 @@
    public void testPatchReplaceWholeObject() throws Exception {
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext();
        final JsonValue newContent = json(object(
        final JsonValue newContent =
            json(object(
            field("name", object(field("displayName", "Humpty"),
                                 field("surname", "Dumpty")))));
        final JsonValue expected = json(object(
        final JsonValue expected =
            json(object(
            field("schemas", asList("urn:scim:schemas:core:1.0")),
            field("_id", "test1"),
            field("_rev", "12345"),
            field("name", object(field("displayName", "Humpty"),
                                 field("surname", "Dumpty")))));
        final ResourceResponse resource1 =
                connection.patch(context, newPatchRequest("/test1", replace("/", newContent)));
        checkResourcesAreEqual(resource1, expected);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, expected);
    }
@@ -393,32 +496,48 @@
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchSingleValuedAttributeIndexAppend() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/name/surname/-", "junk")));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/name/surname/-", "junk")));
    }
    @Test(expectedExceptions = NotSupportedException.class)
    public void testPatchSingleValuedAttributeIndexNumber() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/name/surname/0", "junk")));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/name/surname/0", "junk")));
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchSingleValuedAttributeWithMultipleValues() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/name/surname", asList("black",
                "white"))));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest(
                "/test1",
                add("/name/surname", asList("black", "white"))));
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchUnknownAttribute() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/dummy", "junk")));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/dummy", "junk")));
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testPatchUnknownSubAttribute() throws Exception {
        final Connection connection = newConnection();
        connection.patch(newAuthConnectionContext(), newPatchRequest("/test1", add("/description/dummy", "junk")));
        connection.patch(
            newAuthConnectionContext(),
            newPatchRequest("/test1", add("/description/dummy", "junk")));
    }
    @Test(expectedExceptions = BadRequestException.class)
@@ -430,7 +549,9 @@
    @Test
    public void testRead() throws Exception {
        final ResourceResponse resource = newConnection().read(newAuthConnectionContext(), newReadRequest("/test1"));
        final ResourceResponse resource =
            newConnection().read(newAuthConnectionContext(), newReadRequest("/test1"));
        checkResourcesAreEqual(resource, getTestUser1(12345));
    }
@@ -441,15 +562,19 @@
    @Test
    public void testReadSelectAllFields() throws Exception {
        final ResourceResponse resource = newConnection().read(newAuthConnectionContext(),
                                                               newReadRequest("/test1").addField("/"));
        final ResourceResponse resource =
            newConnection().read(
                newAuthConnectionContext(), newReadRequest("/test1").addField("/"));
        checkResourcesAreEqual(resource, getTestUser1(12345));
    }
    @Test
    public void testReadSelectPartial() throws Exception {
        final ResourceResponse resource = newConnection().read(
        final ResourceResponse resource =
            newConnection().read(
            newAuthConnectionContext(), newReadRequest("/test1").addField("/name/surname"));
        assertThat(resource.getId()).isEqualTo("test1");
        assertThat(resource.getRevision()).isEqualTo("12345");
        assertThat(resource.getContent().get("_id").asString()).isNull();
@@ -461,8 +586,10 @@
    /** Disabled - see CREST-86 (Should JSON resource fields be case insensitive?) */
    @Test(enabled = false)
    public void testReadSelectPartialInsensitive() throws Exception {
        final ResourceResponse resource = newConnection().read(
        final ResourceResponse resource =
            newConnection().read(
            newAuthConnectionContext(), newReadRequest("/test1").addField("/name/SURNAME"));
        assertThat(resource.getId()).isEqualTo("test1");
        assertThat(resource.getRevision()).isEqualTo("12345");
        assertThat(resource.getContent().get("_id").asString()).isNull();
@@ -478,6 +605,7 @@
        final ResourceResponse resource1 = connection.update(
                context, newUpdateRequest("/test1", getTestUser1Updated(12345)));
        checkResourcesAreEqual(resource1, getTestUser1Updated(12345));
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, getTestUser1Updated(12345));
    }
@@ -487,14 +615,15 @@
        final List<Request> requests = new LinkedList<>();
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext(requests);
        final ResourceResponse resource1 = connection.update(context, newUpdateRequest("/test1", getTestUser1(12345)));
        final ResourceResponse resource1 =
            connection.update(context, newUpdateRequest("/test1", getTestUser1(12345)));
        // Check that no modify operation was sent
        // (only a single search should be sent in order to get the current resource).
        assertThat(requests).hasSize(1);
        assertThat(requests.get(0)).isInstanceOf(SearchRequest.class);
        checkResourcesAreEqual(resource1, getTestUser1(12345));
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, getTestUser1(12345));
    }
@@ -504,9 +633,13 @@
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext();
        final JsonValue newContent = getTestUser1Updated(12345);
        newContent.put("description", asList("one", "two"));
        final ResourceResponse resource1 = connection.update(context, newUpdateRequest("/test1", newContent));
        final ResourceResponse resource1 =
            connection.update(context, newUpdateRequest("/test1", newContent));
        checkResourcesAreEqual(resource1, newContent);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, newContent);
    }
@@ -515,6 +648,7 @@
    public void testUpdateConstantAttribute() throws Exception {
        final Connection connection = newConnection();
        final JsonValue newContent = getTestUser1Updated(12345);
        newContent.put("schemas", asList("junk"));
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", newContent));
    }
@@ -524,11 +658,15 @@
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext();
        final JsonValue newContent = getTestUser1Updated(12345);
        newContent.put("description", asList("one", "two"));
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", newContent));
        newContent.remove("description");
        final ResourceResponse resource1 = connection.update(context, newUpdateRequest("/test1", newContent));
        final ResourceResponse resource1 =
          connection.update(context, newUpdateRequest("/test1", newContent));
        checkResourcesAreEqual(resource1, newContent);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, newContent);
    }
@@ -537,6 +675,7 @@
    public void testUpdateMissingRequiredAttribute() throws Exception {
        final Connection connection = newConnection();
        final JsonValue newContent = getTestUser1Updated(12345);
        newContent.get("name").remove("surname");
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", newContent));
    }
@@ -546,11 +685,15 @@
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext();
        final JsonValue newContent = getTestUser1Updated(12345);
        newContent.put("description", asList("one", "two"));
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", newContent));
        newContent.put("description", asList("three"));
        final ResourceResponse resource1 = connection.update(context, newUpdateRequest("/test1", newContent));
        final ResourceResponse resource1 =
            connection.update(context, newUpdateRequest("/test1", newContent));
        checkResourcesAreEqual(resource1, newContent);
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, newContent);
    }
@@ -560,8 +703,11 @@
        final Connection connection = newConnection();
        final Context context = newAuthConnectionContext();
        final ResourceResponse resource1 =
                connection.update(context, newUpdateRequest("/test1", getTestUser1Updated(12345)).setRevision("12345"));
            connection.update(
                context,
                newUpdateRequest("/test1", getTestUser1Updated(12345)).setRevision("12345"));
        checkResourcesAreEqual(resource1, getTestUser1Updated(12345));
        final ResourceResponse resource2 = connection.read(context, newReadRequest("/test1"));
        checkResourcesAreEqual(resource2, getTestUser1Updated(12345));
    }
@@ -569,27 +715,36 @@
    @Test(expectedExceptions = PreconditionFailedException.class)
    public void testUpdateMVCCNoMatch() throws Exception {
        final Connection connection = newConnection();
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", getTestUser1Updated(12345))
                .setRevision("12346"));
        connection.update(
            newAuthConnectionContext(),
            newUpdateRequest("/test1", getTestUser1Updated(12345)).setRevision("12346"));
    }
    @Test(expectedExceptions = NotFoundException.class)
    public void testUpdateNotFound() throws Exception {
        final Connection connection = newConnection();
        connection.update(newAuthConnectionContext(), newUpdateRequest("/missing", getTestUser1Updated(12345)));
        connection.update(
            newAuthConnectionContext(),
            newUpdateRequest("/missing", getTestUser1Updated(12345)));
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testUpdateReadOnlyAttribute() throws Exception {
        final Connection connection = newConnection();
        // Etag is read-only.
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", getTestUser1Updated(99999)));
        connection.update(
            newAuthConnectionContext(),
            newUpdateRequest("/test1", getTestUser1Updated(99999)));
    }
    @Test(expectedExceptions = BadRequestException.class)
    public void testUpdateSingleValuedAttributeWithMultipleValues() throws Exception {
        final Connection connection = newConnection();
        final JsonValue newContent = getTestUser1Updated(12345);
        newContent.put("surname", asList("black", "white"));
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", newContent));
    }
@@ -598,6 +753,7 @@
    public void testUpdateUnknownAttribute() throws Exception {
        final Connection connection = newConnection();
        final JsonValue newContent = getTestUser1Updated(12345);
        newContent.add("dummy", "junk");
        connection.update(newAuthConnectionContext(), newUpdateRequest("/test1", newContent));
    }
@@ -607,26 +763,40 @@
    }
    private Rest2Ldap usersApi() throws IOException {
        return rest2Ldap(defaultOptions(),
                         resource("api").subResource(collectionOf("user").dnTemplate("dc=test")
                                                                         .useClientDnNaming("uid")),
        return rest2Ldap(
            defaultOptions(),
            resource("api").subResource(
                collectionOf("user").dnTemplate("dc=test").useClientDnNaming("uid")),
                         resource("user").objectClasses("top", "person")
                                         .property("schemas", constant(asList("urn:scim:schemas:core:1.0")))
                                         .property("_id", simple("uid").isRequired(true).writability(CREATE_ONLY))
                                         .property("name", object().property("displayName",
                                                                             simple("cn").isRequired(true))
                    .property(
                        "schemas",
                        constant(asList("urn:scim:schemas:core:1.0")))
                    .property(
                        "_id",
                        simple("uid").isRequired(true).writability(CREATE_ONLY))
                    .property(
                        "name",
                        object()
                          .property("displayName", simple("cn").isRequired(true))
                                                                   .property("surname", simple("sn").isRequired(true)))
                                         .property("_rev", simple("etag").isRequired(true).writability(READ_ONLY))
                                         .property("description", simple("description").isMultiValued(true))
                                         .property("singleNumber",
                    .property(
                        "_rev",
                        simple("etag").isRequired(true).writability(READ_ONLY))
                    .property(
                        "description",
                        simple("description").isMultiValued(true))
                    .property(
                        "singleNumber",
                                                   simple("singleNumber").decoder(byteStringToInteger()))
                                         .property("multiNumber",
                                                   simple("multiNumber").isMultiValued(true)
                                                                        .decoder(byteStringToInteger())));
                    .property(
                        "multiNumber",
                        simple("multiNumber").isMultiValued(true).decoder(byteStringToInteger()))
        );
    }
    private void checkResourcesAreEqual(final ResourceResponse actual, final JsonValue expected) {
        final ResourceResponse expectedResource = asResource(expected);
        assertThat(actual.getId()).isEqualTo(expectedResource.getId());
        assertThat(actual.getRevision()).isEqualTo(expectedResource.getRevision());
        assertThat(actual.getContent().getObject()).isEqualTo(expectedResource.getContent().getObject());