package com.github.linsolas.casperjsrunner; import static com.github.linsolas.casperjsrunner.CasperJsVersionRetriever.retrieveVersion; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.verifyNoMoreInteractions; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @PrepareForTest({ Runtime.class, CasperJsVersionRetriever.class }) @RunWith(PowerMockRunner.class) public class CasperJsVersionRetrieverTest { @Mock private Runtime runtime; @Mock private Process process; @Mock private InputStream stream; @Before public void initializeMocks() { initMocks(this); mockStatic(Runtime.class); LogUtils.setLog(mock(Log.class), false); when(Runtime.getRuntime()).thenReturn(runtime); } @Test public void testRetrieveVersion() throws Exception { when(runtime.exec("casperjsRuntime --version")).thenReturn(process); when(process.getInputStream()).thenReturn(stream); when(stream.read(any(byte[].class), anyInt(), anyInt())).then(new Answer<Integer>() { private final ByteArrayInputStream innerStream = new ByteArrayInputStream( "1.2.3-qualifier".getBytes()); @Override public Integer answer(final InvocationOnMock invocation) throws Throwable { return innerStream.read((byte[]) invocation.getArguments()[0], (Integer) invocation.getArguments()[1], (Integer) invocation.getArguments()[2]); } }); assertEquals(new DefaultArtifactVersion("1.2.3-qualifier"), retrieveVersion("casperjsRuntime", false)); verify(stream).close(); } @Test(expected = MojoFailureException.class) public void testRetrieveVersionFacingExWhileRunningCasper() throws Exception { when(runtime.exec("casperjsRuntime --version")).thenThrow(new IOException()); try { retrieveVersion("casperjsRuntime", false); } finally { verifyNoMoreInteractions(stream); } } @Test(expected = MojoFailureException.class) public void testRetrieveVersionFacingExWhileParsingVersion() throws Exception { when(runtime.exec("casperjsRuntime --version")).thenReturn(process); when(process.getInputStream()).thenReturn(stream); when(stream.read(any(byte[].class), anyInt(), anyInt())).thenThrow(new IOException()); try { retrieveVersion("casperjsRuntime", false); } finally { verify(stream).close(); } } }