public async Task ShouldDetectFileChanges()
        {
            using (var test = StartTest(TestData.TestRepoMasterCleanSynchronized))
            {
                var events   = new RepositoryManagerEvents();
                var listener = Substitute.For <IRepositoryManagerListener>();
                listener.AttachListener(test.RepositoryManager, events);

                await events.WaitForNotBusy();

                listener.ClearReceivedCalls();
                events.Reset();

                var foobarTxt = test.Environment.RepositoryPath.Combine("foobar.txt");
                foobarTxt.WriteAllText("foobar");

                test.RepositoryManager.WaitForEvents();
                await events.WaitForNotBusy();

                var received = await ProcessEvents(events);

                // we expect these events
                AssertReceivedEvent(nameof(events.GitStatusUpdated), received);
                AssertReceivedEvent(nameof(events.LocalBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.RemoteBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.CurrentBranchUpdated), received);
            }
        }
        public async Task ShouldAddAndCommitAllFiles()
        {
            using (var test = StartTest(TestData.TestRepoMasterCleanSynchronized))
            {
                var events   = new RepositoryManagerEvents();
                var listener = Substitute.For <IRepositoryManagerListener>();
                listener.AttachListener(test.RepositoryManager, events);
                listener.ClearReceivedCalls();

                var foobarTxt = test.Environment.RepositoryPath.Combine("foobar.txt");
                foobarTxt.WriteAllText("foobar");

                test.RepositoryManager.WaitForEvents();
                await events.WaitForNotBusy();

                listener.ClearReceivedCalls();
                events.Reset();

                await test.RepositoryManager.CommitAllFiles("IntegrationTest Commit", string.Empty).StartAsAsync();

                test.RepositoryManager.WaitForEvents();
                await events.WaitForNotBusy();

                var received = await ProcessEvents(events);

                // we expect these events
                AssertReceivedEvent(nameof(events.GitStatusUpdated), received);
                AssertReceivedEvent(nameof(events.LocalBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.RemoteBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.GitAheadBehindStatusUpdated), received);
                AssertReceivedEvent(nameof(events.GitLogUpdated), received);
            }
        }
        public async Task ShouldDetectChangesToRemotesWhenSwitchingBranches()
        {
            using (var test = StartTest(TestData.TestRepoMasterTwoRemotes))
            {
                var events   = new RepositoryManagerEvents();
                var listener = Substitute.For <IRepositoryManagerListener>();
                listener.AttachListener(test.RepositoryManager, events);
                listener.ClearReceivedCalls();

                await test.RepositoryManager.CreateBranch("branch2", "another/master").StartAsAsync();

                test.RepositoryManager.WaitForEvents();
                await events.WaitForNotBusy();

                var received = await ProcessEvents(events);

                // we expect these events
                AssertReceivedEvent(nameof(events.LocalBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.RemoteBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.GitLogUpdated), received);
                AssertReceivedEvent(nameof(events.CurrentBranchUpdated), received);

                // we don't expect these events
                AssertDidNotReceiveEvent(nameof(events.GitStatusUpdated), received);
                AssertDidNotReceiveEvent(nameof(events.GitAheadBehindStatusUpdated), received);
                //AssertDidNotReceiveEvent(nameof(events.GitLocksUpdated), received);

                listener.ClearReceivedCalls();
                events.Reset();

                await test.RepositoryManager.SwitchBranch("branch2").StartAsAsync();

                test.RepositoryManager.WaitForEvents();
                await events.WaitForNotBusy();

                received = await ProcessEvents(events);

                // we expect these events
                AssertReceivedEvent(nameof(events.GitStatusUpdated), received);
                AssertReceivedEvent(nameof(events.GitAheadBehindStatusUpdated), received);
                AssertReceivedEvent(nameof(events.GitLogUpdated), received);
                AssertReceivedEvent(nameof(events.CurrentBranchUpdated), received);

                // we don't expect these events
                AssertDidNotReceiveEvent(nameof(events.LocalBranchesUpdated), received);
                AssertDidNotReceiveEvent(nameof(events.RemoteBranchesUpdated), received);
                AssertDidNotReceiveEvent(nameof(events.GitLocksUpdated), received);
            }
        }
        public async Task ShouldDetectChangesToRemotes()
        {
            using (var test = StartTest(TestData.TestRepoMasterCleanSynchronized))
            {
                var events   = new RepositoryManagerEvents();
                var listener = Substitute.For <IRepositoryManagerListener>();
                listener.AttachListener(test.RepositoryManager, events);
                listener.ClearReceivedCalls();

                await test.RepositoryManager.RemoteRemove("origin").StartAsAsync();

                test.RepositoryManager.WaitForEvents();
                await events.WaitForNotBusy();

                var received = await ProcessEvents(events);

                // we expect these events
                AssertReceivedEvent(nameof(events.LocalBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.RemoteBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.GitAheadBehindStatusUpdated), received);
                AssertReceivedEvent(nameof(events.GitLogUpdated), received);
                AssertReceivedEvent(nameof(events.CurrentBranchUpdated), received);

                // we don't expect these events
                AssertDidNotReceiveEvent(nameof(events.GitStatusUpdated), received);
                //AssertDidNotReceiveEvent(nameof(events.GitLocksUpdated), received);

                listener.ClearReceivedCalls();
                events.Reset();

                await test.RepositoryManager.RemoteAdd("origin", test.TestRepo.RepoPath.Parent.Combine("bare")).StartAsAsync();

                test.RepositoryManager.WaitForEvents();
                await events.WaitForNotBusy();

                received = await ProcessEvents(events);

                // we expect these events
                AssertReceivedEvent(nameof(events.LocalBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.RemoteBranchesUpdated), received);
                AssertReceivedEvent(nameof(events.GitAheadBehindStatusUpdated), received);
                AssertReceivedEvent(nameof(events.GitLogUpdated), received);
                AssertReceivedEvent(nameof(events.CurrentBranchUpdated), received);

                // we don't expect these events
                AssertDidNotReceiveEvent(nameof(events.GitStatusUpdated), received);
                //AssertDidNotReceiveEvent(nameof(events.GitLocksUpdated), received);
            }
        }
예제 #5
0
        public async Task ShouldDetectFileChanges()
        {
            Logger.Trace("Starting ShouldDetectFileChanges");

            try
            {
                var repositoryManagerListener = Substitute.For <IRepositoryManagerListener>();

                await Initialize(TestRepoMasterCleanSynchronized, initializeRepository : false,
                                 onRepositoryManagerCreated : manager => {
                    repositoryManagerListener.AttachListener(manager, repositoryManagerEvents);
                });

                repositoryManagerEvents.CurrentBranchUpdated.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.RemoteBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.GitAheadBehindStatusUpdated.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.IsBusy.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.IsNotBusy.WaitOne(Timeout).Should().BeTrue();

                repositoryManagerListener.ClearReceivedCalls();
                repositoryManagerEvents.Reset();

                var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt");
                foobarTxt.WriteAllText("foobar");

                await TaskManager.Wait();

                RepositoryManager.WaitForEvents();
                repositoryManagerEvents.WaitForNotBusy();

                repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();

                repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
                repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
                repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
                repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus);
                repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
                repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs);
                repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary);
                repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
            }
            finally
            {
                Logger.Trace("Ending ShouldDetectFileChanges");
            }
        }
예제 #6
0
        public async Task ShouldAddAndCommitFiles()
        {
            Stopwatch watch  = null;
            ILogging  logger = null;

            StartTest(out watch, out logger);

            try
            {
                var repositoryManagerListener = Substitute.For <IRepositoryManagerListener>();

                InitializePlatformAndEnvironment(TestRepoMasterCleanSynchronized,
                                                 onRepositoryManagerCreated: manager => {
                    repositoryManagerListener.AttachListener(manager, repositoryManagerEvents);
                });

                repositoryManagerListener.AssertDidNotReceiveAnyCalls();

                var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt");
                foobarTxt.WriteAllText("foobar");

                StartTrackTime(watch, logger, "RepositoryManager.WaitForEvents()");
                RepositoryManager.WaitForEvents();
                StopTrackTimeAndLog(watch, logger);

                StartTrackTime(watch, logger, "repositoryManagerEvents.WaitForNotBusy()");
                await repositoryManagerEvents.WaitForNotBusy();

                StopTrackTimeAndLog(watch, logger);

                // we expect these events
                await AssertReceivedEvent(nameof(repositoryManagerEvents.GitStatusUpdated), repositoryManagerEvents.GitStatusUpdated);

                // we don't expect these events
                await AssertDidNotReceiveEvent(nameof(repositoryManagerEvents.LocalBranchesUpdated), repositoryManagerEvents.LocalBranchesUpdated);
                await AssertDidNotReceiveEvent(nameof(repositoryManagerEvents.RemoteBranchesUpdated), repositoryManagerEvents.RemoteBranchesUpdated);
                await AssertDidNotReceiveEvent(nameof(repositoryManagerEvents.GitAheadBehindStatusUpdated), repositoryManagerEvents.GitAheadBehindStatusUpdated);
                await AssertDidNotReceiveEvent(nameof(repositoryManagerEvents.GitLogUpdated), repositoryManagerEvents.GitLogUpdated);
                await AssertDidNotReceiveEvent(nameof(repositoryManagerEvents.GitLocksUpdated), repositoryManagerEvents.GitLocksUpdated);
                await AssertDidNotReceiveEvent(nameof(repositoryManagerEvents.CurrentBranchUpdated), repositoryManagerEvents.CurrentBranchUpdated);

                repositoryManagerListener.ClearReceivedCalls();
                repositoryManagerEvents.Reset();

                var filesToCommit = new List <string> {
                    "foobar.txt"
                };
                var commitMessage = "IntegrationTest Commit";
                var commitBody    = string.Empty;

                StartTrackTime(watch, logger, "CommitFiles");
                await RepositoryManager.CommitFiles(filesToCommit, commitMessage, commitBody).StartAsAsync();

                StopTrackTimeAndLog(watch, logger);
                await TaskManager.Wait();

                RepositoryManager.WaitForEvents();
                await repositoryManagerEvents.WaitForNotBusy();

                // we expect these events
                await AssertReceivedEvent(nameof(repositoryManagerEvents.LocalBranchesUpdated), repositoryManagerEvents.LocalBranchesUpdated);
                await AssertReceivedEvent(nameof(repositoryManagerEvents.RemoteBranchesUpdated), repositoryManagerEvents.RemoteBranchesUpdated);
                await AssertReceivedEvent(nameof(repositoryManagerEvents.GitAheadBehindStatusUpdated), repositoryManagerEvents.GitAheadBehindStatusUpdated);
                await AssertReceivedEvent(nameof(repositoryManagerEvents.GitLogUpdated), repositoryManagerEvents.GitLogUpdated);
                await AssertReceivedEvent(nameof(repositoryManagerEvents.GitStatusUpdated), repositoryManagerEvents.GitStatusUpdated);
                await AssertReceivedEvent(nameof(repositoryManagerEvents.CurrentBranchUpdated), repositoryManagerEvents.CurrentBranchUpdated);

                // we don't expect these events
                await AssertDidNotReceiveEvent(nameof(repositoryManagerEvents.GitLocksUpdated), repositoryManagerEvents.GitLocksUpdated);
            }
            finally
            {
                EndTest(logger);
            }
        }
        public async Task ShouldDetectBranchCreate()
        {
            using (var test = StartTest(TestData.TestRepoMasterCleanSynchronized))
            {
                var events   = new RepositoryManagerEvents();
                var listener = Substitute.For <IRepositoryManagerListener>();
                listener.AttachListener(test.RepositoryManager, events);
                listener.ClearReceivedCalls();

                {
                    // prepopulate repository info cache
                    var b = test.Repository.CurrentBranch;
                    test.RepositoryManager.WaitForEvents();
                    var received = await ProcessEvents(events);

                    AssertReceivedEvent(nameof(events.CurrentBranchUpdated), received);
                    listener.ClearReceivedCalls();
                    events.Reset();
                }

                {
                    var createdBranch1 = "feature/document2";
                    await test.RepositoryManager.CreateBranch(createdBranch1, "feature/document").StartAsAsync();

                    test.RepositoryManager.WaitForEvents();
                    await events.WaitForNotBusy();

                    var received = await ProcessEvents(events);

                    // we expect these events
                    AssertReceivedEvent(nameof(events.LocalBranchesUpdated), received);
                    AssertReceivedEvent(nameof(events.RemoteBranchesUpdated), received);
                    AssertReceivedEvent(nameof(events.GitAheadBehindStatusUpdated), received);

                    // we don't expect these events
                    // TODO: log should not be getting called, but it is because when branches get changed we're blindly calling log
                    //AssertDidNotReceiveEvent(events.GitLogUpdated, received);
                    AssertDidNotReceiveEvent(nameof(events.GitStatusUpdated), received);
                    AssertDidNotReceiveEvent(nameof(events.CurrentBranchUpdated), received);
                    //AssertDidNotReceiveEvent(nameof(events.GitLocksUpdated), received);

                    listener.ClearReceivedCalls();
                    events.Reset();

                    await test.RepositoryManager.CreateBranch("feature2/document2", "feature/document").StartAsAsync();

                    test.RepositoryManager.WaitForEvents();

                    await events.WaitForNotBusy();

                    received = await ProcessEvents(events);

                    // we expect these events
                    AssertReceivedEvent(nameof(events.LocalBranchesUpdated), received);
                    AssertReceivedEvent(nameof(events.RemoteBranchesUpdated), received);
                    AssertReceivedEvent(nameof(events.GitAheadBehindStatusUpdated), received);

                    // we don't expect these events
                    AssertDidNotReceiveEvent(nameof(events.GitStatusUpdated), received);
                    // TODO: log should not be getting called, but it is because when branches get changed we're blindly calling log
                    //AssertDidNotReceiveEvent(events.GitLogUpdated, received);
                    AssertDidNotReceiveEvent(nameof(events.CurrentBranchUpdated), received);
                    //AssertDidNotReceiveEvent(nameof(events.GitLocksUpdated), received);
                }
            }
        }
예제 #8
0
        public async Task ShouldAddAndCommitFiles()
        {
            await Initialize(TestRepoMasterCleanSynchronized);

            var repositoryManagerListener = Substitute.For <IRepositoryManagerListener>();

            repositoryManagerListener.AttachListener(RepositoryManager, repositoryManagerEvents);

            var expectedAfterChanges = new GitStatus {
                Behind       = 1,
                LocalBranch  = "master",
                RemoteBranch = "origin/master",
                Entries      =
                    new List <GitStatusEntry> {
                    new GitStatusEntry("Assets\\TestDocument.txt",
                                       TestRepoMasterCleanSynchronized.Combine("Assets", "TestDocument.txt"),
                                       "Assets\\TestDocument.txt", GitFileStatus.Modified),
                    new GitStatusEntry("foobar.txt", TestRepoMasterCleanSynchronized.Combine("foobar.txt"),
                                       "foobar.txt", GitFileStatus.Untracked)
                }
            };

            var result = new GitStatus();

            RepositoryManager.OnStatusUpdated += status => { result = status; };

            var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt");

            foobarTxt.WriteAllText("foobar");

            var testDocumentTxt = TestRepoMasterCleanSynchronized.Combine("Assets", "TestDocument.txt");

            testDocumentTxt.WriteAllText("foobar");
            await TaskManager.Wait();

            WaitForNotBusy(repositoryManagerEvents, 1);
            RepositoryManager.WaitForEvents();
            WaitForNotBusy(repositoryManagerEvents, 1);

            repositoryManagerListener.Received().OnStatusUpdate(Args.GitStatus);
            repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any <ConfigBranch?>());
            repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any <ConfigRemote?>());
            repositoryManagerListener.DidNotReceive().OnHeadChanged();
            repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged();
            repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged();
            repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool);
            repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock);

            result.AssertEqual(expectedAfterChanges);

            repositoryManagerListener.ClearReceivedCalls();
            repositoryManagerEvents.Reset();

            await RepositoryManager
            .CommitFiles(new List <string>() { "Assets\\TestDocument.txt", "foobar.txt" }, "IntegrationTest Commit", string.Empty)
            .StartAsAsync();

            await TaskManager.Wait();

            RepositoryManager.WaitForEvents();
            WaitForNotBusy(repositoryManagerEvents, 1);

            repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus);
            repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any <ConfigBranch?>());
            repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any <ConfigRemote?>());
            repositoryManagerListener.DidNotReceive().OnHeadChanged();
            repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged();
            repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged();
            repositoryManagerListener.Received(2).OnIsBusyChanged(Args.Bool);
            repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock);
        }
예제 #9
0
        public async Task ShouldAddAndCommitFiles()
        {
            Stopwatch watch  = null;
            ILogging  logger = null;

            StartTest(out watch, out logger);

            try
            {
                var repositoryManagerListener = Substitute.For <IRepositoryManagerListener>();

                InitializePlatformAndEnvironment(TestRepoMasterCleanSynchronized,
                                                 onRepositoryManagerCreated: manager => {
                    repositoryManagerListener.AttachListener(manager, repositoryManagerEvents);
                });

                repositoryManagerListener.AssertDidNotReceiveAnyCalls();

                var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt");
                foobarTxt.WriteAllText("foobar");

                var testDocumentTxt = TestRepoMasterCleanSynchronized.Combine("Assets", "TestDocument.txt");
                testDocumentTxt.WriteAllText("foobar");

                await TaskManager.Wait();

                RepositoryManager.WaitForEvents();
                repositoryManagerEvents.WaitForNotBusy();

                repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();

                repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
                repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
                repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
                repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus);
                repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
                repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs);
                repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary);
                repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);

                repositoryManagerListener.ClearReceivedCalls();
                repositoryManagerEvents.Reset();

                await RepositoryManager
                .CommitFiles(new List <string> {
                    "Assets\\TestDocument.txt", "foobar.txt"
                }, "IntegrationTest Commit", string.Empty)
                .StartAsAsync();

                await TaskManager.Wait();

                RepositoryManager.WaitForEvents();
                repositoryManagerEvents.WaitForNotBusy();

                repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue();
                repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue();

                repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool);
                repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote);
                repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus);
                repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus);
                repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks);
                repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs);
                repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary);
                repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary);
            }
            finally
            {
                EndTest(logger);
            }
        }