blob: 686a52f4c1d2b8c1e80cdcfba7146b3d913e5662 [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.servicecomb.swagger.generator.core;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.nullValue;
import java.util.Arrays;
import java.util.Map;
import org.apache.servicecomb.swagger.generator.SwaggerConst;
import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils;
import org.apache.servicecomb.swagger.generator.core.model.SwaggerOperations;
import org.hamcrest.MatcherAssert;
import org.junit.AfterClass;
import org.junit.Test;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.Extension;
import io.swagger.annotations.ExtensionProperty;
import io.swagger.annotations.ResponseHeader;
import io.swagger.models.ArrayModel;
import io.swagger.models.Model;
import io.swagger.models.ModelImpl;
import io.swagger.models.Operation;
import io.swagger.models.Path;
import io.swagger.models.Response;
import io.swagger.models.Scheme;
import io.swagger.models.Swagger;
import org.junit.jupiter.api.Assertions;
public class TestApiOperation {
static SwaggerOperations swaggerOperations = SwaggerOperations.generate(ApiOperationAnnotation.class);
@AfterClass
public static void teardown() {
swaggerOperations = null;
}
interface ApiOperationAnnotation {
@ApiOperation(
value = "summary",
notes = "notes",
tags = {"tag1", "tag2"},
httpMethod = "GET",
nickname = "test",
produces = "application/json",
consumes = "application/json",
protocols = "http,https",
code = 202,
responseHeaders = {@ResponseHeader(name = "h1", response = int.class)},
extensions = {@Extension(
name = "x-tagA",
properties = {@ExtensionProperty(name = "x-tagAExt", value = "value of tagAExt")})})
void testBase();
@ApiOperation(value = "aaa", code = 202, response = String.class)
int testPrimitive();
@ApiOperation(value = "aaa", response = Integer.class, responseContainer = "Map")
int testMap();
@ApiOperation(value = "aaa", response = Integer.class, responseContainer = "List")
int testList();
@ApiOperation(value = "aaa", response = Integer.class, responseContainer = "Set")
int testSet();
@ApiOperation(value = "aaa", hidden = true)
int testHidden();
}
interface UnknownResponseContainer {
@ApiOperation(value = "aaa", response = Integer.class, responseContainer = "xxx")
int testUnknown();
}
@Test
public void testApiOperation() {
Swagger swagger = swaggerOperations.getSwagger();
testBase(swagger.getPath("/test"));
testPrimitive(swagger.getPath("/testPrimitive"));
testMap(swagger.getPath("/testMap"));
testList(swagger.getPath("/testList"));
testSet(swagger.getPath("/testSet"));
MatcherAssert.assertThat(swagger.getPath("/testHidden"), is(nullValue()));
}
@Test
public void testUnknown() {
UnitTestSwaggerUtils.testException(
"generate swagger operation failed, method=org.apache.servicecomb.swagger.generator.core.TestApiOperation$UnknownResponseContainer:testUnknown.",
"not support responseContainer xxx",
UnknownResponseContainer.class);
}
private void testSet(Path path) {
Operation operation = path.getPost();
Model result200 = operation.getResponses().get("200").getResponseSchema();
Assertions.assertEquals(ArrayModel.class, result200.getClass());
Assertions.assertEquals(true, ((ArrayModel) result200).getUniqueItems());
}
private void testList(Path path) {
Operation operation = path.getPost();
Model result200 = operation.getResponses().get("200").getResponseSchema();
Assertions.assertEquals(ArrayModel.class, result200.getClass());
Assertions.assertNull(((ArrayModel) result200).getUniqueItems());
}
private void testMap(Path path) {
Operation operation = path.getPost();
Model result200 = operation.getResponses().get("200").getResponseSchema();
Assertions.assertEquals(ModelImpl.class, result200.getClass());
Assertions.assertNotNull(((ModelImpl) result200).getAdditionalProperties());
}
private void testPrimitive(Path path) {
Operation operation = path.getPost();
Assertions.assertEquals(2, operation.getResponses().size());
ModelImpl result200 = (ModelImpl) operation.getResponses().get("200").getResponseSchema();
Assertions.assertEquals("integer", result200.getType());
Assertions.assertEquals("int32", result200.getFormat());
ModelImpl result202 = (ModelImpl) operation.getResponses().get("202").getResponseSchema();
Assertions.assertEquals("string", result202.getType());
Assertions.assertNull(result202.getFormat());
}
private void testBase(Path path) {
Assertions.assertEquals(1, path.getOperations().size());
Operation operation = path.getGet();
Assertions.assertEquals("summary", operation.getSummary());
Assertions.assertEquals("notes", operation.getDescription());
Assertions.assertEquals(Arrays.asList("tag1", "tag2"), operation.getTags());
Assertions.assertEquals(Arrays.asList("application/json"), operation.getProduces());
Assertions.assertEquals(Arrays.asList("application/json"), operation.getConsumes());
Assertions.assertEquals(Arrays.asList(Scheme.HTTP, Scheme.HTTPS), operation.getSchemes());
Map<String, Response> responseMap = operation.getResponses();
Assertions.assertEquals(2, responseMap.size());
Response response = responseMap.get(SwaggerConst.SUCCESS_KEY);
Assertions.assertNotNull(response);
Assertions.assertNull(response.getResponseSchema());
response = responseMap.get("202");
Assertions.assertNotNull(response);
Assertions.assertNull(response.getResponseSchema());
Assertions.assertEquals(1, response.getHeaders().size());
Assertions.assertEquals("integer", response.getHeaders().get("h1").getType());
}
}