/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.extension.internal.runtime.streaming;
import static java.util.Arrays.asList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.sameInstance;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.mule.runtime.api.connection.ConnectionHandler;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.core.api.DefaultMuleException;
import org.mule.runtime.extension.api.runtime.ConfigurationInstance;
import org.mule.runtime.extension.api.runtime.streaming.PagingProvider;
import org.mule.runtime.module.extension.internal.runtime.ExecutionContextAdapter;
import org.mule.runtime.module.extension.internal.runtime.connectivity.ExtensionConnectionSupplier;
import org.mule.tck.size.SmallTest;
import java.util.List;
import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.runners.MockitoJUnitRunner;
@SmallTest
@RunWith(MockitoJUnitRunner.class)
public class PagingProviderProducerTestCase {
private ExtensionConnectionSupplier extensionConnectionSupplier = mock(ExtensionConnectionSupplier.class);
private ExecutionContextAdapter executionContext = mock(ExecutionContextAdapter.class);
private PagingProvider<Object, String> delegate = mock(PagingProvider.class);
private ConfigurationInstance config = mock(ConfigurationInstance.class);
@InjectMocks
private PagingProviderProducer<String> producer = createProducer();
private PagingProviderProducer<String> createProducer() {
return new PagingProviderProducer<>(delegate, config, executionContext, extensionConnectionSupplier);
}
@Before
public void setUp() throws MuleException {
when(config.getValue()).thenReturn("config");
ConnectionHandler handler = mock(ConnectionHandler.class);
when(handler.getConnection()).thenReturn(new Object());
when(extensionConnectionSupplier.getConnection(executionContext)).thenReturn(handler);
}
@Test
public void produce() throws Exception {
List<String> page = asList("bleh");
when(delegate.getPage(anyObject())).thenReturn(page);
assertThat(page, sameInstance(producer.produce()));
}
@Test
public void produceWithDifferentConnections() throws Exception {
ConnectionHandler connectionHandler = mock(ConnectionHandler.class);
when(extensionConnectionSupplier.getConnection(any())).thenReturn(connectionHandler);
produce();
produce();
verify(connectionHandler, times(2)).getConnection();
verify(connectionHandler, times(2)).release();
}
@Test
public void produceWithStickyConnection() throws Exception {
when(delegate.useStickyConnections()).thenReturn(true);
producer = createProducer();
ConnectionHandler connectionHandler = mock(ConnectionHandler.class);
when(extensionConnectionSupplier.getConnection(any())).thenReturn(connectionHandler);
produce();
produce();
verify(connectionHandler, times(1)).getConnection();
verify(connectionHandler, never()).release();
producer.close();
verify(connectionHandler).release();
}
@Test
public void totalAvailable() {
final int total = 10;
when(delegate.getTotalResults(anyObject())).thenReturn(Optional.of(total));
assertThat(total, is(producer.getSize()));
}
@Test
public void closeQuietly() throws Exception {
producer.close();
verify(delegate).close();
}
@Test(expected = Exception.class)
public void closeNoisely() throws Exception {
doThrow(new DefaultMuleException(new Exception())).when(delegate).close();
producer.close();
}
}