package io.swagger.parser;
import io.swagger.models.*;
import io.swagger.models.auth.AuthorizationValue;
import io.swagger.models.parameters.BodyParameter;
import io.swagger.models.parameters.Parameter;
import io.swagger.models.parameters.PathParameter;
import io.swagger.models.parameters.QueryParameter;
import io.swagger.models.parameters.RefParameter;
import io.swagger.models.properties.*;
import io.swagger.parser.processors.DefinitionsProcessor;
import io.swagger.parser.processors.PathsProcessor;
import io.swagger.parser.util.SwaggerDeserializationResult;
import mockit.Injectable;
import mockit.Mocked;
import mockit.StrictExpectations;
import org.testng.annotations.Test;
import java.util.List;
import static org.testng.Assert.*;
public class SwaggerResolverTest {
private static final String REMOTE_REF_JSON = "http://petstore.swagger.io/v2/swagger.json#/definitions/Tag";
private static final String REMOTE_REF_YAML = "http://petstore.swagger.io/v2/swagger.yaml#/definitions/Tag";
@Test
public void testSwaggerResolver(@Injectable final Swagger swagger,
@Injectable final List<AuthorizationValue> auths,
@Mocked final ResolverCache cache,
@Mocked final DefinitionsProcessor definitionsProcessor,
@Mocked final PathsProcessor pathsProcessor) throws Exception {
new StrictExpectations() {{
new ResolverCache(swagger, auths, null);
result = cache;
times = 1;
new DefinitionsProcessor(cache, swagger);
result = definitionsProcessor;
times = 1;
new PathsProcessor(cache, swagger, withInstanceOf(SwaggerResolver.Settings.class));
result = pathsProcessor;
times = 1;
pathsProcessor.processPaths();
times = 1;
definitionsProcessor.processDefinitions();
times = 1;
}};
assertEquals(new SwaggerResolver(swagger, auths, null).resolve(), swagger);
}
@Test
public void testSwaggerResolver_NullSwagger() throws Exception {
assertNull(new SwaggerResolver(null, null, null).resolve());
}
private void testSimpleRemoteModelProperty(String remoteRef) {
final Swagger swagger = new Swagger();
swagger.addDefinition(
"Sample", new ModelImpl()
.property("remoteRef", new RefProperty(remoteRef)));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final Property prop = resolved.getDefinitions().get("Sample").getProperties().get("remoteRef");
assertTrue(prop instanceof RefProperty);
final RefProperty ref = (RefProperty) prop;
assertEquals(ref.get$ref(), "#/definitions/Tag");
assertNotNull(swagger.getDefinitions().get("Tag"));
}
@Test(description = "resolve a simple remote model property definition in json")
public void testJsonSimpleRemoteModelProperty() {
testSimpleRemoteModelProperty(REMOTE_REF_JSON);
}
@Test(description = "resolve a simple remote model property definition in yaml")
public void testYamlSimpleRemoteModelProperty() {
testSimpleRemoteModelProperty(REMOTE_REF_YAML);
}
private void testArrayRemoteModelProperty(String remoteRef) {
final Swagger swagger = new Swagger();
swagger.addDefinition(
"Sample", new ModelImpl()
.property("remoteRef", new ArrayProperty(new RefProperty(remoteRef))));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final Property prop = resolved.getDefinitions().get("Sample").getProperties().get("remoteRef");
assertTrue(prop instanceof ArrayProperty);
final ArrayProperty ap = (ArrayProperty) prop;
final RefProperty ref = (RefProperty) ap.getItems();
assertEquals(ref.get$ref(), "#/definitions/Tag");
assertNotNull(swagger.getDefinitions().get("Tag"));
}
@Test(description = "resolve an array remote model property definition in json")
public void testJsonArrayRemoteModelProperty() {
testArrayRemoteModelProperty(REMOTE_REF_JSON);
}
@Test(description = "resolve an array remote model property definition in yaml")
public void testYamlArrayRemoteModelProperty() {
testArrayRemoteModelProperty(REMOTE_REF_YAML);
}
private void testMapRemoteModelProperty(String remoteRef) {
final Swagger swagger = new Swagger();
swagger.addDefinition(
"Sample", new ModelImpl()
.property("remoteRef", new MapProperty(new RefProperty(remoteRef))));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final Property prop = resolved.getDefinitions().get("Sample").getProperties().get("remoteRef");
assertTrue(prop instanceof MapProperty);
final MapProperty ap = (MapProperty) prop;
final RefProperty ref = (RefProperty) ap.getAdditionalProperties();
assertEquals(ref.get$ref(), "#/definitions/Tag");
assertNotNull(swagger.getDefinitions().get("Tag"));
}
@Test(description = "resolve an map remote model property definition in json")
public void testJsonMapRemoteModelProperty() {
testMapRemoteModelProperty(REMOTE_REF_JSON);
}
@Test(description = "resolve an map remote model property definition in yaml")
public void testYamlMapRemoteModelProperty() {
testMapRemoteModelProperty(REMOTE_REF_YAML);
}
private void testOperationBodyparamRemoteRefs(String remoteRef) {
final Swagger swagger = new Swagger();
swagger.path("/fun", new Path()
.get(new Operation()
.parameter(new BodyParameter()
.schema(new RefModel(remoteRef)))));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final BodyParameter param = (BodyParameter) swagger.getPaths().get("/fun").getGet().getParameters().get(0);
final RefModel ref = (RefModel) param.getSchema();
assertEquals(ref.get$ref(), "#/definitions/Tag");
assertNotNull(swagger.getDefinitions().get("Tag"));
}
@Test(description = "resolve operation bodyparam remote refs in json")
public void testJsonOperationBodyparamRemoteRefs() {
testOperationBodyparamRemoteRefs(REMOTE_REF_JSON);
}
@Test(description = "resolve operation bodyparam remote refs in yaml")
public void testYamlOperationBodyparamRemoteRefs() {
testOperationBodyparamRemoteRefs(REMOTE_REF_YAML);
}
@Test(description = "resolve operation parameter remote refs")
public void testOperationParameterRemoteRefs() {
final Swagger swagger = new Swagger();
swagger.path("/fun", new Path()
.get(new Operation()
.parameter(new RefParameter("#/parameters/SampleParameter"))));
swagger.parameter("SampleParameter", new QueryParameter()
.name("skip")
.property(new IntegerProperty()));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final List<Parameter> params = swagger.getPaths().get("/fun").getGet().getParameters();
assertEquals(params.size(), 1);
final QueryParameter param = (QueryParameter) params.get(0);
assertEquals(param.getName(), "skip");
}
@org.junit.Test//(description = "resolve operation body parameter remote refs")
public void testOperationBodyParameterRemoteRefs() {
final ModelImpl schema = new ModelImpl();
final Swagger swagger = new Swagger();
swagger.path("/fun", new Path()
.get(new Operation()
.parameter(new RefParameter("#/parameters/SampleParameter"))));
swagger.path("/times", new Path()
.get(new Operation()
.parameter(new RefParameter("#/parameters/SampleParameter"))));
swagger.parameter("SampleParameter", new BodyParameter()
.name("skip")
.schema(schema));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final List<Parameter> params = swagger.getPaths().get("/fun").getGet().getParameters();
assertEquals(params.size(), 1);
final BodyParameter param = (BodyParameter) params.get(0);
assertEquals(param.getName(), "skip");
}
private void testResponseRemoteRefs(String remoteRef) {
final Swagger swagger = new Swagger();
swagger.path("/fun", new Path()
.get(new Operation()
.response(200, new Response()
.schema(new RefProperty(remoteRef)))));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final Response response = swagger.getPaths().get("/fun").getGet().getResponses().get("200");
final RefProperty ref = (RefProperty) response.getSchema();
assertEquals(ref.get$ref(), "#/definitions/Tag");
assertNotNull(swagger.getDefinitions().get("Tag"));
}
@Test(description = "resolve response remote refs in json")
public void testJsonResponseRemoteRefs() {
testResponseRemoteRefs(REMOTE_REF_JSON);
}
@Test(description = "resolve response remote refs in yaml")
public void testYamlResponseRemoteRefs() {
testResponseRemoteRefs(REMOTE_REF_YAML);
}
@Test(description = "resolve array response remote refs in yaml")
public void testYamlArrayResponseRemoteRefs() {
final Swagger swagger = new Swagger();
swagger.path("/fun", new Path()
.get(new Operation()
.response(200, new Response()
.schema(
new ArrayProperty(
new RefProperty(REMOTE_REF_YAML))))));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
final Response response = swagger.getPaths().get("/fun").getGet().getResponses().get("200");
final ArrayProperty array = (ArrayProperty) response.getSchema();
assertNotNull(array.getItems());
final RefProperty ref = (RefProperty) array.getItems();
assertEquals(ref.get$ref(), "#/definitions/Tag");
assertNotNull(swagger.getDefinitions().get("Tag"));
}
@Test(description = "resolve shared path parameters")
public void testSharedPathParametersTest() {
final Swagger swagger = new Swagger();
Operation operation = new Operation()
.response(200, new Response().description("ok!"));
Path path = new Path().get(operation);
path.addParameter(new QueryParameter()
.name("username")
.property(new StringProperty()));
swagger.path("/fun", path);
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
assertNull(resolved.getPaths().get("/fun").getParameters());
assertTrue(resolved.getPaths().get("/fun").getGet().getParameters().size() == 1);
}
@Test(description = "resolve top-level parameters")
public void testSharedSwaggerParametersTest() {
final Swagger swagger = new Swagger();
swagger.path("/fun", new Path()
.get(new Operation()
.parameter(new RefParameter("username"))
.response(200, new Response().description("ok!"))));
swagger.parameter("username", new QueryParameter()
.name("username")
.property(new StringProperty()));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
assertTrue(resolved.getParameters().size() == 1);
assertTrue(resolved.getPaths().get("/fun").getGet().getParameters().size() == 1);
}
@Test(description = "resolve top-level responses")
public void testSharedResponses() {
final Swagger swagger = new Swagger();
swagger.path("/fun", new Path()
.get(new Operation()
.parameter(new RefParameter("username"))
.response(200, new RefResponse("foo"))));
swagger.response("foo", new Response().description("ok!"));
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
Response response = resolved.getPath("/fun").getGet().getResponses().get("200");
assertTrue(response.getDescription().equals("ok!"));
assertTrue(response instanceof Response);
}
@Test
public void testIssue291() {
String json =
"{\n" +
" \"swagger\": \"2.0\",\n" +
" \"info\": {\n" +
" \"title\": \"test spec\",\n" +
" \"version\": \"1.0\"\n" +
" },\n" +
" \"parameters\": {\n" +
" \"testParam\": {\n" +
" \"collectionFormat\": \"csv\",\n" +
" \"name\": \"test\",\n" +
" \"in\": \"query\",\n" +
" \"type\": \"array\",\n" +
" \"items\": {\n" +
" \"type\": \"string\"\n" +
" }\n" +
" }\n" +
" },\n" +
" \"paths\": {\n" +
" \"/test\": {\n" +
" \"get\": {\n" +
" \"description\": \"test get\",\n" +
" \"parameters\": [\n" +
" {\n" +
" \"$ref\": \"#/parameters/testParam\"\n" +
" }\n" +
" ],\n" +
" \"responses\": {\n" +
" \"default\": {\n" +
" \"description\": \"test response\"\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
SwaggerParser parser = new SwaggerParser();
SwaggerDeserializationResult result = parser.readWithInfo(json);
Swagger swagger = result.getSwagger();
final Swagger resolved = new SwaggerResolver(swagger, null).resolve();
Parameter param = resolved.getPaths().get("/test").getGet().getParameters().get(0);
QueryParameter qp = (QueryParameter) param;
assertEquals(qp.getCollectionFormat(), "csv");
}
@Test
public void testSettingsAddParametersToEachOperationDisabled() {
String yaml =
"---\n" +
"swagger: '2.0'\n" +
"info:\n" +
" title: test spec\n" +
" version: '1.0'\n" +
"paths:\n" +
" \"/test/{id}\":\n" +
" parameters:\n" +
" - name: id\n" +
" in: path\n" +
" type: string\n" +
" required: true\n" +
" get:\n" +
" description: test get\n" +
" parameters:\n" +
" - name: page\n" +
" in: query\n" +
" type: string\n" +
" responses:\n" +
" default:\n" +
" description: test response\n";
SwaggerParser parser = new SwaggerParser();
SwaggerDeserializationResult result = parser.readWithInfo(yaml);
Swagger swagger = result.getSwagger();
final Swagger resolved = new SwaggerResolver(swagger, null, null,
new SwaggerResolver.Settings().addParametersToEachOperation(false))
.resolve();
assertEquals(resolved.getPaths().get("/test/{id}").getParameters().size(), 1);
PathParameter pp = (PathParameter)resolved.getPaths().get("/test/{id}").getParameters().get(0);
assertEquals(pp.getName(), "id");
assertEquals(resolved.getPaths().get("/test/{id}").getGet().getParameters().size(), 1);
QueryParameter qp = (QueryParameter)resolved.getPaths().get("/test/{id}").getGet().getParameters().get(0);
assertEquals(qp.getName(), "page");
}
}