/*
* 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.nifi.web.standard.api.processor;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;
import org.apache.nifi.web.ComponentDescriptor;
import org.apache.nifi.web.ComponentDetails;
import org.apache.nifi.web.NiFiWebConfigurationContext;
import org.apache.nifi.web.NiFiWebConfigurationRequestContext;
import org.apache.nifi.web.NiFiWebRequestContext;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.junit.Test;
import org.mockito.Mockito;
import com.bazaarvoice.jolt.JsonUtils;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.spi.container.servlet.WebComponent;
import com.sun.jersey.spi.inject.SingletonTypeInjectableProvider;
import com.sun.jersey.test.framework.AppDescriptor;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
import com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
public class TestProcessorResource extends JerseyTest {
public static final ServletContext servletContext = mock(ServletContext.class);
public static final HttpServletRequest requestContext = mock(HttpServletRequest.class);
@Override
protected AppDescriptor configure() {
return new WebAppDescriptor.Builder()
.initParam(WebComponent.RESOURCE_CONFIG_CLASS, ClassNamesResourceConfig.class.getName())
.initParam(ClassNamesResourceConfig.PROPERTY_CLASSNAMES,
ProcessorResource.class.getName() +
";" + TestProcessorResource.MockServletContext.class.getName() +
";" + TestProcessorResource.MockRequestContext.class.getName()+";")
.initParam("com.sun.jersey.api.json.POJOMappingFeature", "true")
.build();
}
@Override
public TestContainerFactory getTestContainerFactory() {
return new InMemoryTestContainerFactory();
}
@Test
public void testSetProperties() throws JSONException{
final NiFiWebConfigurationContext niFiWebConfigurationContext = mock(NiFiWebConfigurationContext.class);
final Map<String,String> properties = new HashMap<>();
properties.put("jolt-transform","jolt-transform-chain");
final ComponentDetails componentDetails = new ComponentDetails.Builder().properties(properties).build();
Mockito.when(servletContext.getAttribute(Mockito.anyString())).thenReturn(niFiWebConfigurationContext);
Mockito.when(niFiWebConfigurationContext.updateComponent(any(NiFiWebConfigurationRequestContext.class),any(String.class),any(Map.class))).thenReturn(componentDetails);
ClientResponse response = client().resource(getBaseURI()).path("/standard/processor/properties")
.queryParam("processorId","1")
.queryParam("clientId","1")
.queryParam("revisionId","1")
.type(MediaType.APPLICATION_JSON_TYPE)
.put(ClientResponse.class,JsonUtils.toJsonString(properties));
assertNotNull(response);
JSONObject jsonObject = response.getEntity(JSONObject.class);
assertNotNull(jsonObject);
assertTrue(jsonObject.getJSONObject("properties").get("jolt-transform").equals("jolt-transform-chain"));
}
@Test
public void testGetProcessorDetails() {
final NiFiWebConfigurationContext niFiWebConfigurationContext = mock(NiFiWebConfigurationContext.class);
final Map<String,String> allowableValues = new HashMap<>();
final ComponentDescriptor descriptor = new ComponentDescriptor.Builder().name("test-name").allowableValues(allowableValues).build();
final Map<String,ComponentDescriptor> descriptors = new HashMap<>();
descriptors.put("jolt-transform",descriptor);
final ComponentDetails componentDetails = new ComponentDetails.Builder().name("mytransform").type("org.apache.nifi.processors.standard.JoltTransformJSON")
.descriptors(descriptors)
.build();
Mockito.when(servletContext.getAttribute(Mockito.anyString())).thenReturn(niFiWebConfigurationContext);
Mockito.when(niFiWebConfigurationContext.getComponentDetails(any(NiFiWebRequestContext.class))).thenReturn(componentDetails);
JSONObject value = client().resource(getBaseURI()).path("/standard/processor/details").queryParam("processorId","1").get(JSONObject.class);
assertNotNull(value);
try{
assertTrue(value.get("name").equals("mytransform"));
} catch (Exception e){
fail("Failed due to: " + e.toString());
}
}
@Provider
public static class MockServletContext extends SingletonTypeInjectableProvider<Context, ServletContext> {
public MockServletContext(){
super(ServletContext.class, servletContext);
}
}
@Provider
public static class MockRequestContext extends SingletonTypeInjectableProvider<Context, HttpServletRequest> {
public MockRequestContext(){
super(HttpServletRequest.class, requestContext);
}
}
}