package com.tinkerpop.rexster.extension; import com.tinkerpop.rexster.Tokens; import org.codehaus.jettison.json.JSONObject; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Assert; import org.junit.Test; import java.lang.reflect.Method; public class ExtensionMethodTest { private Mockery mockery = new JUnit4Mockery(); @Test public void getExtensionApiAsJsonNullDescriptor() { ExtensionMethod method = new ExtensionMethod(null, null, null, null); JSONObject api = method.getExtensionApiAsJson(); Assert.assertNull(api); } @Test public void getExtensionApiAsJsonDescriptorOnlyNoApiElements() { this.mockery = new JUnit4Mockery(); final ExtensionDescriptor extensionDescriptor = this.mockery.mock(ExtensionDescriptor.class); this.mockery.checking(new Expectations() {{ allowing(extensionDescriptor).description(); will(returnValue("desc")); allowing(extensionDescriptor).api(); will(returnValue(new ExtensionApi[0])); allowing(extensionDescriptor).apiBehavior(); will(returnValue(ExtensionApiBehavior.EXTENSION_DESCRIPTOR_ONLY)); }}); ExtensionMethod extensionMethod = new ExtensionMethod(null, null, extensionDescriptor, null); JSONObject api = extensionMethod.getExtensionApiAsJson(); Assert.assertNotNull(api); Assert.assertTrue(api.has(Tokens.DESCRIPTION)); Assert.assertEquals("desc", api.opt(Tokens.DESCRIPTION)); Assert.assertFalse(api.has(Tokens.PARAMETERS)); } @Test public void getExtensionApiAsJsonParameterOnlyNoApiElements() { this.mockery = new JUnit4Mockery(); final ExtensionDescriptor extensionDescriptor = this.mockery.mock(ExtensionDescriptor.class); this.mockery.checking(new Expectations() {{ allowing(extensionDescriptor).description(); will(returnValue("desc")); allowing(extensionDescriptor).api(); will(returnValue(new ExtensionApi[0])); allowing(extensionDescriptor).apiBehavior(); will(returnValue(ExtensionApiBehavior.EXTENSION_PARAMETER_ONLY)); }}); // just need a method that doesn't have any annotations Method[] methods = ExtensionMethodTest.class.getMethods(); ExtensionMethod extensionMethod = new ExtensionMethod(methods[0], null, extensionDescriptor, null); JSONObject api = extensionMethod.getExtensionApiAsJson(); Assert.assertNotNull(api); Assert.assertTrue(api.has(Tokens.DESCRIPTION)); Assert.assertEquals("desc", api.opt(Tokens.DESCRIPTION)); Assert.assertFalse(api.has(Tokens.PARAMETERS)); } @Test public void getExtensionApiAsJsonDefaultNoApiElements() { this.mockery = new JUnit4Mockery(); final ExtensionDescriptor extensionDescriptor = this.mockery.mock(ExtensionDescriptor.class); this.mockery.checking(new Expectations() {{ allowing(extensionDescriptor).description(); will(returnValue("desc")); allowing(extensionDescriptor).api(); will(returnValue(new ExtensionApi[0])); allowing(extensionDescriptor).apiBehavior(); will(returnValue(ExtensionApiBehavior.DEFAULT)); }}); // just need a method that doesn't have any annotations Method[] methods = ExtensionMethodTest.class.getMethods(); ExtensionMethod extensionMethod = new ExtensionMethod(methods[0], null, extensionDescriptor, null); JSONObject api = extensionMethod.getExtensionApiAsJson(); Assert.assertNotNull(api); Assert.assertTrue(api.has(Tokens.DESCRIPTION)); Assert.assertEquals("desc", api.opt(Tokens.DESCRIPTION)); Assert.assertFalse(api.has(Tokens.PARAMETERS)); } @Test public void getExtensionApiAsJsonDescriptorOnlyHasApiElements() { this.mockery = new JUnit4Mockery(); final ExtensionDescriptor extensionDescriptor = this.mockery.mock(ExtensionDescriptor.class); final ExtensionApi extensionApi = this.mockery.mock(ExtensionApi.class); this.mockery.checking(new Expectations() {{ allowing(extensionDescriptor).description(); will(returnValue("desc")); allowing(extensionDescriptor).api(); will(returnValue(new ExtensionApi[]{extensionApi})); allowing(extensionDescriptor).apiBehavior(); will(returnValue(ExtensionApiBehavior.EXTENSION_DESCRIPTOR_ONLY)); allowing(extensionApi).parameterName(); will(returnValue("param1")); allowing(extensionApi).description(); will(returnValue("value1")); }}); ExtensionMethod extensionMethod = new ExtensionMethod(null, null, extensionDescriptor, null); JSONObject api = extensionMethod.getExtensionApiAsJson(); Assert.assertNotNull(api); Assert.assertTrue(api.has(Tokens.DESCRIPTION)); Assert.assertEquals("desc", api.opt(Tokens.DESCRIPTION)); Assert.assertTrue(api.has(Tokens.PARAMETERS)); JSONObject params = api.optJSONObject(Tokens.PARAMETERS); Assert.assertNotNull(params); Assert.assertTrue(params.has("param1")); Assert.assertEquals("value1", params.optString("param1")); } @Test public void getExtensionApiAsJsonParameterOnlyHasApiElements() { this.mockery = new JUnit4Mockery(); final ExtensionDescriptor extensionDescriptor = this.mockery.mock(ExtensionDescriptor.class); final ExtensionApi extensionApi = this.mockery.mock(ExtensionApi.class); this.mockery.checking(new Expectations() {{ allowing(extensionDescriptor).description(); will(returnValue("desc")); allowing(extensionDescriptor).api(); will(returnValue(new ExtensionApi[]{extensionApi})); allowing(extensionDescriptor).apiBehavior(); will(returnValue(ExtensionApiBehavior.EXTENSION_PARAMETER_ONLY)); }}); Method[] methods = MockMethodHelper.class.getDeclaredMethods(); ExtensionMethod extensionMethod = new ExtensionMethod(methods[0], null, extensionDescriptor, null); JSONObject api = extensionMethod.getExtensionApiAsJson(); Assert.assertNotNull(api); Assert.assertTrue(api.has(Tokens.DESCRIPTION)); Assert.assertEquals("desc", api.opt(Tokens.DESCRIPTION)); Assert.assertTrue(api.has(Tokens.PARAMETERS)); JSONObject params = api.optJSONObject(Tokens.PARAMETERS); Assert.assertNotNull(params); Assert.assertTrue(params.has("nme")); Assert.assertEquals("dsc", params.optString("nme")); } @Test public void getExtensionApiAsJsonDefaultHasApiElements() { this.mockery = new JUnit4Mockery(); final ExtensionDescriptor extensionDescriptor = this.mockery.mock(ExtensionDescriptor.class); final ExtensionApi extensionApi = this.mockery.mock(ExtensionApi.class); this.mockery.checking(new Expectations() {{ allowing(extensionDescriptor).description(); will(returnValue("desc")); allowing(extensionDescriptor).api(); will(returnValue(new ExtensionApi[]{extensionApi})); allowing(extensionDescriptor).apiBehavior(); will(returnValue(ExtensionApiBehavior.DEFAULT)); allowing(extensionApi).parameterName(); will(returnValue("param1")); allowing(extensionApi).description(); will(returnValue("value1")); }}); Method[] methods = MockMethodHelper.class.getDeclaredMethods(); ExtensionMethod extensionMethod = new ExtensionMethod(methods[0], null, extensionDescriptor, null); JSONObject api = extensionMethod.getExtensionApiAsJson(); Assert.assertNotNull(api); Assert.assertTrue(api.has(Tokens.DESCRIPTION)); Assert.assertEquals("desc", api.opt(Tokens.DESCRIPTION)); Assert.assertTrue(api.has(Tokens.PARAMETERS)); JSONObject params = api.optJSONObject(Tokens.PARAMETERS); Assert.assertNotNull(params); Assert.assertTrue(params.has("nme")); Assert.assertEquals("dsc", params.optString("nme")); Assert.assertNotNull(params); Assert.assertTrue(params.has("param1")); Assert.assertEquals("value1", params.optString("param1")); } private class MockMethodHelper { public void methodTest(@ExtensionRequestParameter(name = "nme", description = "dsc") String x) { } } }