package org.rapidoid.http; /* * #%L * rapidoid-integration-tests * %% * Copyright (C) 2014 - 2017 Nikolche Mihajlovski and contributors * %% * Licensed 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. * #L% */ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.POST; import org.rapidoid.annotation.Since; import org.rapidoid.data.JSON; import org.rapidoid.setup.App; import org.rapidoid.setup.My; import org.rapidoid.setup.On; import org.rapidoid.u.U; @Authors("Nikolche Mihajlovski") @Since("5.1.0") public class CustomizationTest extends IsolatedIntegrationTest { @Test public void testSerializationConfig() { On.custom().jsonResponseRenderer((req, value, out) -> JSON.prettify(value, out)); On.get("/").json(() -> U.map("foo", 12, "bar", 345)); On.get("/a").json(() -> U.map("foo", 12, "bar", 345)); onlyGet("/"); On.custom().jsonResponseRenderer((req, value, out) -> JSON.stringify(value, out)); onlyGet("/a"); } @Test public void testAuthConfig() { On.custom().loginProvider((req, username, password) -> password.equals(username + "!")); On.custom().rolesProvider((req, username) -> username.equals("root") ? U.set("admin") : U.set()); // FIXME complete the test } @Test public void testBeanParamFactoryConfig() { App.beans(new Object() { @POST Object aa(Num num) { return num; } }); On.put("/bb").json((Num f) -> f); // before customization onlyPost("/aa?id=1", U.map("the-name", "one")); onlyPut("/bb?id=2", U.map("the-name", "two")); // customization ObjectMapper mapper = new ObjectMapper(); On.custom().beanParameterFactory((req, type, name, props) -> mapper.convertValue(req.posted(), type)); // after customization onlyPost("/aa?id=3", U.map("the-name", "three")); onlyPut("/bb?id=4", U.map("the-name", "four")); } static class Num { public long id = -1; @JsonProperty("the-name") public String name; } @Test public void customJsonBodyParser() { My.jsonRequestBodyParser((req, body) -> U.map("uri", req.uri(), "parsed", JSON.parse(body))); On.post("/abc").json(req -> req.data()); On.req(req -> req.posted()); postData("/abc?multipart", U.map("x", 13579, "foo", "bar")); postData("/abc2?multipart", U.map("x", 13579, "foo", "bar")); postJson("/abc?custom", U.map("x", 13579, "foo", "bar")); postJson("/abc2?custom", U.map("x", 13579, "foo", "bar")); } @Test public void customErrorHandlerByType() { My.error(NullPointerException.class).handler((req1, resp, e) -> "MY NPE"); My.error(RuntimeException.class).handler((req1, resp, e) -> e instanceof NotFound ? null : "MY RTE"); On.error(SecurityException.class).handler((req1, resp, e) -> "ON SEC"); My.error(SecurityException.class).handler((req1, resp, e) -> "MY SEC"); On.get("/err1").json(req -> { throw new NullPointerException(); }); On.post("/err2").json(req -> { throw new RuntimeException(); }); On.get("/err3").json(req -> { throw new SecurityException("INTENTIONAL - Access denied!"); }); On.get("/err4").json(req -> { throw new OutOfMemoryError("INTENTIONAL - Out of memory!"); }); onlyGet("/err1"); onlyPost("/err2"); onlyGet("/err3"); onlyGet("/err4"); } }