Junit test for a service
Hi,
I have a script that cleanup the moved tags on assets and pages.
How to write junit test methods for this service implementation. I have a dropdown which has 2 values(assest(AS),pages(PG))
How to write JUNIT TEST Method
package com.yc-demo.aem.scripts.core.cleanupmovedtags;
import com.yc-demo.aem.ac_commons.core.assets.metadata.extraction.Stopwatches;
import com.yc-demo.aem.ac_commons.core.services.ResourceResolverService;
import com.yc-demo.aem.scripts.core.migration.MigrationResourceConsumer;
import com.yc-demo.aem.scripts.core.migration.MigrationRunnable;
import com.atlascopco.aem.scripts.core.propertymigration.ResourceConsumer;
import com.google.common.base.Stopwatch;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Component(immediate = true, service = CleanupMovedTagsService.class)
public class CleanupMovedTagsServiceImpl implements CleanupMovedTagsService {
private static final Logger LOGGER = LoggerFactory.getLogger(CleanupMovedTagsServiceImpl.class);
@Reference
private ResourceResolverService resourceResolverService;
@Override
public void cleanupAssets(final ResourceResolver resourceResolver, final CleanupMovedTagsValueMap valueMap, StringBuilder stringBuilder) {
stringBuilder.append("Handling path: ").append(valueMap.getPath()).append("\n\n");
CleanupAssetsResourceConsumer consumer = new CleanupAssetsResourceConsumer(valueMap, stringBuilder);
String filevalue = valueMap.getTypeOfResource();
String query="";
if("AS".equalsIgnoreCase(filevalue)){
query = String.format("SELECT * FROM [dam:Asset] AS s WHERE ISDESCENDANTNODE([%s])", valueMap.getPath());}
else if("PG".equalsIgnoreCase(filevalue)){
query = String.format("SELECT * FROM [cq:PageContent] AS s WHERE ISDESCENDANTNODE([%s])", valueMap.getPath());
}
LOGGER.info("Query: \n{}", query);
ResourceConsumer.resetCounter();
if (resourceResolverService == null) {
LOGGER.error("Could not instantiate ResourceResolver factory");
stringBuilder.append("Could not instantiate ResourceResolver factory");
return;
}
if(resourceResolver != null){
Session session = resourceResolver.adaptTo(Session.class);
if (session != null) {
Set<MigrationRunnable> runnableSet = buildRunnables(resourceResolver, consumer, query, session);
int maxThreads = valueMap.getNbThreads();
LOGGER.info("{} runnables created", runnableSet.size());
LOGGER.info("Max amount of threads assignable : {}", maxThreads);
LOGGER.info("Starting execution of runnables");
Stopwatch stopwatch = Stopwatches.getStartedStopwatch();
runRunnables(runnableSet, maxThreads, valueMap.getTimeout());
LOGGER.info("FINISHED - {} threads used for this script", runnableSet.size());
LOGGER.info("FINISHED - {} pages updated", ResourceConsumer.getCounter());
LOGGER.info("FINISHED - time lapsed : {}", Stopwatches.stopAndGetHoursMinutesSecondsRepresentation(stopwatch));
}
} else {
LOGGER.error("resourceResolver was null, not doing anything");
}
}
// suppress warnings for Thread.currentThread().interrupt()
@SuppressWarnings("CQRules:CWE-676")
private void runRunnables(Set<MigrationRunnable> runnableSet, int maxThreads, int timeout) {
ExecutorService executor = Executors.newFixedThreadPool(maxThreads);
try{
for(MigrationRunnable runnable : runnableSet){
executor.execute(runnable);
}
executor.shutdown();
if(!executor.awaitTermination(timeout, TimeUnit.MINUTES)){
executor.shutdownNow();
}
LOGGER.info("Finishing execution of runnables");
}catch(InterruptedException e){
executor.shutdownNow();
Thread.currentThread().interrupt();
LOGGER.error("Error occurred during thread execution", e);
}
finally {
if(!executor.isShutdown()){
executor.shutdown();
LOGGER.info("Executor shut down");
}
}
}
private Set<MigrationRunnable> buildRunnables(ResourceResolver resourceResolver, MigrationResourceConsumer consumer, String query, Session session) {
Set<MigrationRunnable> runnableSet = new HashSet<>();
QueryManager qm;
try {
qm = session.getWorkspace().getQueryManager();
if (qm != null) {
Query searchQuery = qm.createQuery(query, Query.JCR_SQL2);
NodeIterator it = searchQuery.execute().getNodes();
while (it.hasNext()) {
Node node = it.nextNode();
Resource resource = resourceResolver.getResource(node.getPath());
MigrationRunnable runnable = new MigrationRunnable(resource, consumer, resourceResolverService);
runnableSet.add(runnable);
}
}
} catch (RepositoryException e) {
LOGGER.error("Error occurred during query execution", e);
}
return runnableSet;
}
}