You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2017/03/30 08:03:43 UTC

svn commit: r1789444 - in /sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation: core/ impl/it/ impl/it/tests/ impl/it/tests/ValidationServiceIT.java impl/it/tests/ValidationTestSupport.java

Author: olli
Date: Thu Mar 30 08:03:42 2017
New Revision: 1789444

URL: http://svn.apache.org/viewvc?rev=1789444&view=rev
Log:
move integration tests to package impl

Added:
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java
Removed:
    sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/core/

Added: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java?rev=1789444&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java (added)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java Thu Mar 30 08:03:42 2017
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.validation.impl.it.tests;
+
+import java.io.IOException;
+
+import org.apache.http.entity.mime.MultipartEntity;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.sling.commons.json.JSONException;
+import org.apache.sling.commons.json.JSONObject;
+import org.apache.sling.servlets.post.SlingPostConstants;
+import org.apache.sling.testing.tools.http.RequestBuilder;
+import org.apache.sling.testing.tools.http.RequestExecutor;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * These tests leverage the {@link ValidationPostOperation} to validate the given request parameters.
+ * The according validation model enforces the properties "field1" matching regex=^\\\p{Upper}+$ and "field2" (having an arbitrary value).
+ *
+ */
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public class ValidationServiceIT extends ValidationTestSupport {
+
+    protected DefaultHttpClient defaultHttpClient;
+
+    protected RequestExecutor requestExecutor;
+
+    @Before
+    public void setup() throws IOException {
+        defaultHttpClient = new DefaultHttpClient();
+        requestExecutor = new RequestExecutor(defaultHttpClient);
+    }
+
+    @Test
+    public void testValidRequestModel1() throws IOException, JSONException {
+        final String url = String.format("http://localhost:%s", httpPort());
+        final RequestBuilder requestBuilder = new RequestBuilder(url);
+        MultipartEntity entity = new MultipartEntity();
+        entity.addPart("sling:resourceType", new StringBody("validation/test/resourceType1"));
+        entity.addPart("field1", new StringBody("HELLOWORLD"));
+        entity.addPart("field2", new StringBody("30.01.1988"));
+        entity.addPart(SlingPostConstants.RP_OPERATION, new StringBody("validation"));
+        RequestExecutor re = requestExecutor.execute(requestBuilder.buildPostRequest
+                ("/validation/testing/fakeFolder1/resource").withEntity(entity)).assertStatus(200);
+        String content = re.getContent();
+        JSONObject jsonResponse = new JSONObject(content);
+        assertTrue(jsonResponse.getBoolean("valid"));
+    }
+
+    @Test
+    public void testInvalidRequestModel1() throws IOException, JSONException {
+        MultipartEntity entity = new MultipartEntity();
+        entity.addPart("sling:resourceType", new StringBody("validation/test/resourceType1"));
+        entity.addPart("field1", new StringBody("Hello World"));
+        entity.addPart(SlingPostConstants.RP_OPERATION, new StringBody("validation"));
+        final String url = String.format("http://localhost:%s", httpPort());
+        RequestBuilder requestBuilder = new RequestBuilder(url);
+        RequestExecutor re = requestExecutor.execute(requestBuilder.buildPostRequest
+                ("/validation/testing/fakeFolder1/resource").withEntity(entity)).assertStatus(200);
+        String content = re.getContent();
+        JSONObject jsonResponse = new JSONObject(content);
+        assertFalse(jsonResponse.getBoolean("valid"));
+        JSONObject failure = jsonResponse.getJSONArray("failures").getJSONObject(0);
+        assertEquals("Property does not match the pattern \"^\\p{Upper}+$\".", failure.get("message"));
+        assertEquals("field1", failure.get("location"));
+        assertEquals(10, failure.get("severity"));
+        failure = jsonResponse.getJSONArray("failures").getJSONObject(1);
+        assertEquals("Missing required property with name \"field2\".", failure.get("message"));
+        assertEquals("", failure.get("location")); // location is empty as the property is not found (property name is part of the message rather)
+        assertEquals(0, failure.get("severity"));
+    }
+    
+    @Test
+    public void testPostProcessorWithInvalidModel() throws IOException, JSONException {
+        MultipartEntity entity = new MultipartEntity();
+        entity.addPart("sling:resourceType", new StringBody("validation/test/resourceType1"));
+        entity.addPart("field1", new StringBody("Hello World"));
+        final String url = String.format("http://localhost:%s", httpPort());
+        RequestBuilder requestBuilder = new RequestBuilder(url);
+        // test JSON response, because the HTML response overwrites the original exception (https://issues.apache.org/jira/browse/SLING-6703)
+        RequestExecutor re = requestExecutor.execute(requestBuilder.buildPostRequest
+                ("/content/validated/invalidresource").withEntity(entity).withHeader("Accept", "application/json").withCredentials("admin", "admin")).assertStatus(500);
+        String content = re.getContent();
+        JSONObject jsonResponse = new JSONObject(content);
+        JSONObject error = jsonResponse.getJSONObject("error");
+        assertEquals("org.apache.sling.validation.impl.postprocessor.InvalidResourcePostProcessorException", error.getString("class"));
+        assertEquals("Validation errors: field1 : Property does not match the pattern \"^\\p{Upper}+$\"., Missing required property with name \"field2\".", error.getString("message"));
+    }
+}

Added: sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java?rev=1789444&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java (added)
+++ sling/trunk/bundles/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java Thu Mar 30 08:03:42 2017
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.validation.impl.it.tests;
+
+import javax.inject.Inject;
+
+import org.apache.sling.api.servlets.ServletResolver;
+import org.apache.sling.auth.core.AuthenticationSupport;
+import org.apache.sling.engine.SlingRequestProcessor;
+import org.apache.sling.resource.presence.ResourcePresence;
+import org.apache.sling.testing.paxexam.TestSupport;
+import org.apache.sling.validation.ValidationService;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.util.Filter;
+import org.ops4j.pax.exam.util.PathUtils;
+
+import static org.apache.sling.testing.paxexam.SlingOptions.slingExtensionI18n;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingExtensionResourcePresence;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingInstallerProviderJcr;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingLaunchpadOakTar;
+import static org.ops4j.pax.exam.CoreOptions.composite;
+import static org.ops4j.pax.exam.CoreOptions.junitBundles;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
+
+public class ValidationTestSupport extends TestSupport {
+
+    @Inject
+    protected ServletResolver servletResolver;
+
+    @Inject
+    protected SlingRequestProcessor slingRequestProcessor;
+
+    @Inject
+    protected AuthenticationSupport authenticationSupport;
+
+    @Inject
+    protected ValidationService validationService;
+
+    @Inject
+    @Filter(value = "(path=/apps/sling/validation/models/model1)")
+    protected ResourcePresence models;
+
+    @Configuration
+    public Option[] configuration() {
+        return new Option[]{
+            baseConfiguration(),
+            launchpad(),
+            // Sling Validation
+            testBundle("bundle.filename"),
+            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.validation.api").versionAsInProject(),
+            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.validation.test-services").versionAsInProject(),
+            factoryConfiguration("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended")
+                .put("user.mapping", new String[]{
+                    "org.apache.sling.validation.core=sling-validation",
+                    "org.apache.sling.validation.test-services=sling-validation"
+                })
+                .asOption(),
+            // configure post processor
+            newConfiguration("org.apache.sling.validation.impl.postprocessor.ValidationPostProcessor")
+                .put("enabledForPathPrefix", new String[] {"/content/validated"})
+                .put("failForMissingValidationModels", Boolean.TRUE)
+                .asOption(),
+            // testing
+            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.testing.tools").versionAsInProject(),
+            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.hamcrest").versionAsInProject(),
+            factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
+                .put("path", "/apps/sling/validation/models/model1")
+                .asOption(),
+            junitBundles(),
+            logging()
+        };
+    }
+
+    protected Option launchpad() {
+        final int httpPort = findFreePort();
+        final String workingDirectory = workingDirectory();
+        return composite(
+            slingLaunchpadOakTar(workingDirectory, httpPort),
+            slingExtensionI18n(),
+            slingExtensionResourcePresence(),
+            slingInstallerProviderJcr(),
+            mavenBundle().groupId("org.apache.commons").artifactId("commons-collections4").versionAsInProject()
+        );
+    }
+
+    protected Option logging() {
+        final String filename = String.format("file:%s/src/test/resources/logback.xml", PathUtils.getBaseDir());
+        return composite(
+            systemProperty("logback.configurationFile").value(filename),
+            mavenBundle().groupId("org.slf4j").artifactId("slf4j-api").version("1.7.21"),
+            mavenBundle().groupId("org.slf4j").artifactId("jcl-over-slf4j").version("1.7.21"),
+            mavenBundle().groupId("ch.qos.logback").artifactId("logback-core").version("1.1.7"),
+            mavenBundle().groupId("ch.qos.logback").artifactId("logback-classic").version("1.1.7")
+        );
+    }
+
+}