tpalfy commented on a change in pull request #4123: NIFI-7188: Adding filter 
capabilities into search & prerequisite refactors
URL: https://github.com/apache/nifi/pull/4123#discussion_r393256923
 
 

 ##########
 File path: 
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerSearchServiceTest.java
 ##########
 @@ -19,537 +19,629 @@
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.RequestAction;
 import org.apache.nifi.authorization.user.NiFiUser;
+import org.apache.nifi.connectable.Connection;
+import org.apache.nifi.connectable.Funnel;
+import org.apache.nifi.connectable.Port;
 import org.apache.nifi.controller.FlowController;
 import org.apache.nifi.controller.ProcessorNode;
-import org.apache.nifi.controller.StandardProcessorNode;
 import org.apache.nifi.controller.flow.FlowManager;
 import org.apache.nifi.controller.label.Label;
 import org.apache.nifi.groups.ProcessGroup;
+import org.apache.nifi.groups.RemoteProcessGroup;
 import org.apache.nifi.parameter.Parameter;
 import org.apache.nifi.parameter.ParameterContext;
 import org.apache.nifi.parameter.ParameterContextManager;
 import org.apache.nifi.parameter.ParameterDescriptor;
-import org.apache.nifi.processor.Processor;
-import org.apache.nifi.registry.VariableRegistry;
-import org.apache.nifi.registry.flow.StandardVersionControlInformation;
-import org.apache.nifi.registry.flow.VersionControlInformation;
-import org.apache.nifi.registry.variable.MutableVariableRegistry;
+import org.apache.nifi.web.api.dto.search.ComponentSearchResultDTO;
 import org.apache.nifi.web.api.dto.search.SearchResultsDTO;
+import org.apache.nifi.web.search.ComponentMatcher;
+import org.apache.nifi.web.search.query.SearchQuery;
+import 
org.apache.nifi.web.search.resultenrichment.ComponentSearchResultEnricher;
+import 
org.apache.nifi.web.search.resultenrichment.ComponentSearchResultEnricherFactory;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.AdditionalMatchers;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.isNull;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-public class ControllerSearchServiceTest {
-    private MutableVariableRegistry variableRegistry;
-    private ControllerSearchService service;
-    private SearchResultsDTO searchResultsDTO;
+@RunWith(MockitoJUnitRunner.class)
+public class ControllerSearchServiceTest  {
+
+    public static final String PROCESS_GROUP_SECOND_LEVEL_A = "secondLevelA";
+    public static final String PROCESS_GROUP_SECOND_LEVEL_B_1 = 
"secondLevelB1";
+    public static final String PROCESS_GROUP_SECOND_LEVEL_B_2 = 
"secondLevelB2";
+    public static final String PROCESS_GROUP_FIRST_LEVEL_A = "firstLevelA";
+    public static final String PROCESS_GROUP_FIRST_LEVEL_B = "firstLevelB";
+    public static final String PROCESS_GROUP_ROOT = "root";
+
+    @Mock
+    private SearchQuery searchQuery;
+
+    @Mock
+    private NiFiUser user;
+
+    @Mock
+    private Authorizer authorizer;
+
+    @Mock
+    private ComponentSearchResultEnricherFactory resultEnricherFactory;
+
+    @Mock
+    private ComponentSearchResultEnricher resultEnricher;
+
+    @Mock
     private FlowController flowController;
+
+    @Mock
+    private FlowManager flowManager;
+
+    @Mock
     private ParameterContextManager parameterContextManager;
 
+    @Mock
+    private ComponentMatcher<ProcessorNode> matcherForProcessor;
+
+    @Mock
+    private ComponentMatcher<ProcessGroup> matcherForProcessGroup;
+
+    @Mock
+    private ComponentMatcher<Connection> matcherForConnection;
+
+    @Mock
+    private ComponentMatcher<RemoteProcessGroup> matcherForRemoteProcessGroup;
+
+    @Mock
+    private ComponentMatcher<Port> matcherForPort;
+
+    @Mock
+    private ComponentMatcher<Funnel> matcherForFunnel;
+
+    @Mock
+    private ComponentMatcher<ParameterContext> matcherForParameterContext;
+
+    @Mock
+    private ComponentMatcher<Parameter> matcherForParameter;
+
+    @Mock
+    private ComponentMatcher<Label> matcherForLabel;
+
+    private HashMap<String, ProcessGroup> processGroups;
+
+    private ControllerSearchService testSubject;
+
+    private SearchResultsDTO results;
+
     @Before
     public void setUp() {
-        variableRegistry = mock(MutableVariableRegistry.class);
-        service = new ControllerSearchService();
-        searchResultsDTO = new SearchResultsDTO();
-        flowController = mock(FlowController.class);
+        
Mockito.when(resultEnricherFactory.getComponentResultEnricher(Mockito.any(ProcessGroup.class),
 Mockito.any(NiFiUser.class))).thenReturn(resultEnricher);
+        
Mockito.when(resultEnricherFactory.getProcessGroupResultEnricher(Mockito.any(ProcessGroup.class),
 Mockito.any(NiFiUser.class))).thenReturn(resultEnricher);
+        
Mockito.when(resultEnricherFactory.getParameterResultEnricher(Mockito.any(ParameterContext.class))).thenReturn(resultEnricher);
+        
Mockito.when(resultEnricher.enrich(Mockito.any(ComponentSearchResultDTO.class))).thenAnswer(invocationOnMock
 -> invocationOnMock.getArgument(0));
+
+        
Mockito.when(matcherForProcessor.match(Mockito.any(ProcessorNode.class), 
Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        
Mockito.when(matcherForProcessGroup.match(Mockito.any(ProcessGroup.class), 
Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        Mockito.when(matcherForConnection.match(Mockito.any(Connection.class), 
Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        
Mockito.when(matcherForRemoteProcessGroup.match(Mockito.any(RemoteProcessGroup.class),
 Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        Mockito.when(matcherForPort.match(Mockito.any(Port.class), 
Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        Mockito.when(matcherForFunnel.match(Mockito.any(Funnel.class), 
Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        
Mockito.when(matcherForParameterContext.match(Mockito.any(ParameterContext.class),
 Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        Mockito.when(matcherForParameter.match(Mockito.any(Parameter.class), 
Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+        Mockito.when(matcherForLabel.match(Mockito.any(Label.class), 
Mockito.any(SearchQuery.class))).thenReturn(Optional.of(new 
ComponentSearchResultDTO()));
+
+        results = new SearchResultsDTO();
+        testSubject = givenTestSubject();
+    }
 
-        FlowManager mockFlowManager = mock(FlowManager.class);
-        parameterContextManager = mock(ParameterContextManager.class);
+    @Test
+    public void testSearchChecksEveryComponentType() {
+        // given
+        givenSingleProcessGroupIsSetUp();
+        givenSearchQueryIsSetUp();
+        givenNoFilters();
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenAllComponentTypeIsChecked();
+        thenAllComponentResultsAreCollected();
+    }
 
-        doReturn(mockFlowManager).when(flowController).getFlowManager();
-        
doReturn(parameterContextManager).when(mockFlowManager).getParameterContextManager();
-        service.setFlowController(flowController);
+    @Test
+    public void testSearchChecksChildrenGroupsToo() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenNoFilters();
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList(
+                PROCESS_GROUP_FIRST_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_A,
+                PROCESS_GROUP_FIRST_LEVEL_B,
+                PROCESS_GROUP_SECOND_LEVEL_B_1,
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
+        thenContentOfTheFollowingGroupsAreSearched(processGroups.keySet());
     }
 
     @Test
-    public void testSearchInRootLevelAllAuthorizedNoVersionControl() {
-        // root level PG
-        final ProcessGroup rootProcessGroup = setupMockedProcessGroup("root", 
null, true, variableRegistry, null);
-
-        // first level PGs
-        final ProcessGroup firstLevelAProcessGroup = 
setupMockedProcessGroup("firstLevelA", rootProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup firstLevelBProcessGroup = 
setupMockedProcessGroup("firstLevelB", rootProcessGroup, true, 
variableRegistry, null);
-
-        // second level PGs
-        final ProcessGroup secondLevelAProcessGroup = 
setupMockedProcessGroup("secondLevelA", firstLevelAProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup secondLevelBProcessGroup = 
setupMockedProcessGroup("secondLevelB", firstLevelBProcessGroup, true, 
variableRegistry, null);
-        // third level PGs
-        final ProcessGroup thirdLevelAProcessGroup = 
setupMockedProcessGroup("thirdLevelA", secondLevelAProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup thirdLevelBProcessGroup = 
setupMockedProcessGroup("thirdLevelB", secondLevelAProcessGroup, true, 
variableRegistry, null);
-
-        // link PGs together
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(firstLevelAProcessGroup);
-                add(firstLevelBProcessGroup);
-            }
-        }).when(rootProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelAProcessGroup);
-            }
-        }).when(firstLevelAProcessGroup).getProcessGroups();
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelBProcessGroup);
-            }
-        }).when(firstLevelBProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(thirdLevelAProcessGroup);
-                add(thirdLevelBProcessGroup);
-            }
-        }).when(secondLevelAProcessGroup).getProcessGroups();
-
-        // setup processor
-        setupMockedProcessor("foobar", rootProcessGroup, true, 
variableRegistry);
-
-        // perform search
-        service.search(searchResultsDTO, "foo", rootProcessGroup);
-
-        assertTrue(searchResultsDTO.getProcessorResults().size() == 1);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getId().equals("foobarId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getId().equals("rootId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getName().equals("root"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup() == 
null);
+    public void testSearchWhenGroupIsNotAuthorized() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenNoFilters();
+        givenProcessGroupIsNotAutorized(PROCESS_GROUP_FIRST_LEVEL_B);
+
+        // when
+        testSubject.search(searchQuery, results);
+        // The authorization is not transitive, children groups might be good 
candidates.
+        thenFollowingGroupsAreSearched(Arrays.asList(
+                PROCESS_GROUP_FIRST_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_B_1,
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
+        thenContentOfTheFollowingGroupsAreSearched(Arrays.asList(
+                PROCESS_GROUP_ROOT,
+                PROCESS_GROUP_FIRST_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_B_1,
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
     }
 
     @Test
-    public void testSearchInThirdLevelAllAuthorizedNoVersionControl() {
-        // root level PG
-        final ProcessGroup rootProcessGroup = setupMockedProcessGroup("root", 
null, true, variableRegistry, null);
-
-        // first level PGs
-        final ProcessGroup firstLevelAProcessGroup = 
setupMockedProcessGroup("firstLevelA", rootProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup firstLevelBProcessGroup = 
setupMockedProcessGroup("firstLevelB", rootProcessGroup, true, 
variableRegistry, null);
-
-        // second level PGs
-        final ProcessGroup secondLevelAProcessGroup = 
setupMockedProcessGroup("secondLevelA", firstLevelAProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup secondLevelBProcessGroup = 
setupMockedProcessGroup("secondLevelB", firstLevelBProcessGroup, true, 
variableRegistry, null);
-        // third level PGs
-        final ProcessGroup thirdLevelAProcessGroup = 
setupMockedProcessGroup("thirdLevelA", secondLevelAProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup thirdLevelBProcessGroup = 
setupMockedProcessGroup("thirdLevelB", secondLevelAProcessGroup, true, 
variableRegistry, null);
-
-        // link PGs together
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(firstLevelAProcessGroup);
-                add(firstLevelBProcessGroup);
-            }
-        }).when(rootProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelAProcessGroup);
-            }
-        }).when(firstLevelAProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelBProcessGroup);
-            }
-        }).when(firstLevelBProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(thirdLevelAProcessGroup);
-                add(thirdLevelBProcessGroup);
-            }
-        }).when(secondLevelAProcessGroup).getProcessGroups();
-
-        // setup processor
-        setupMockedProcessor("foobar", thirdLevelAProcessGroup, true, 
variableRegistry);
-
-        // perform search
-        service.search(searchResultsDTO, "foo", rootProcessGroup);
-
-        assertTrue(searchResultsDTO.getProcessorResults().size() == 1);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getId().equals("foobarId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getId().equals("thirdLevelAId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getName().equals("thirdLevelA"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup() == 
null);
+    public void testSearchWhenProcessNodeIsNotAuthorized() {
+        // given
+        givenSingleProcessGroupIsSetUp();
+        givenSearchQueryIsSetUp();
+        givenProcessorIsNotAuthorized();
+        givenNoFilters();
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenProcessorMatcherIsNotCalled();
     }
 
     @Test
-    public void testSearchInThirdLevelParentNotAuthorizedNoVersionControl() {
-        // root level PG
-        final ProcessGroup rootProcessGroup = setupMockedProcessGroup("root", 
null, true, variableRegistry, null);
-
-        // first level PGs
-        final ProcessGroup firstLevelAProcessGroup = 
setupMockedProcessGroup("firstLevelA", rootProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup firstLevelBProcessGroup = 
setupMockedProcessGroup("firstLevelB", rootProcessGroup, true, 
variableRegistry, null);
-
-        // second level PGs
-        final ProcessGroup secondLevelAProcessGroup = 
setupMockedProcessGroup("secondLevelA", firstLevelAProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup secondLevelBProcessGroup = 
setupMockedProcessGroup("secondLevelB", firstLevelBProcessGroup, true, 
variableRegistry, null);
-        // third level PGs - not authorized
-        final ProcessGroup thirdLevelAProcessGroup = 
setupMockedProcessGroup("thirdLevelA", secondLevelAProcessGroup, false, 
variableRegistry, null);
-        final ProcessGroup thirdLevelBProcessGroup = 
setupMockedProcessGroup("thirdLevelB", secondLevelAProcessGroup, false, 
variableRegistry, null);
-
-        // link PGs together
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(firstLevelAProcessGroup);
-                add(firstLevelBProcessGroup);
-            }
-        }).when(rootProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelAProcessGroup);
-            }
-        }).when(firstLevelAProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelBProcessGroup);
-            }
-        }).when(firstLevelBProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(thirdLevelAProcessGroup);
-                add(thirdLevelBProcessGroup);
-            }
-        }).when(secondLevelAProcessGroup).getProcessGroups();
-
-        // setup processor
-        setupMockedProcessor("foobar", thirdLevelAProcessGroup, true, 
variableRegistry);
-
-        // perform search
-        service.search(searchResultsDTO, "foo", rootProcessGroup);
-
-        assertTrue(searchResultsDTO.getProcessorResults().size() == 1);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getId().equals("foobarId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getId().equals("thirdLevelAId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getName()
 == null);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup() == 
null);
+    public void testSearchWithHereFilterShowsActualGroupAndSubgroupsOnly() {
+        // given
+        givenProcessGroupsAreSetUp();
+        
givenSearchQueryIsSetUp(processGroups.get(PROCESS_GROUP_FIRST_LEVEL_A));
+        givenScopeFilterIsSet();
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList(
+                PROCESS_GROUP_FIRST_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_A));
     }
 
     @Test
-    public void testSearchInThirdLevelParentNotAuthorizedWithVersionControl() {
-        // root level PG
-        final ProcessGroup rootProcessGroup = setupMockedProcessGroup("root", 
null, true, variableRegistry, null);
-
-        // first level PGs
-        final VersionControlInformation versionControlInformation = setupVC();
-        final ProcessGroup firstLevelAProcessGroup = 
setupMockedProcessGroup("firstLevelA", rootProcessGroup, true, 
variableRegistry, versionControlInformation);
-        final ProcessGroup firstLevelBProcessGroup = 
setupMockedProcessGroup("firstLevelB", rootProcessGroup, true, 
variableRegistry, null);
-
-        // second level PGs
-        final ProcessGroup secondLevelAProcessGroup = 
setupMockedProcessGroup("secondLevelA", firstLevelAProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup secondLevelBProcessGroup = 
setupMockedProcessGroup("secondLevelB", firstLevelBProcessGroup, true, 
variableRegistry, null);
-        // third level PGs - not authorized
-        final ProcessGroup thirdLevelAProcessGroup = 
setupMockedProcessGroup("thirdLevelA", secondLevelAProcessGroup, false, 
variableRegistry, null);
-        final ProcessGroup thirdLevelBProcessGroup = 
setupMockedProcessGroup("thirdLevelB", secondLevelAProcessGroup, false, 
variableRegistry, null);
-
-        // link PGs together
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(firstLevelAProcessGroup);
-                add(firstLevelBProcessGroup);
-            }
-        }).when(rootProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelAProcessGroup);
-            }
-        }).when(firstLevelAProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelBProcessGroup);
-            }
-        }).when(firstLevelBProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(thirdLevelAProcessGroup);
-                add(thirdLevelBProcessGroup);
-            }
-        }).when(secondLevelAProcessGroup).getProcessGroups();
-
-        // setup processor
-        setupMockedProcessor("foobar", thirdLevelAProcessGroup, true, 
variableRegistry);
-
-        // perform search
-        service.search(searchResultsDTO, "foo", rootProcessGroup);
-
-        assertTrue(searchResultsDTO.getProcessorResults().size() == 1);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getId().equals("foobarId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getId().equals("thirdLevelAId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getName()
 == null);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup() != 
null);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup().getId().equals("firstLevelAId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup().getName().equals("firstLevelA"));
+    public void testSearchWithHereFilterAndInRoot() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenScopeFilterIsSet();
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList(
+                PROCESS_GROUP_FIRST_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_A,
+                PROCESS_GROUP_FIRST_LEVEL_B,
+                PROCESS_GROUP_SECOND_LEVEL_B_1,
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
+        thenContentOfTheFollowingGroupsAreSearched(processGroups.keySet());
     }
 
+
     @Test
-    public void 
testSearchInThirdLevelParentNotAuthorizedWithVersionControlInTheGroup() {
-        // root level PG
-        final ProcessGroup rootProcessGroup = setupMockedProcessGroup("root", 
null, true, variableRegistry, null);
-
-        // first level PGs
-        final ProcessGroup firstLevelAProcessGroup = 
setupMockedProcessGroup("firstLevelA", rootProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup firstLevelBProcessGroup = 
setupMockedProcessGroup("firstLevelB", rootProcessGroup, true, 
variableRegistry, null);
-
-        // second level PGs
-        final ProcessGroup secondLevelAProcessGroup = 
setupMockedProcessGroup("secondLevelA", firstLevelAProcessGroup, true, 
variableRegistry, null);
-        final ProcessGroup secondLevelBProcessGroup = 
setupMockedProcessGroup("secondLevelB", firstLevelBProcessGroup, true, 
variableRegistry, null);
-        // third level PGs - not authorized
-        final VersionControlInformation versionControlInformation = setupVC();
-        final ProcessGroup thirdLevelAProcessGroup = 
setupMockedProcessGroup("thirdLevelA", secondLevelAProcessGroup, false, 
variableRegistry, versionControlInformation);
-        final ProcessGroup thirdLevelBProcessGroup = 
setupMockedProcessGroup("thirdLevelB", secondLevelAProcessGroup, false, 
variableRegistry, null);
-
-        // link PGs together
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(firstLevelAProcessGroup);
-                add(firstLevelBProcessGroup);
-            }
-        }).when(rootProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelAProcessGroup);
-            }
-        }).when(firstLevelAProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(secondLevelBProcessGroup);
-            }
-        }).when(firstLevelBProcessGroup).getProcessGroups();
-
-        Mockito.doReturn(new HashSet<ProcessGroup>() {
-            {
-                add(thirdLevelAProcessGroup);
-                add(thirdLevelBProcessGroup);
-            }
-        }).when(secondLevelAProcessGroup).getProcessGroups();
-
-        // setup processor
-        setupMockedProcessor("foobar", thirdLevelAProcessGroup, true, 
variableRegistry);
-
-        // perform search
-        service.search(searchResultsDTO, "foo", rootProcessGroup);
-
-        assertTrue(searchResultsDTO.getProcessorResults().size() == 1);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getId().equals("foobarId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getId().equals("thirdLevelAId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getParentGroup().getName()
 == null);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup() != 
null);
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup().getId().equals("thirdLevelAId"));
-        
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup().getName()
 == null);
+    public void testSearchWithGroupFilterShowsPointedGroupAndSubgroupsOnly() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenGroupFilterIsSet(PROCESS_GROUP_FIRST_LEVEL_B + "Name");
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList( //
+                PROCESS_GROUP_FIRST_LEVEL_B, //
+                PROCESS_GROUP_SECOND_LEVEL_B_1, //
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
     }
 
     @Test
-    public void testSearchParameterContext() {
-        final ParameterContext paramContext1 = 
setupMockedParameterContext("foo", "description for parameter context foo", 1, 
"foo_param", true);
-        final ParameterContext paramContext2 = 
setupMockedParameterContext("bar", "description for parameter context bar", 2, 
"bar_param", true);
-        final Set<ParameterContext> mockedParameterContexts = new 
HashSet<ParameterContext>();
-        mockedParameterContexts.add(paramContext1);
-        mockedParameterContexts.add(paramContext2);
+    public void testSearchGroupWithLowerCase() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenGroupFilterIsSet((PROCESS_GROUP_FIRST_LEVEL_B + 
"Name").toLowerCase());
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList( //
+                PROCESS_GROUP_FIRST_LEVEL_B, //
+                PROCESS_GROUP_SECOND_LEVEL_B_1, //
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
+    }
+
+    @Test
+    public void testSearchGroupWithPartialMatch() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenGroupFilterIsSet((PROCESS_GROUP_FIRST_LEVEL_B + "Na"));
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList( //
+                PROCESS_GROUP_FIRST_LEVEL_B, //
+                PROCESS_GROUP_SECOND_LEVEL_B_1, //
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
+    }
+
+    @Test
+    public void testSearchGroupBasedOnIdentifier() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenGroupFilterIsSet((PROCESS_GROUP_FIRST_LEVEL_B + "Id"));
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList( //
+                PROCESS_GROUP_FIRST_LEVEL_B, //
+                PROCESS_GROUP_SECOND_LEVEL_B_1, //
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
+    }
+
+    @Test
+    public void testSearchWithGroupWhenRoot() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenGroupFilterIsSet(PROCESS_GROUP_ROOT + "Name");
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList(
+                PROCESS_GROUP_FIRST_LEVEL_A,
+                PROCESS_GROUP_SECOND_LEVEL_A,
+                PROCESS_GROUP_FIRST_LEVEL_B,
+                PROCESS_GROUP_SECOND_LEVEL_B_1,
+                PROCESS_GROUP_SECOND_LEVEL_B_2));
+        thenContentOfTheFollowingGroupsAreSearched(processGroups.keySet());
+    }
 
-        
Mockito.doReturn(mockedParameterContexts).when(parameterContextManager).getParameterContexts();
+    @Test
+    public void testSearchWithGroupWhenValueIsNonExisting() {
+        // given
+        givenProcessGroupsAreSetUp();
+        givenSearchQueryIsSetUp();
+        givenGroupFilterIsSet("Unknown");
 
-        service.searchParameters(searchResultsDTO, "foo");
+        // when
+        testSubject.search(searchQuery, results);
 
-        assertEquals(1, searchResultsDTO.getParameterContextResults().size());
-        assertEquals("fooId", 
searchResultsDTO.getParameterContextResults().get(0).getId());
-        assertEquals("foo", 
searchResultsDTO.getParameterContextResults().get(0).getName());
-        // should have a match for the name, id, description
-        assertEquals(3, 
searchResultsDTO.getParameterContextResults().get(0).getMatches().size());
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList());
+    }
 
-        assertEquals(1, searchResultsDTO.getParameterResults().size());
+    @Test
+    public void testWhenBothFiltersPresentAndScopeIsMoreRestricting() {
+        // given
+        givenProcessGroupsAreSetUp();
+        
givenSearchQueryIsSetUp(processGroups.get(PROCESS_GROUP_SECOND_LEVEL_B_1));
+        givenScopeFilterIsSet();
+        givenGroupFilterIsSet(PROCESS_GROUP_FIRST_LEVEL_B + "Name");
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        
thenFollowingGroupsAreSearched(Arrays.asList(PROCESS_GROUP_SECOND_LEVEL_B_1));
+    }
 
-        assertEquals("fooId", 
searchResultsDTO.getParameterResults().get(0).getParentGroup().getId());
-        assertEquals("foo_param_0", 
searchResultsDTO.getParameterResults().get(0).getName());
-        // and the parameter name, parameter description, and the parameter 
value
-        assertEquals(3, 
searchResultsDTO.getParameterResults().get(0).getMatches().size());
+    @Test
+    public void testWhenBothFiltersPresentAndGroupIsMoreRestricting() {
+        // given
+        givenProcessGroupsAreSetUp();
+        
givenSearchQueryIsSetUp(processGroups.get(PROCESS_GROUP_FIRST_LEVEL_B));
+        givenScopeFilterIsSet();
+        givenGroupFilterIsSet(PROCESS_GROUP_SECOND_LEVEL_B_1 + "Name");
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        
thenFollowingGroupsAreSearched(Arrays.asList(PROCESS_GROUP_SECOND_LEVEL_B_1));
     }
 
     @Test
-    public void testSearchParameterContextNotAuthorized() {
-        final ParameterContext paramContext1 = 
setupMockedParameterContext("foo", "description for parameter context foo", 1, 
"foo_param", false);
-        final ParameterContext paramContext2 = 
setupMockedParameterContext("bar", "description for parameter context bar", 2, 
"bar_param", true);
-        final Set<ParameterContext> mockedParameterContexts = new 
HashSet<ParameterContext>();
-        mockedParameterContexts.add(paramContext1);
-        mockedParameterContexts.add(paramContext2);
+    public void testWhenBothFiltersPresentTheyAreNotOverlapping() {
+        // given
+        givenProcessGroupsAreSetUp();
+        
givenSearchQueryIsSetUp(processGroups.get(PROCESS_GROUP_FIRST_LEVEL_B));
+        givenScopeFilterIsSet();
+        givenGroupFilterIsSet(PROCESS_GROUP_FIRST_LEVEL_A + "Name");
+
+        // when
+        testSubject.search(searchQuery, results);
+
+        // then
+        thenFollowingGroupsAreSearched(Arrays.asList());
+    }
 
-        
Mockito.doReturn(mockedParameterContexts).when(parameterContextManager).getParameterContexts();
+    @Test
+    public void testSearchParameterContext() {
+        // given
+        givenSingleProcessGroupIsSetUp();
+        givenSearchQueryIsSetUp();
+        givenParameterSearchIsSetUp(true);
 
-        service.searchParameters(searchResultsDTO, "foo");
+        // when
+        testSubject.searchParameters(searchQuery, results);
 
-        // the matching parameter context is not readable by the user, so 
there should not be any results
-        assertEquals(0, searchResultsDTO.getParameterContextResults().size());
-        assertEquals(0, searchResultsDTO.getParameterResults().size());
+        // then
+        thenParameterComponentTypesAreChecked();
+        thenAllParameterComponentResultsAreCollected();
     }
 
     @Test
-    public void testSearchLabels() {
-        // root level PG
-        final ProcessGroup rootProcessGroup = setupMockedProcessGroup("root", 
null, true, variableRegistry, null);
-
-        // setup labels
-        setupMockedLabels(rootProcessGroup);
-
-        // perform search for foo
-        service.search(searchResultsDTO, "FOO", rootProcessGroup);
-
-        assertTrue(searchResultsDTO.getLabelResults().size() == 1);
-        
assertTrue(searchResultsDTO.getLabelResults().get(0).getId().equals("foo"));
-        
assertTrue(searchResultsDTO.getLabelResults().get(0).getName().equals("Value 
for label foo"));
-    }
-
-    /**
-     * Mocks Labels including isAuthorized() and their identifier and value
-     *
-     * @param containingProcessGroup The process group
-     */
-    private static void setupMockedLabels(final ProcessGroup 
containingProcessGroup) {
-        final Label label1 = mock(Label.class);
-        
Mockito.doReturn(true).when(label1).isAuthorized(AdditionalMatchers.or(any(Authorizer.class),
 isNull()), eq(RequestAction.READ),
-                AdditionalMatchers.or(any(NiFiUser.class), isNull()));
-        Mockito.doReturn("foo").when(label1).getIdentifier();
-        Mockito.doReturn("Value for label foo").when(label1).getValue();
-
-        final Label label2 = mock(Label.class);
-        
Mockito.doReturn(false).when(label2).isAuthorized(AdditionalMatchers.or(any(Authorizer.class),
 isNull()), eq(RequestAction.READ),
-                AdditionalMatchers.or(any(NiFiUser.class), isNull()));
-        Mockito.doReturn("bar").when(label2).getIdentifier();
-        Mockito.doReturn("Value for label bar, but FOO is in here 
too").when(label2).getValue();
-
-        // assign labels to the PG
-        Mockito.doReturn(new HashSet<Label>() {
-            {
-                add(label1);
-                add(label2);
-            }
-        }).when(containingProcessGroup).getLabels();
-    }
-
-    /**
-     * Sets up a mock Parameter Context including isAuthorized()
-     * @param name                     name of the parameter context
-     * @param description              description of the parameter context
-     * @param numberOfParams           number of parameters to include as part 
of this context
-     * @param parameterNamePrefix      a prefix for the parameter names
-     * @param authorizedToRead         whether or not the user can read the 
parameter context
-     * @return ParameterContext
-     */
-    private ParameterContext setupMockedParameterContext(String name, String 
description, int numberOfParams, String parameterNamePrefix, boolean 
authorizedToRead) {
-        final ParameterContext parameterContext = mock(ParameterContext.class);
-        Mockito.doReturn(name + "Id").when(parameterContext).getIdentifier();
-        Mockito.doReturn(name).when(parameterContext).getName();
-        Mockito.doReturn(description).when(parameterContext).getDescription();
-
-        
Mockito.doReturn(authorizedToRead).when(parameterContext).isAuthorized(AdditionalMatchers.or(any(Authorizer.class),
 isNull()), eq(RequestAction.READ),
-                AdditionalMatchers.or(any(NiFiUser.class), isNull()));
-
-        Map<ParameterDescriptor, Parameter> parameters = new HashMap<>();
-        for (int i = 0; i < numberOfParams; i++) {
-            final ParameterDescriptor descriptor = new 
ParameterDescriptor.Builder()
-                    .name(parameterNamePrefix + "_" + i)
-                    .description("Description for " + parameterNamePrefix + 
"_" + i)
-                    .sensitive(false)
-                    .build();
-
-            final Parameter param = new Parameter(descriptor, 
parameterNamePrefix + "_" + i + " value");
-            parameters.put(descriptor, param);
+    public void testSearchParameterContextWhenNotAuthorized() {
+        // given
+        givenSingleProcessGroupIsSetUp();
+        givenSearchQueryIsSetUp();
+        givenParameterSearchIsSetUp(false);
+
+        // when
+        testSubject.searchParameters(searchQuery, results);
+
+        // then
+        thenParameterSpecificComponentTypesAreNotChecked();
+    }
+
+    private ControllerSearchService givenTestSubject() {
+        final ControllerSearchService result = new ControllerSearchService();
+        result.setAuthorizer(authorizer);
+        result.setFlowController(flowController);
+        result.setMatcherForProcessor(matcherForProcessor);
+        result.setMatcherForProcessGroup(matcherForProcessGroup);
+        result.setMatcherForConnection(matcherForConnection);
+        result.setMatcherForRemoteProcessGroup(matcherForRemoteProcessGroup);
+        result.setMatcherForPort(matcherForPort);
+        result.setMatcherForFunnel(matcherForFunnel);
+        result.setMatcherForParameterContext(matcherForParameterContext);
+        result.setMatcherForParameter(matcherForParameter);
+        result.setMatcherForLabel(matcherForLabel);
+        result.setResultEnricherFactory(resultEnricherFactory);
+        return result;
+    }
+
+    private void givenSingleProcessGroupIsSetUp() {
+        final ProcessGroup root = givenProcessGroup(PROCESS_GROUP_ROOT, true, 
Collections.emptySet(), Collections.emptySet());
+        processGroups = new HashMap<>();
+        processGroups.put(PROCESS_GROUP_ROOT, root);
+
+        final ProcessorNode processorNode = Mockito.mock(ProcessorNode.class);
+        Mockito.when(processorNode.isAuthorized(authorizer, 
RequestAction.READ, user)).thenReturn(true);
+        
Mockito.when(root.getProcessors()).thenReturn(Collections.singletonList(processorNode));
+
+        final Connection connection = Mockito.mock(Connection.class);
+        Mockito.when(connection.isAuthorized(authorizer, RequestAction.READ, 
user)).thenReturn(true);
+        Mockito.when(root.getConnections()).thenReturn(new 
HashSet<>(Arrays.asList(connection)));
+
+        final RemoteProcessGroup remoteProcessGroup = 
Mockito.mock(RemoteProcessGroup.class);
+        Mockito.when(remoteProcessGroup.isAuthorized(authorizer, 
RequestAction.READ, user)).thenReturn(true);
+        Mockito.when(root.getRemoteProcessGroups()).thenReturn(new 
HashSet<>(Arrays.asList(remoteProcessGroup)));
+
+        final Port port = Mockito.mock(Port.class);
+        Mockito.when(port.isAuthorized(authorizer, RequestAction.READ, 
user)).thenReturn(true);
+        Mockito.when(root.getInputPorts()).thenReturn(new 
HashSet<>(Arrays.asList(port)));
+        Mockito.when(root.getOutputPorts()).thenReturn(new 
HashSet<>(Arrays.asList(port)));
+
+        final Funnel funnel = Mockito.mock(Funnel.class);
+        Mockito.when(funnel.isAuthorized(authorizer, RequestAction.READ, 
user)).thenReturn(true);
+        Mockito.when(root.getFunnels()).thenReturn(new 
HashSet<>(Arrays.asList(funnel)));
+
+        final Label label = Mockito.mock(Label.class);
+        Mockito.when(label.isAuthorized(authorizer, RequestAction.READ, 
user)).thenReturn(true);
+        Mockito.when(root.getLabels()).thenReturn(new 
HashSet<>(Arrays.asList(label)));
+    }
+
+    private void givenProcessGroupsAreSetUp() {
+        final ProcessGroup secondLevelAProcessGroup = 
givenProcessGroup(PROCESS_GROUP_SECOND_LEVEL_A, true, Collections.emptySet(), 
Collections.emptySet());
+        final ProcessGroup secondLevelB1ProcessGroup = 
givenProcessGroup(PROCESS_GROUP_SECOND_LEVEL_B_1, true, Collections.emptySet(), 
Collections.emptySet());
+        final ProcessGroup secondLevelB2ProcessGroup = 
givenProcessGroup(PROCESS_GROUP_SECOND_LEVEL_B_2, true, Collections.emptySet(), 
Collections.emptySet());
+
+        final ProcessGroup firstLevelAProcessGroup = 
givenProcessGroup(PROCESS_GROUP_FIRST_LEVEL_A, //
+                true, Collections.emptySet(), 
Collections.singleton(secondLevelAProcessGroup));
+        final ProcessGroup firstLevelBProcessGroup = 
givenProcessGroup(PROCESS_GROUP_FIRST_LEVEL_B, //
+                true, Collections.emptySet(), new 
HashSet<>(Arrays.asList(secondLevelB1ProcessGroup, secondLevelB2ProcessGroup)));
+
+        final ProcessGroup root =  givenProcessGroup(PROCESS_GROUP_ROOT, //
+                true, Collections.emptySet(), new 
HashSet<>(Arrays.asList(firstLevelAProcessGroup, firstLevelBProcessGroup)));
+
+        Mockito.when(firstLevelAProcessGroup.getParent()).thenReturn(root);
+        Mockito.when(firstLevelBProcessGroup.getParent()).thenReturn(root);
+        
Mockito.when(secondLevelAProcessGroup.getParent()).thenReturn(firstLevelAProcessGroup);
+        
Mockito.when(secondLevelB1ProcessGroup.getParent()).thenReturn(firstLevelBProcessGroup);
+        
Mockito.when(secondLevelB2ProcessGroup.getParent()).thenReturn(firstLevelBProcessGroup);
+
+        processGroups = new HashMap<>();
+        processGroups.put(PROCESS_GROUP_SECOND_LEVEL_A, 
secondLevelAProcessGroup);
+        processGroups.put(PROCESS_GROUP_SECOND_LEVEL_B_1, 
secondLevelB1ProcessGroup);
+        processGroups.put(PROCESS_GROUP_SECOND_LEVEL_B_2, 
secondLevelB2ProcessGroup);
+        processGroups.put(PROCESS_GROUP_FIRST_LEVEL_A, 
firstLevelAProcessGroup);
+        processGroups.put(PROCESS_GROUP_FIRST_LEVEL_B, 
firstLevelBProcessGroup);
+        processGroups.put(PROCESS_GROUP_ROOT, root);
+    }
+
+    private void givenSearchQueryIsSetUp() {
+        givenSearchQueryIsSetUp(processGroups.get(PROCESS_GROUP_ROOT));
+    }
+
+    private void givenSearchQueryIsSetUp(final ProcessGroup 
activeProcessGroup) {
+        Mockito.when(searchQuery.getUser()).thenReturn(user);
+        
Mockito.when(searchQuery.getRootGroup()).thenReturn(processGroups.get(PROCESS_GROUP_ROOT));
+        
Mockito.when(searchQuery.getActiveGroup()).thenReturn(activeProcessGroup);
+    }
+
+    private ProcessGroup givenProcessGroup( //
+            final String identifier, //
+            final boolean isAuthorized, //
+            final Set<ProcessorNode> processors, //
+            final Set<ProcessGroup> children) {
+        final ProcessGroup result = Mockito.mock(ProcessGroup.class);
+        Mockito.when(result.getName()).thenReturn(identifier + "Name");
+        Mockito.when(result.getIdentifier()).thenReturn(identifier + "Id");
+        Mockito.when(result.isAuthorized(authorizer, RequestAction.READ, 
user)).thenReturn(isAuthorized);
+
+        Mockito.when(result.getProcessGroups()).thenReturn(children);
+        Mockito.when(result.getProcessors()).thenReturn(processors);
+        
Mockito.when(result.getConnections()).thenReturn(Collections.emptySet());
+        
Mockito.when(result.getRemoteProcessGroups()).thenReturn(Collections.emptySet());
+        
Mockito.when(result.getInputPorts()).thenReturn(Collections.emptySet());
+        
Mockito.when(result.getOutputPorts()).thenReturn(Collections.emptySet());
+        Mockito.when(result.getFunnels()).thenReturn(Collections.emptySet());
+        Mockito.when(result.getLabels()).thenReturn(Collections.emptySet());
+        return result;
+    }
+
+    private void givenProcessGroupIsNotAutorized(final String 
processGroupName) {
+        
Mockito.when(processGroups.get(processGroupName).isAuthorized(authorizer, 
RequestAction.READ, user)).thenReturn(false);
+    }
+
+    private void givenNoFilters() {
+        
Mockito.when(searchQuery.hasFilter(Mockito.anyString())).thenReturn(false);
+    }
+
+    private void givenScopeFilterIsSet() {
+        Mockito.when(searchQuery.hasFilter("scope")).thenReturn(true);
+        Mockito.when(searchQuery.getFilter("scope")).thenReturn("here");
+    }
+
+    private void givenGroupFilterIsSet(final String group) {
+        Mockito.when(searchQuery.hasFilter("group")).thenReturn(true);
+        Mockito.when(searchQuery.getFilter("group")).thenReturn(group);
+    }
+
+    private void givenProcessorIsNotAuthorized() {
+        final ProcessorNode processor = 
processGroups.get(PROCESS_GROUP_ROOT).getProcessors().iterator().next();
+        Mockito.when(processor.isAuthorized(authorizer, RequestAction.READ, 
user)).thenReturn(false);
+    }
+
+    private void givenParameterSearchIsSetUp(boolean isAuthorized) {
+        final ParameterContext parameterContext = 
Mockito.mock(ParameterContext.class);
+        final Parameter parameter = Mockito.mock(Parameter.class);
+        final ParameterDescriptor descriptor = 
Mockito.mock(ParameterDescriptor.class);
+        final Map<ParameterDescriptor, Parameter> parameters = new HashMap<>();
+        parameters.put(descriptor, parameter);
+        Mockito.when(flowController.getFlowManager()).thenReturn(flowManager);
+        
Mockito.when(flowManager.getParameterContextManager()).thenReturn(parameterContextManager);
+        
Mockito.when(parameterContextManager.getParameterContexts()).thenReturn(new 
HashSet<>(Arrays.asList(parameterContext)));
+        Mockito.when(parameterContext.getParameters()).thenReturn(parameters);
+        Mockito.when(parameterContext.isAuthorized(authorizer, 
RequestAction.READ, user)).thenReturn(isAuthorized);
+    }
+
+    private void thenProcessorMatcherIsNotCalled() {
+        final ProcessorNode processor = 
processGroups.get(PROCESS_GROUP_ROOT).getProcessors().iterator().next();
+        Mockito.verify(matcherForProcessor, Mockito.never()).match(processor, 
searchQuery);
+    }
+
+    private void thenAllComponentTypeIsChecked() {
+//        Mockito.verify(matcherForProcessGroup, 
Mockito.times(1)).match(Mockito.any(ProcessGroup.class), 
Mockito.any(SearchQuery.class));
+        Mockito.verify(matcherForProcessor, 
Mockito.times(1)).match(Mockito.any(ProcessorNode.class), 
Mockito.any(SearchQuery.class));
+        Mockito.verify(matcherForConnection, 
Mockito.times(1)).match(Mockito.any(Connection.class), 
Mockito.any(SearchQuery.class));
+        Mockito.verify(matcherForRemoteProcessGroup, 
Mockito.times(1)).match(Mockito.any(RemoteProcessGroup.class), 
Mockito.any(SearchQuery.class));
+        // Port needs to be used multiple times as input and output ports are 
handled separately
+        Mockito.verify(matcherForPort, 
Mockito.times(2)).match(Mockito.any(Port.class), 
Mockito.any(SearchQuery.class));
+        Mockito.verify(matcherForFunnel, 
Mockito.times(1)).match(Mockito.any(Funnel.class), 
Mockito.any(SearchQuery.class));
+        Mockito.verify(matcherForLabel, 
Mockito.times(1)).match(Mockito.any(Label.class), 
Mockito.any(SearchQuery.class));
+    }
+
+    private void thenAllComponentResultsAreCollected() {
+//        Assert.assertEquals(1, results.getProcessGroupResults().size());
+        Assert.assertEquals(1, results.getProcessorResults().size());
+        Assert.assertEquals(1, results.getConnectionResults().size());
+        Assert.assertEquals(1, results.getRemoteProcessGroupResults().size());
+        Assert.assertEquals(1, results.getInputPortResults().size());
+        Assert.assertEquals(1, results.getOutputPortResults().size());
+        Assert.assertEquals(1, results.getFunnelResults().size());
+        Assert.assertEquals(1, results.getLabelResults().size());
+        Assert.assertTrue(results.getParameterContextResults().isEmpty());
+        Assert.assertTrue(results.getParameterResults().isEmpty());
+    }
+
+    private void thenParameterComponentTypesAreChecked() {
+        Mockito.verify(matcherForParameterContext, 
Mockito.times(1)).match(Mockito.any(ParameterContext.class), 
Mockito.any(SearchQuery.class));
+        Mockito.verify(matcherForParameter, 
Mockito.times(1)).match(Mockito.any(Parameter.class), 
Mockito.any(SearchQuery.class));
+    }
+
+    private void thenAllParameterComponentResultsAreCollected() {
+        Assert.assertTrue(results.getProcessGroupResults().isEmpty());
+        Assert.assertTrue(results.getProcessorResults().isEmpty());
+        Assert.assertTrue(results.getConnectionResults().isEmpty());
+        Assert.assertTrue(results.getRemoteProcessGroupResults().isEmpty());
+        Assert.assertTrue(results.getInputPortResults().isEmpty());
+        Assert.assertTrue(results.getOutputPortResults().isEmpty());
+        Assert.assertTrue(results.getFunnelResults().isEmpty());
+        Assert.assertTrue(results.getLabelResults().isEmpty());
+        Assert.assertEquals(1, results.getParameterContextResults().size());
+        Assert.assertEquals(1, results.getParameterResults().size());
+    }
+
+    private void thenParameterSpecificComponentTypesAreNotChecked() {
+        Mockito.verify(matcherForParameterContext, 
Mockito.never()).match(Mockito.any(ParameterContext.class), 
Mockito.any(SearchQuery.class));
+        Mockito.verify(matcherForParameter, 
Mockito.never()).match(Mockito.any(Parameter.class), 
Mockito.any(SearchQuery.class));
+    }
+
+    private void thenFollowingGroupsAreSearched(final Collection<String> 
searchedProcessGroups) {
+        for (final String processGroup : searchedProcessGroups) {
+            Mockito.verify(matcherForProcessGroup, 
Mockito.times(1)).match(processGroups.get(processGroup), searchQuery);
         }
 
-        Mockito.doReturn(parameters).when(parameterContext).getParameters();
-
-        return parameterContext;
-    }
-
-    /**
-     * Mocks Processor including isAuthorized() and its name & id.
-     *
-     * @param processorName          Desired processor name
-     * @param containingProcessGroup The process group
-     * @param authorizedToRead       Can the processor data be read?
-     * @param variableRegistry       The variable registry
-     */
-    private static void setupMockedProcessor(final String processorName, final 
ProcessGroup containingProcessGroup, boolean authorizedToRead, final 
MutableVariableRegistry variableRegistry) {
-        final String processorId = processorName + "Id";
-        final Processor processor1 = mock(Processor.class);
-
-        final ProcessorNode processorNode1 = mock(StandardProcessorNode.class);
-        
Mockito.doReturn(authorizedToRead).when(processorNode1).isAuthorized(AdditionalMatchers.or(any(Authorizer.class),
 isNull()), eq(RequestAction.READ),
-                AdditionalMatchers.or(any(NiFiUser.class), isNull()));
-        
Mockito.doReturn(variableRegistry).when(processorNode1).getVariableRegistry();
-        Mockito.doReturn(processor1).when(processorNode1).getProcessor();
-        // set processor node's attributes
-        Mockito.doReturn(processorId).when(processorNode1).getIdentifier();
-        
Mockito.doReturn(Optional.ofNullable(null)).when(processorNode1).getVersionedComponentId();
 // not actually searching based on versioned component id
-        Mockito.doReturn(processorName).when(processorNode1).getName();
-
-        // assign processor node to its PG
-        Mockito.doReturn(new HashSet<ProcessorNode>() {
-            {
-                add(processorNode1);
-            }
-        }).when(containingProcessGroup).getProcessors();
-    }
-
-    /**
-     * Mocks ProcessGroup due to isAuthorized(). The final class 
StandardProcessGroup can't be used.
-     *
-     * @param processGroupName Desired process group name
-     * @param parent           The parent process group
-     * @param authorizedToRead Can the process group data be read?
-     * @param variableRegistry The variable registry
-     * @param versionControlInformation The version control information
-     * @return Mocked process group
-     */
-    private static ProcessGroup setupMockedProcessGroup(final String 
processGroupName, final ProcessGroup parent, boolean authorizedToRead, final 
VariableRegistry variableRegistry,
-                                                        final 
VersionControlInformation versionControlInformation) {
-        final String processGroupId = processGroupName + "Id";
-        final ProcessGroup processGroup = mock(ProcessGroup.class);
-
-        Mockito.doReturn(processGroupId).when(processGroup).getIdentifier();
-        
Mockito.doReturn(Optional.ofNullable(null)).when(processGroup).getVersionedComponentId();
 // not actually searching based on versioned component id
-        Mockito.doReturn(processGroupName).when(processGroup).getName();
-        Mockito.doReturn(parent).when(processGroup).getParent();
-        
Mockito.doReturn(versionControlInformation).when(processGroup).getVersionControlInformation();
-        
Mockito.doReturn(variableRegistry).when(processGroup).getVariableRegistry();
-        Mockito.doReturn(parent == null).when(processGroup).isRootGroup();
-        // override process group's access rights
-        
Mockito.doReturn(authorizedToRead).when(processGroup).isAuthorized(AdditionalMatchers.or(any(Authorizer.class),
 isNull()), eq(RequestAction.READ),
-                AdditionalMatchers.or(any(NiFiUser.class), isNull()));
-
-        return processGroup;
-    }
-
-    /**
-     * Creates a version control information using dummy attributes.
-     *
-     * @return Dummy version control information
-     */
-    private static VersionControlInformation setupVC() {
-        final StandardVersionControlInformation.Builder builder = new 
StandardVersionControlInformation.Builder();
-        
builder.registryId("regId").bucketId("bucId").flowId("flowId").version(1);
-
-        return builder.build();
-    }
-}
+        Mockito.verify(matcherForProcessGroup, 
Mockito.times(searchedProcessGroups.size())).match(Mockito.any(ProcessGroup.class),
 Mockito.any(SearchQuery.class));
+    }
+
+    private void thenContentOfTheFollowingGroupsAreSearched(final 
Collection<String> searchedProcessGroups) {
 
 Review comment:
   The parameter could be removed and replaced with a local variable:
   `final Collection<String> searchedProcessGroups = processGroups.keySet();`
   With that the name could be changed to `thenContentOfGroupsAreSearched`.
   
   However not even sure how this method proves that the groups are `searched`.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to