package org.jsondoc.springmvc.scanner;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import org.jsondoc.core.annotation.Api;
import org.jsondoc.core.annotation.ApiAuthNone;
import org.jsondoc.core.annotation.ApiBodyObject;
import org.jsondoc.core.annotation.ApiError;
import org.jsondoc.core.annotation.ApiErrors;
import org.jsondoc.core.annotation.ApiMethod;
import org.jsondoc.core.annotation.ApiPathParam;
import org.jsondoc.core.annotation.ApiQueryParam;
import org.jsondoc.core.annotation.ApiResponseObject;
import org.jsondoc.core.annotation.ApiVersion;
import org.jsondoc.core.pojo.ApiDoc;
import org.jsondoc.core.pojo.ApiHeaderDoc;
import org.jsondoc.core.pojo.ApiMethodDoc;
import org.jsondoc.core.pojo.ApiParamDoc;
import org.jsondoc.core.pojo.ApiVerb;
import org.jsondoc.core.pojo.JSONDoc.MethodDisplay;
import org.jsondoc.core.scanner.JSONDocScanner;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
public class JSONDocSpringJSONDocScannerTest {
private JSONDocScanner jsondocScanner = new Spring3JSONDocScanner();
@Api(description = "A spring controller", name = "Spring controller")
@RequestMapping(value = "/api", produces = { MediaType.APPLICATION_JSON_VALUE })
@ApiAuthNone
@ApiVersion(since = "1.0")
@ApiErrors(
apierrors = {
@ApiError(code = "100", description = "error-100")
}
)
private class SpringController {
@ApiMethod(description = "Gets a string", path = "/wrongOnPurpose", verb = ApiVerb.GET)
@RequestMapping(value = "/string/{name}", headers = "header=test", params = "delete", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.CREATED)
public @ApiResponseObject @ResponseBody String string(
@ApiPathParam(name = "name") @PathVariable(value = "test") String name,
@ApiQueryParam @RequestParam("id") Integer id,
@ApiQueryParam(name = "query", defaultvalue = "test") @RequestParam(value = "myquery") Long query,
@RequestBody @ApiBodyObject String requestBody) {
return "ok";
}
}
@Test
public void testMergeApiDoc() {
Set<Class<?>> controllers = new LinkedHashSet<Class<?>>();
controllers.add(SpringController.class);
Set<ApiDoc> apiDocs = jsondocScanner.getApiDocs(controllers, MethodDisplay.URI);
ApiDoc apiDoc = apiDocs.iterator().next();
Assert.assertEquals("A spring controller", apiDoc.getDescription());
Assert.assertEquals("Spring controller", apiDoc.getName());
for (ApiMethodDoc apiMethodDoc : apiDoc.getMethods()) {
if(apiMethodDoc.getPath().contains("/api/string/{name}")) {
Assert.assertNotNull(apiMethodDoc.getAuth());
Assert.assertNotNull(apiMethodDoc.getSupportedversions());
Assert.assertFalse(apiMethodDoc.getApierrors().isEmpty());
Assert.assertEquals("string", apiMethodDoc.getBodyobject().getJsondocType().getOneLineText());
Assert.assertEquals("string", apiMethodDoc.getResponse().getJsondocType().getOneLineText());
Assert.assertEquals("/api/string/{name}", apiMethodDoc.getPath().iterator().next());
Assert.assertEquals("POST", apiMethodDoc.getVerb().iterator().next().name());
Assert.assertEquals("application/json", apiMethodDoc.getProduces().iterator().next());
Assert.assertEquals("application/json", apiMethodDoc.getConsumes().iterator().next());
Assert.assertEquals("201 - Created", apiMethodDoc.getResponsestatuscode());
Set<ApiHeaderDoc> headers = apiMethodDoc.getHeaders();
ApiHeaderDoc header = headers.iterator().next();
Assert.assertEquals("header", header.getName());
Assert.assertEquals("test", header.getAllowedvalues()[0]);
Set<ApiParamDoc> queryparameters = apiMethodDoc.getQueryparameters();
Assert.assertEquals(3, queryparameters.size());
Iterator<ApiParamDoc> qpIterator = queryparameters.iterator();
ApiParamDoc apiParamDoc = qpIterator.next();
Assert.assertEquals("delete", apiParamDoc.getName());
Assert.assertEquals("true", apiParamDoc.getRequired());
Assert.assertEquals(null, apiParamDoc.getDefaultvalue());
Assert.assertEquals(0, apiParamDoc.getAllowedvalues().length);
apiParamDoc = qpIterator.next();
Assert.assertEquals("id", apiParamDoc.getName());
Assert.assertEquals("true", apiParamDoc.getRequired());
Assert.assertTrue(apiParamDoc.getDefaultvalue().isEmpty());
apiParamDoc = qpIterator.next();
Assert.assertEquals("myquery", apiParamDoc.getName());
Assert.assertEquals("true", apiParamDoc.getRequired());
Assert.assertEquals("", apiParamDoc.getDefaultvalue());
Set<ApiParamDoc> pathparameters = apiMethodDoc.getPathparameters();
Iterator<ApiParamDoc> ppIterator = pathparameters.iterator();
apiParamDoc = ppIterator.next();
apiParamDoc = apiMethodDoc.getPathparameters().iterator().next();
Assert.assertEquals("test", apiParamDoc.getName());
}
}
}
}