/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed 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.kie.workbench.common.forms.editor.backend.indexing; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.enterprise.inject.Instance; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.forms.editor.backend.indexing.query.FindFormDefinitionIdsQuery; import org.kie.workbench.common.forms.editor.type.FormResourceTypeDefinition; import org.kie.workbench.common.forms.model.FormModel; import org.kie.workbench.common.forms.serialization.impl.FieldSerializer; import org.kie.workbench.common.forms.serialization.impl.FormDefinitionSerializerImpl; import org.kie.workbench.common.forms.serialization.impl.FormModelSerializer; import org.kie.workbench.common.services.refactoring.backend.server.BaseIndexingTest; import org.kie.workbench.common.services.refactoring.backend.server.TestIndexer; import org.kie.workbench.common.services.refactoring.backend.server.query.NamedQuery; import org.kie.workbench.common.services.refactoring.backend.server.query.response.DefaultResponseBuilder; import org.kie.workbench.common.services.refactoring.backend.server.query.response.ResponseBuilder; import org.kie.workbench.common.services.refactoring.backend.server.query.standard.FindAllChangeImpactQuery; import org.kie.workbench.common.services.refactoring.backend.server.query.standard.FindResourcesQuery; import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueIndexTerm; import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueResourceIndexTerm; import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRequest; import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRow; import org.kie.workbench.common.services.refactoring.service.ResourceType; import org.mockito.runners.MockitoJUnitRunner; import org.uberfire.java.nio.file.Path; import org.uberfire.paging.PageResponse; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class FormDefinitionIndexerTest extends BaseIndexingTest<FormResourceTypeDefinition> { private static final long WAIT_TIME_MILLIS = 2000; private static final int MAX_WAIT_TIMES = 8; private final static String[] FORMS = { "none.frm", "PersonFull.frm", "PersonShort.frm", "test.test-taskform.frm", "testTask-taskform.frm" }; private FormModelVisitorProvider provider; private FormModelVisitor visitor; private TestFormDefinitionIndexer indexer; @Override public void setup() throws IOException { visitor = mock(FormModelVisitor.class); provider = mock(FormModelVisitorProvider.class); when(provider.getModelType()).thenReturn(FormModel.class); when(provider.getVisitor()).thenReturn(visitor); Instance<FormModelVisitorProvider<?>> providersInstance = mock(Instance.class); List<FormModelVisitorProvider<?>> providers = Arrays.asList(provider); when(providersInstance.iterator()).thenReturn(providers.iterator()); indexer = new TestFormDefinitionIndexer(new FormResourceTypeDefinition(), new FormDefinitionSerializerImpl(new FieldSerializer(), new FormModelSerializer()), providersInstance); super.setup(); } @Test public void testFormsIndexing() throws Exception { List<Path> pathList = new ArrayList<>(); for (String formFile : FORMS) { Path path = basePath.resolve(formFile); pathList.add(path); String formContent = loadText(formFile); ioService().write(path, formContent); } Path[] paths = pathList.toArray(new Path[pathList.size()]); { PageResponse<RefactoringPageRow> response = null; try { for (int i = 0; i < MAX_WAIT_TIMES; i++) { Thread.sleep(WAIT_TIME_MILLIS); response = getFormResources(); if (response != null && response.getPageRowList() != null && response.getPageRowList().size() >= paths.length) { break; } } } catch (IllegalArgumentException e) { fail("Exception thrown: " + e.getMessage()); } assertNotNull(response); assertEquals(paths.length, response.getPageRowList().size()); } { final Set<ValueIndexTerm> queryTerms = new HashSet<ValueIndexTerm>() {{ add(new ValueResourceIndexTerm("*", ResourceType.FORM, ValueIndexTerm.TermSearchType.WILDCARD)); }}; try { List<RefactoringPageRow> response = service.query( FindFormDefinitionIdsQuery.NAME, queryTerms); assertNotNull(response); assertEquals(paths.length, response.size()); for (String expectedId : FORMS) { boolean foundId = false; for (RefactoringPageRow row : response) { Map<String, org.uberfire.backend.vfs.Path> mapRow = (Map<String, org.uberfire.backend.vfs.Path>) row.getValue(); for (String rKey : mapRow.keySet()) { assertTrue(Arrays.asList(FORMS).contains(rKey)); foundId = true; } } if (!foundId) { fail("FormDefinition with ID <" + expectedId + " not found in results for " + FindFormDefinitionIdsQuery.NAME); } } } catch (IllegalArgumentException e) { fail("Exception thrown: " + e.getMessage()); } } } private PageResponse<RefactoringPageRow> getFormResources() throws IllegalArgumentException { final RefactoringPageRequest request = new RefactoringPageRequest(FindResourcesQuery.NAME, new HashSet<ValueIndexTerm>() {{ add(new ValueResourceIndexTerm("*", ResourceType.FORM, ValueIndexTerm.TermSearchType.WILDCARD)); }}, 0, 10); return service.query(request); } protected Set<NamedQuery> getQueries() { return new HashSet<NamedQuery>() {{ add(new FindResourcesQuery() { @Override public ResponseBuilder getResponseBuilder() { return new DefaultResponseBuilder(ioService()); } }); add(new FindAllChangeImpactQuery() { @Override public ResponseBuilder getResponseBuilder() { return new DefaultResponseBuilder(ioService()); } }); add(new FindFormDefinitionIdsQuery() { @Override public ResponseBuilder getResponseBuilder() { return new FindFormDefinitionIdsQuery.FindFormDefinitionIdsResponseBuilder(ioService()); } }); }}; } @Override protected String getRepositoryName() { return this.getClass().getSimpleName(); } @Override protected TestIndexer<FormResourceTypeDefinition> getIndexer() { return indexer; } @Override protected FormResourceTypeDefinition getResourceTypeDefinition() { return new FormResourceTypeDefinition(); } }