package io.swagger;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import io.swagger.converter.ModelConverters;
import io.swagger.matchers.SerializationMatchers;
import io.swagger.models.Contact;
import io.swagger.models.Error;
import io.swagger.models.Info;
import io.swagger.models.Model;
import io.swagger.models.Operation;
import io.swagger.models.Path;
import io.swagger.models.Person;
import io.swagger.models.RefModel;
import io.swagger.models.Response;
import io.swagger.models.Scheme;
import io.swagger.models.Swagger;
import io.swagger.models.auth.ApiKeyAuthDefinition;
import io.swagger.models.auth.In;
import io.swagger.models.parameters.BodyParameter;
import io.swagger.models.parameters.PathParameter;
import io.swagger.models.parameters.QueryParameter;
import io.swagger.models.parameters.RefParameter;
import io.swagger.models.properties.LongProperty;
import io.swagger.models.properties.RefProperty;
import io.swagger.models.properties.StringProperty;
import io.swagger.util.Json;
import io.swagger.util.OutputReplacer;
import io.swagger.util.ResourceUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.testng.annotations.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class SwaggerSerializerTest {
ObjectMapper m = Json.mapper();
@Test(description = "it should convert a spec")
public void convertSpec() throws IOException {
final Model personModel = ModelConverters.getInstance().read(Person.class).get("Person");
final Model errorModel = ModelConverters.getInstance().read(Error.class).get("Error");
final Info info = new Info()
.version("1.0.0")
.title("Swagger Petstore");
final Contact contact = new Contact()
.name("Swagger API Team")
.email("foo@bar.baz")
.url("http://swagger.io");
info.setContact(contact);
final Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "value");
info.setVendorExtension("x-test2", map);
info.setVendorExtension("x-test", "value");
final Swagger swagger = new Swagger()
.info(info)
.host("petstore.swagger.io")
.securityDefinition("api-key", new ApiKeyAuthDefinition("key", In.HEADER))
.scheme(Scheme.HTTP)
.consumes("application/json")
.produces("application/json")
.model("Person", personModel)
.model("Error", errorModel);
final Operation get = new Operation()
.produces("application/json")
.summary("finds pets in the system")
.description("a longer description")
.tag("Pet Operations")
.operationId("get pet by id")
.deprecated(true);
get.parameter(new QueryParameter()
.name("tags")
.description("tags to filter by")
.required(false)
.property(new StringProperty())
);
get.parameter(new PathParameter()
.name("petId")
.description("pet to fetch")
.property(new LongProperty())
);
final Response response = new Response()
.description("pets returned")
.schema(new RefProperty().asDefault("Person"))
.example("application/json", "fun!");
final Response errorResponse = new Response()
.description("error response")
.schema(new RefProperty().asDefault("Error"));
get.response(200, response)
.defaultResponse(errorResponse);
final Operation post = new Operation()
.summary("adds a new pet")
.description("you can add a new pet this way")
.tag("Pet Operations")
.operationId("add pet")
.defaultResponse(errorResponse)
.parameter(new BodyParameter()
.description("the pet to add")
.schema(new RefModel().asDefault("Person")));
swagger.path("/pets", new Path().get(get).post(post));
final String swaggerJson = Json.mapper().writeValueAsString(swagger);
final Swagger rebuilt = Json.mapper().readValue(swaggerJson, Swagger.class);
SerializationMatchers.assertEqualsToJson(rebuilt, swaggerJson);
}
@Test(description = "it should read the uber api")
public void readUberApi() throws IOException {
final String jsonString = ResourceUtils.loadClassResource(getClass(), "uber.json");
final Swagger swagger = Json.mapper().readValue(jsonString, Swagger.class);
assertNotNull(swagger);
}
@Test(description = "it should write a spec with parameter references")
public void writeSpecWithParameterReferences() throws IOException {
final Model personModel = ModelConverters.getInstance().read(Person.class).get("Person");
final Info info = new Info()
.version("1.0.0")
.title("Swagger Petstore");
final Contact contact = new Contact()
.name("Swagger API Team")
.email("foo@bar.baz")
.url("http://swagger.io");
info.setContact(contact);
final Swagger swagger = new Swagger()
.info(info)
.host("petstore.swagger.io")
.securityDefinition("api-key", new ApiKeyAuthDefinition("key", In.HEADER))
.scheme(Scheme.HTTP)
.consumes("application/json")
.produces("application/json")
.model("Person", personModel);
final QueryParameter parameter = new QueryParameter()
.name("id")
.description("a common get parameter")
.property(new LongProperty());
final Operation get = new Operation()
.produces("application/json")
.summary("finds pets in the system")
.description("a longer description")
.tag("Pet Operations")
.operationId("get pet by id")
.parameter(new RefParameter("foo"));
swagger.parameter("foo", parameter)
.path("/pets", new Path().get(get));
final String swaggerJson = Json.mapper().writeValueAsString(swagger);
final Swagger rebuilt = Json.mapper().readValue(swaggerJson, Swagger.class);
assertEquals(Json.pretty(swagger), Json.pretty(rebuilt));
}
@Test
public void prettyPrintTest() throws IOException {
final String json = ResourceUtils.loadClassResource(getClass(), "uber.json");
final Swagger swagger = Json.mapper().readValue(json, Swagger.class);
final String outputStream = OutputReplacer.OUT.run(new OutputReplacer.Function() {
@Override
public void run() {
Json.prettyPrint(swagger);
}
});
SerializationMatchers.assertEqualsToJson(swagger, outputStream);
}
@Test
public void exceptionsTest() throws IOException {
final String outputStream1 = OutputReplacer.ERROR.run(new OutputReplacer.Function() {
@Override
public void run() {
Json.pretty(new ThrowHelper());
}
});
assertTrue(outputStream1.contains(ThrowHelper.MESSAGE));
final String outputStream2 = OutputReplacer.ERROR.run(new OutputReplacer.Function() {
@Override
public void run() {
Json.prettyPrint(new ThrowHelper());
}
});
assertTrue(outputStream2.contains(ThrowHelper.MESSAGE));
}
static class ThrowHelper {
public static final String MESSAGE = "Test exception";
public String getValue() throws IOException {
throw new IOException(MESSAGE);
}
public void setValue(String value) {
}
}
}