/** * 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.manifoldcf.crawler.connectors.nuxeo; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.manifoldcf.agents.interfaces.RepositoryDocument; import org.apache.manifoldcf.core.interfaces.Specification; import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector; import org.apache.manifoldcf.crawler.connectors.nuxeo.NuxeoRepositoryConnector; import org.apache.manifoldcf.crawler.connectors.nuxeo.model.DocumentManifold; import org.apache.manifoldcf.crawler.interfaces.IExistingVersions; import org.apache.manifoldcf.crawler.interfaces.IProcessActivity; import org.apache.manifoldcf.crawler.system.SeedingActivity; import org.junit.Before; import org.junit.Test; import org.junit.Ignore; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.nuxeo.client.api.NuxeoClient; import org.nuxeo.client.api.objects.Document; import org.nuxeo.client.api.objects.Documents; import org.nuxeo.client.api.objects.Repository; /** * @author David Arroyo Escobar <arroyoescobardavid@gmail.com> * */ @RunWith(MockitoJUnitRunner.class) public class NuxeoConnectorTest { @Mock public NuxeoClient client; public NuxeoRepositoryConnector repositoryConnector; @Before public void setup() throws Exception { repositoryConnector = new NuxeoRepositoryConnector(); repositoryConnector.setNuxeoClient(client); }; @Test @Ignore public void checkMockInjection() throws Exception { Document doc = mock(Document.class); Repository repository = mock(Repository.class); when(client.repository()).thenReturn(repository); when(client.repository().getDocumentRoot()).thenReturn(doc); assertEquals(repositoryConnector.check(), "Connection working"); } @Test public void mockSeeding() throws Exception { SeedingActivity activities = mock(SeedingActivity.class); Specification spec = new Specification(); Repository repository = mock(Repository.class); Document document = mock(Document.class); List<Document> documents = new ArrayList<>(); documents.add(document); documents.add(document); Documents docs = mock(Documents.class); long seedTime = 0; when(client.repository()).thenReturn(repository); when(client.repository().query(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(docs); when(docs.getIsNextPageAvailable()).thenReturn(false); when(docs.getDocuments()).thenReturn(documents); repositoryConnector.addSeedDocuments(activities, spec, "", seedTime, BaseRepositoryConnector.JOBMODE_CONTINUOUS); verify(activities, times(2)).addSeedDocument(anyString()); } @Test public void mockEmptySeeding() throws Exception { SeedingActivity activities = mock(SeedingActivity.class); Specification spec = new Specification(); Repository repository = mock(Repository.class); List<Document> documents = new ArrayList<>(); Documents docs = mock(Documents.class); long seedTime = 0; when(client.repository()).thenReturn(repository); when(client.repository().query(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(docs); when(docs.getIsNextPageAvailable()).thenReturn(false); when(docs.getDocuments()).thenReturn(documents); repositoryConnector.addSeedDocuments(activities, spec, "", seedTime, BaseRepositoryConnector.JOBMODE_CONTINUOUS); verify(activities, times(0)).addSeedDocument(anyString()); } @Test public void mockDeleteDocument() throws Exception { DocumentManifold docMa = mock(DocumentManifold.class); Repository repository = mock(Repository.class); Document doc = mock(Document.class); Specification spec = new Specification(); IProcessActivity activities = mock(IProcessActivity.class); IExistingVersions statuses = mock(IExistingVersions.class); when(client.repository()).thenReturn(repository); when(client.repository().fetchDocumentById(anyString())).thenReturn(doc); when(docMa.getDocument()).thenReturn(doc); when(doc.getState()).thenReturn("deleted"); repositoryConnector.processDocuments(new String[] { anyString() }, statuses, spec, activities, BaseRepositoryConnector.JOBMODE_CONTINUOUS, true); verify(activities, times(1)).deleteDocument(anyString()); } @Test @Ignore public void mockSimpleIngestion() throws Exception { Document doc = mock(Document.class); DocumentManifold docMa = mock(DocumentManifold.class); Date date = new Date(); DateFormat df = DateFormat.getDateTimeInstance(); String version = df.format(date); Long size = 0L; String id; String uri = "http://localhost:8080/nuxeo/site/api/v1/id/7995ff6d-1eda-41db-b9de-3ea4037fdb81"; Map<String, Object> metadata = new HashMap<String, Object>(); IProcessActivity activities = mock(IProcessActivity.class); IExistingVersions statuses = mock(IExistingVersions.class); Specification spec = new Specification(); Repository repository = mock(Repository.class); metadata.put("key", "value"); id = df.format(date); when(doc.get("lenght")).thenReturn(size); when(doc.getLastModified()).thenReturn(version); when(docMa.getMetadata()).thenReturn(metadata); when(doc.getUid()).thenReturn(uri); when(client.repository()).thenReturn(repository); when(client.repository().fetchDocumentById(anyString())).thenReturn(doc); when(activities.checkDocumentNeedsReindexing(anyString(), anyString())).thenReturn(true); when(statuses.getIndexedVersionString(id)).thenReturn(null); repositoryConnector.processDocuments(new String[] { id }, statuses, spec, activities, BaseRepositoryConnector.JOBMODE_CONTINUOUS, true); ArgumentCaptor<RepositoryDocument> ac = ArgumentCaptor.forClass(RepositoryDocument.class); verify(activities, times(1)).ingestDocumentWithException(eq(id), eq(df.format(date)), eq(uri), ac.capture()); verify(activities, times(1)).recordActivity(anyLong(), eq("read document"), eq(size), eq(id), eq("OK"), anyString(), Mockito.isNull(String[].class)); RepositoryDocument rd = ac.getValue(); Long rdSize = rd.getBinaryLength(); String[] keyValue = rd.getFieldAsStrings("uid"); assertEquals(size, rdSize); assertEquals(keyValue.length, 1); } @Test public void mockNotNeedReindexing() throws Exception { Document doc = mock(Document.class); Date date = new Date(); Repository repository = mock(Repository.class); DateFormat df = DateFormat.getDateTimeInstance(); String version = df.format(date); String uid = "297529bf-191a-4c87-8259-28b692394229"; IProcessActivity activities = mock(IProcessActivity.class); IExistingVersions statuses = mock(IExistingVersions.class); Specification spec = new Specification(); when(doc.getLastModified()).thenReturn(version); when(statuses.getIndexedVersionString(uid)).thenReturn(version); when(client.repository()).thenReturn(repository); when(client.repository().fetchDocumentById(anyString())).thenReturn(doc); repositoryConnector.processDocuments(new String[] { uid }, statuses, spec, activities, BaseRepositoryConnector.JOBMODE_CONTINUOUS, true); ArgumentCaptor<RepositoryDocument> ac = ArgumentCaptor.forClass(RepositoryDocument.class); verify(activities, times(1)).checkDocumentNeedsReindexing(uid, version); verify(activities, times(0)).ingestDocumentWithException(anyString(), anyString(), anyString(), ac.capture()); } }