package hudson.plugins.tfs.commands; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.isA; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Change; import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.ChangeType; import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Changeset; import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Item; import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.ItemType; import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.RecursionType; import com.microsoft.tfs.core.clients.versioncontrol.specs.LabelSpec; import com.microsoft.tfs.core.clients.versioncontrol.specs.version.ChangesetVersionSpec; import com.microsoft.tfs.core.clients.versioncontrol.specs.version.DateVersionSpec; import com.microsoft.tfs.core.clients.versioncontrol.specs.version.LabelVersionSpec; import com.microsoft.tfs.core.clients.versioncontrol.specs.version.LatestVersionSpec; import com.microsoft.tfs.core.clients.versioncontrol.specs.version.VersionSpec; import hudson.model.User; import hudson.plugins.tfs.Util; import hudson.plugins.tfs.model.Server; import java.io.StringReader; import hudson.plugins.tfs.model.UserLookup; import hudson.remoting.Callable; import org.junit.Assert; import org.junit.Test; public class RemoteChangesetVersionCommandTest extends AbstractCallableCommandTest { private static final DateVersionSpec fixedPointInTime = new DateVersionSpec(Util.getCalendar(2013, 07, 02, 15, 40, 50, "UTC")); @Test public void assertLoggingWhenChangeset() throws Exception { final User user = mock(User.class); when(user.getId()).thenReturn("piedefer"); final UserLookup userLookup = mock(UserLookup.class); when(userLookup.find("piedefer")).thenReturn(user); final Item item = new Item(); item.setServerItem("Arithmetica.iTeX"); item.setItemType(ItemType.FILE); final Change serverChange = new Change(item, ChangeType.EDIT, null); final Changeset serverChangeset = new Changeset( new Change[]{serverChange}, "I have discovered a truly marvellous proof of this, which this margin is too narrow to contain.", null, null, "piedefer", "Pierre de Fermat", fixedPointInTime.getDate(), 1637, "piedefer", "Pierre de Fermat", null ); final Changeset[] serverChangesets = new Changeset[]{serverChangeset}; when(vcc.queryHistory( isA(String.class), isA(VersionSpec.class), anyInt(), isA(RecursionType.class), (String) isNull(), (VersionSpec) isNull(), (VersionSpec) isNull(), anyInt(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean())).thenReturn(serverChangesets); final RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(server, "$/RemotePath", LatestVersionSpec.INSTANCE) { @Override public Server createServer() { return server; } }; final Callable<Integer, Exception> callable = command.getCallable(); final Integer actual = callable.call(); Assert.assertNotNull(actual); Assert.assertEquals(1637, (int)actual); assertLog( "Querying for remote changeset at '$/RemotePath' as of 'T'...", "Query result is: Changeset #1637 by 'piedefer' on '2013-07-02T15:40:50Z'." ); } @Test public void assertLoggingWhenNoResult() throws Exception { when(vcc.queryHistory( isA(String.class), isA(VersionSpec.class), anyInt(), isA(RecursionType.class), (String) isNull(), (VersionSpec) isNull(), (VersionSpec) isNull(), anyInt(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean())).thenReturn(null); final RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(server, "$/RemotePath", LatestVersionSpec.INSTANCE) { @Override public Server createServer() { return server; } }; final Callable<Integer, Exception> callable = command.getCallable(); final Integer result = callable.call(); Assert.assertNull(result); assertLog( "Querying for remote changeset at '$/RemotePath' as of 'T'...", "Query returned no result!" ); } @Test public void assertNoChangesWithEmptyOutput() throws Exception { RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(mock(Server.class), "$/tfsandbox", fixedPointInTime); String changesetNumber = command.parse(new StringReader("")); assertEquals("Change set number was incorrect", "", changesetNumber); } @Test public void assertChangesWithEmptyToolOutput() throws Exception { RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(mock(Server.class), "$/tfsandbox", fixedPointInTime); StringReader reader = new StringReader("No history entries were found for the item and version combination specified.\n\n"); String changesetNumber = command.parse(reader); assertEquals("Change set number was incorrect", "", changesetNumber); } @Test public void assertChangesWithChangeOutput() throws Exception { StringReader reader = new StringReader( "Changeset User Date Comment\n" + "--------- -------------- -------------------- ----------------------------------------------------------------------------\n" + "\n" + "12495 SND\\redsolo_cp 2008-jun-27 13:21:25 changed and created one\n"); RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(mock(Server.class), "$/tfsandbox", fixedPointInTime); String changesetNumber = command.parse(reader); assertEquals("Change set number was incorrect", "12495", changesetNumber); } @Test public void assertChangesWithNoComment() throws Exception { StringReader reader = new StringReader( "Changeset User Date Comment\n" + "--------- -------------- -------------------- ----------------------------------------------------------------------------\n" + "\n" + "12495 SND\\redsolo_cp 2008-jun-27 13:21:25\n"); RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(mock(Server.class), "$/tfsandbox", fixedPointInTime); String changesetNumber = command.parse(reader); assertEquals("Change set number was incorrect", "12495", changesetNumber); } @Test public void assertChangesNoEmptyLine() throws Exception { StringReader reader = new StringReader( "Changeset User Date Comment\n" + "--------- -------------- -------------------- ----------------------------------------------------------------------------\n" + "12497 SND\\redsolo_cp 2008-jun-27 13:21:25\n"); RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(mock(Server.class), "$/tfsandbox", fixedPointInTime); String changesetNumber = command.parse(reader); assertEquals("Change set number was incorrect", "12497", changesetNumber); } @Test public void getVersionSpecificationWhenDateVersionSpec() { final String actual = RemoteChangesetVersionCommand.toString(fixedPointInTime); assertEquals("D2013-07-02T15:40:50Z", actual); } @Test public void getVersionSpecificationWhenChangesetVersionSpec() { final ChangesetVersionSpec versionSpec = new ChangesetVersionSpec(42); final String actual = RemoteChangesetVersionCommand.toString(versionSpec); assertEquals("C42", actual); } @Test public void getVersionSpecificationWhenLabelVersionSpecWithoutScope() { final LabelVersionSpec versionSpec = new LabelVersionSpec(new LabelSpec("Foo", null)); final String actual = RemoteChangesetVersionCommand.toString(versionSpec); assertEquals("LFoo", actual); } @Test public void getVersionSpecificationWhenLabelVersionSpecWithScope() { final LabelVersionSpec versionSpec = new LabelVersionSpec(new LabelSpec("Foo", "$/Bar")); final String actual = RemoteChangesetVersionCommand.toString(versionSpec); assertEquals("LFoo@$/Bar", actual); } @Override protected AbstractCallableCommand createCommand(final ServerConfigurationProvider serverConfig) { final ChangesetVersionSpec versionSpec = new ChangesetVersionSpec(42); final RemoteChangesetVersionCommand command = new RemoteChangesetVersionCommand(serverConfig, "$/remotePath", versionSpec); return command; } }