blob: dcf1a3f08d4f62a5ce0a62ac187c6c7821586c64 [file] [log] [blame]
/*
* 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.livy.server
import java.nio.charset.StandardCharsets.UTF_8
import javax.servlet.http.HttpServletResponse._
import org.scalatra._
class JsonServletSpec extends BaseJsonServletSpec {
addServlet(new TestJsonServlet(), "/*")
describe("The JSON servlet") {
it("should serialize result of delete") {
jdelete[MethodReturn]("/delete") { result =>
assert(result.value === "delete")
}
}
it("should serialize result of get") {
jget[MethodReturn]("/get") { result =>
assert(result.value === "get")
}
}
it("should serialize an ActionResult's body") {
jpost[MethodReturn]("/post", MethodArg("post")) { result =>
assert(result.value === "post")
}
}
it("should wrap a raw result") {
jput[MethodReturn]("/put", MethodArg("put")) { result =>
assert(result.value === "put")
}
}
it("should bypass non-json results") {
jpatch[Unit]("/patch", MethodArg("patch"), expectedStatus = SC_NOT_FOUND) { _ =>
assert(response.body === "patch")
}
}
it("should translate JSON errors to BadRequest") {
post("/post", "abcde".getBytes(UTF_8), headers = defaultHeaders) {
assert(status === SC_BAD_REQUEST)
}
}
it("should translate bad param name to BadRequest") {
post("/post", """{"value1":"1"}""".getBytes(UTF_8), headers = defaultHeaders) {
assert(status === SC_BAD_REQUEST)
}
}
it("should translate type mismatch to BadRequest") {
post("/postlist", """{"listParam":"1"}""".getBytes(UTF_8), headers = defaultHeaders) {
assert(status === SC_BAD_REQUEST)
}
}
it("should respect user-installed error handlers") {
post("/error", headers = defaultHeaders) {
assert(status === SC_SERVICE_UNAVAILABLE)
assert(response.body === "error")
}
}
it("should handle empty return values") {
jget[MethodReturn]("/empty") { result =>
assert(result == null)
}
}
it("should send (error) response message as json") {
get("/responsemessage") {
assert(status === SC_NOT_FOUND)
assert(response.body === "{\"msg\":\"response message\"}" )
}
}
}
}
private case class MethodArg(value: String)
private case class MethodReturn(value: String)
private case class MethodReturnList(listParam: List[String] = List())
private class TestJsonServlet extends JsonServlet {
before() {
contentType = "application/json"
}
delete("/delete") {
Ok(MethodReturn("delete"))
}
get("/get") {
Ok(MethodReturn("get"))
}
jpost[MethodArg]("/post") { arg =>
Created(MethodReturn(arg.value))
}
jpost[MethodReturnList]("/postlist") { arg =>
Created()
}
jput[MethodArg]("/put") { arg =>
MethodReturn(arg.value)
}
jpatch[MethodArg]("/patch") { arg =>
contentType = "text/plain"
NotFound(arg.value)
}
get("/empty") {
()
}
post("/error") {
throw new IllegalStateException("error")
}
// Install an error handler to make sure the parent's still work.
error {
case e: IllegalStateException =>
contentType = "text/plain"
ServiceUnavailable(e.getMessage())
}
get("/responsemessage") {
NotFound(ResponseMessage("response message"))
}
}