using System; using System.Collections.Generic; using System.IO; using Rhino.Mocks; using Rhino.Mocks.Constraints; using Sep.Git.Tfs.Commands; using Sep.Git.Tfs.Core; using Sep.Git.Tfs.Core.TfsInterop; using Sep.Git.Tfs.Test.TestHelpers; using StructureMap.AutoMocking; using Xunit; namespace Sep.Git.Tfs.Test.Commands { public class ShelveTest { private RhinoAutoMocker mocks; public ShelveTest() { mocks = new RhinoAutoMocker(); mocks.Inject(new StringWriter()); mocks.Get().Repository = mocks.Get(); } [Fact] public void ShouldFailWithLessThanOneParents() { mocks.Get().Repository = mocks.Get(); mocks.Get().Stub(x => x.GetLastParentTfsCommits("my-head")).Return(new TfsChangesetInfo[0]); Assert.NotEqual(GitTfsExitCodes.OK, mocks.ClassUnderTest.Run("don't care", "my-head")); } [Fact] public void ShouldFailWithMoreThanOneParents() { mocks.Get().Repository = mocks.Get(); var parentChangesets = new TfsChangesetInfo() {Remote = mocks.Get()}; mocks.Get().Stub(x => x.GetLastParentTfsCommits("my-head")) .Return(new[] {parentChangesets, parentChangesets}); Assert.NotEqual(GitTfsExitCodes.OK, mocks.ClassUnderTest.Run("don't care", "my-head")); } [Fact] public void ShouldFailWithMoreThanOneParentsWhenSpecifiedParentIsNotAParent() { var globals = mocks.Get(); globals.Repository = mocks.Get(); globals.UserSpecifiedRemoteId = "wrong-choice"; mocks.Get().Stub(x => x.GetLastParentTfsCommits("my-head")) .Return(new[] { ChangesetForRemote("ok-choice"), ChangesetForRemote("good-choice") }); Assert.NotEqual(GitTfsExitCodes.OK, mocks.ClassUnderTest.Run("don't care", "my-head")); } [Fact] public void ShouldSucceedWithMoreThanOneParentsWhenCorrectParentSpecified() { var globals = mocks.Get(); globals.Repository = mocks.Get(); globals.UserSpecifiedRemoteId = "good-choice"; mocks.Get().Stub(x => x.GetLastParentTfsCommits("my-head")) .Return(new[] { ChangesetForRemote("ok-choice"), ChangesetForRemote("good-choice") }); Assert.Equal(GitTfsExitCodes.OK, mocks.ClassUnderTest.Run("don't care", "my-head")); } [Fact] public void ShouldSucceedForOneArgument() { mocks.Get().Stub(x => x.ReadTfsRemote(null)).IgnoreArguments().Return(mocks.Get()); mocks.Get().Stub(x => x.GetLastParentTfsCommits(null)).IgnoreArguments() .Return(new[] {new TfsChangesetInfo {Remote = mocks.Get()}}); Assert.Equal(GitTfsExitCodes.OK, mocks.ClassUnderTest.Run("don't care")); } [Fact] public void ShouldAskForCorrectParent() { var remote = mocks.Get(); //mocks.Get().Stub(x => x.ReadTfsRemote(null)).IgnoreArguments().Return(remote); mocks.Get().Stub(x => x.GetLastParentTfsCommits("commit_to_shelve")) .Return(new[] { new TfsChangesetInfo { Remote = mocks.Get() } }); mocks.ClassUnderTest.Run("shelveset name", "commit_to_shelve"); } [Fact] public void ShouldTellRemoteToShelve() { var remote = mocks.Get(); //mocks.Get().Stub(x => x.ReadTfsRemote(null)).IgnoreArguments().Return(remote); mocks.Get().Stub(x => x.GetLastParentTfsCommits(null)).IgnoreArguments() .Return(new[] { new TfsChangesetInfo { Remote = mocks.Get() } }); mocks.ClassUnderTest.Run("shelveset name"); remote.AssertWasCalled(x => x.Shelve(null, null, null, false), y => y.Constraints(Is.Equal("shelveset name"), Is.Equal("HEAD"), Is.Anything(), Is.Anything())); } [Fact] public void ShouldTellRemoteToShelveTreeish() { mocks.Get().Repository = mocks.Get(); var remote = mocks.Get(); //mocks.Get().Stub(x => x.ReadTfsRemote(null)).IgnoreArguments().Return(remote); mocks.Get().Stub(x => x.GetLastParentTfsCommits(null)).IgnoreArguments() .Return(new[] {new TfsChangesetInfo {Remote = remote}}); mocks.ClassUnderTest.Run("shelveset name", "treeish"); remote.AssertWasCalled(x => x.Shelve(null, null, null, false), y => y.Constraints(Is.Equal("shelveset name"), Is.Equal("treeish"), Is.Anything(), Is.Anything())); } [Fact] public void FailureCodeWhenShelvesetExists() { WireUpMockRemote(); CreateShelveset("shelveset name"); var exitCode = mocks.ClassUnderTest.Run("shelveset name", "treeish"); Assert.Equal(GitTfsExitCodes.ForceRequired, exitCode); } [Fact] public void DoesNotTryToShelveIfShelvesetExists() { WireUpMockRemote(); CreateShelveset("shelveset name"); mocks.ClassUnderTest.Run("shelveset name", "treeish"); mocks.Get().AssertWasNotCalled( x => x.Shelve(Arg.Is.Anything, Arg.Is.Anything, Arg.Is.Anything, Arg.Is.Anything)); } [Fact] public void DoesNotStopIfForceIsSpecified() { mocks.Get().Force = true; WireUpMockRemote(); CreateShelveset("shelveset name"); mocks.ClassUnderTest.Run("shelveset name", "treeish"); mocks.Get().AssertWasCalled( x => x.Shelve(Arg.Is.Anything, Arg.Is.Anything, Arg.Is.Anything, Arg.Is.Anything)); } private TfsChangesetInfo ChangesetForRemote(string remoteId) { var mockRemote = mocks.AddAdditionalMockFor(); mockRemote.Stub(x => x.Id).Return(remoteId); return new TfsChangesetInfo() {Remote = mockRemote}; } private void WireUpMockRemote() { mocks.Get().Repository = mocks.Get(); var remote = mocks.Get(); mocks.Get().Stub(x => x.GetLastParentTfsCommits(null)).IgnoreArguments() .Return(new[] { new TfsChangesetInfo { Remote = remote } }); } private void CreateShelveset(string shelvesetName) { mocks.Get().Stub(x => x.HasShelveset(shelvesetName)).Return(true); } } }