Inheritance: BaseViewModel, IRepositoryCloneViewModel
        public void StartsTrueBecomesFalseWhenCompleted()
        {
            var repoSubject = new Subject<IRepositoryModel[]>();
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(repoSubject);
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());

            Assert.False(vm.IsLoading);

            vm.LoadRepositoriesCommand.ExecuteAsync().Subscribe();

            Assert.True(vm.IsLoading);

            repoSubject.OnNext(new[] { Substitute.For<IRepositoryModel>() });
            repoSubject.OnNext(new[] { Substitute.For<IRepositoryModel>() });

            Assert.True(vm.IsLoading);

            repoSubject.OnCompleted();

            Assert.False(vm.IsLoading);
        }
 static RepositoryCloneViewModel GetVM(IRepositoryHost repositoryHost, IRepositoryCloneService cloneService,
     IOperatingSystem os, INotificationService notificationService, IUsageTracker usageTracker)
 {
     var vm = new RepositoryCloneViewModel(
         repositoryHost,
         cloneService,
         os,
         notificationService,
         usageTracker);
     vm.Initialize(null);
     return vm;
 }
        public void IsFalseWhenLoadingReposFailsImmediately()
        {
            var repoSubject = Observable.Throw<IRepositoryModel[]>(new InvalidOperationException("Doh!"));
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(repoSubject);
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());

            vm.LoadRepositoriesCommand.ExecuteAsync().Subscribe();

            Assert.True(vm.LoadingFailed);
            Assert.False(vm.IsLoading);
        }
        public async Task LoadsRepositories()
        {
            var repos = new IRepositoryModel[]
            {
                Substitute.For<IRepositoryModel>(),
                Substitute.For<IRepositoryModel>(),
                Substitute.For<IRepositoryModel>()
            };
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(Observable.Return(repos));
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());

            await vm.LoadRepositoriesCommand.ExecuteAsync();

            Assert.Equal(3, vm.FilteredRepositories.Count);
        }
        public void IsTrueInitially()
        {
            var repoSubject = new Subject<IRepositoryModel[]>();
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(repoSubject);
            var cloneService = Substitute.For<IRepositoryCloneService>();

            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());

            Assert.True(vm.NoRepositoriesFound);
        }
        public async Task DisplaysErrorMessageWhenExceptionOccurs()
        {
            var repositoryHost = Substitute.For<IRepositoryHost>();
            var cloneService = Substitute.For<IRepositoryCloneService>();
            cloneService.CloneRepository(Args.String, Args.String, Args.String)
                .Returns(Observable.Throw<Unit>(new InvalidOperationException("Oh my! That was bad.")));
            var vsServices = Substitute.For<IVSServices>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                vsServices);
            vm.BaseRepositoryPath = @"c:\fake";
            var repository = Substitute.For<IRepositoryModel>();
            repository.Name.Returns("octokit");
            vm.SelectedRepository = repository;

            await vm.CloneCommand.ExecuteAsync(null);

            vsServices.Received().ShowError(@"Failed to clone the repository 'octokit'
Email [email protected] if you continue to have problems.");
        }
        public void IsNotEnabledWhenPathIsNotValid()
        {
            var repositoryHost = Substitute.For<IRepositoryHost>();
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());
            vm.BaseRepositoryPath = @"c:|fake\path";
            Assert.False(vm.CloneCommand.CanExecute(null));

            vm.SelectedRepository = Substitute.For<IRepositoryModel>();

            Assert.False(vm.CloneCommand.CanExecute(null));
        }
        public void IsTrueWhenLoadingCompleteNotFailedAndNoRepositories()
        {
            var repoSubject = new Subject<IRepositoryModel[]>();
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(repoSubject);
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());
            vm.LoadRepositoriesCommand.ExecuteAsync().Subscribe();

            repoSubject.OnCompleted();

            Assert.True(vm.NoRepositoriesFound);
        }
        public void IsFalseWhenFailed()
        {
            var repoSubject = new Subject<IRepositoryModel[]>();
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(repoSubject);
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());
            vm.LoadRepositoriesCommand.ExecuteAsync().Subscribe();

            repoSubject.OnError(new InvalidOperationException());

            Assert.False(vm.NoRepositoriesFound);
        }
        public void IsFalseWhenLoadingAndCompletedWithRepository()
        {
            var repoSubject = new Subject<IRepositoryModel[]>();
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(repoSubject);
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<IVSServices>());
            vm.LoadRepositoriesCommand.ExecuteAsync().Subscribe();

            repoSubject.OnNext(new[] { Substitute.For<IRepositoryModel>() });

            Assert.False(vm.NoRepositoriesFound);

            repoSubject.OnCompleted();

            Assert.Equal(1, vm.FilteredRepositories.Count);
            Assert.False(vm.NoRepositoriesFound);
        }
        public void IsEnabledWhenRepositorySelectedAndPathValid()
        {
            var repositoryHost = Substitute.For<IRepositoryHost>();
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<INotificationService>());
            Assert.False(vm.CloneCommand.CanExecute(null));

            vm.BaseRepositoryPath = @"c:\fake\path";
            vm.SelectedRepository = Substitute.For<IRepositoryModel>();

            Assert.True(vm.CloneCommand.CanExecute(null));
        }
        public void IsTrueIfLoadingReposFails()
        {
            var repoSubject = new Subject<IRepositoryModel[]>();
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories().Returns(repoSubject);
            var cloneService = Substitute.For<IRepositoryCloneService>();
            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<INotificationService>());
            vm.LoadRepositoriesCommand.ExecuteAsync().Subscribe();

            Assert.False(vm.LoadingFailed);

            repoSubject.OnError(new InvalidOperationException("Doh!"));

            Assert.True(vm.LoadingFailed);
            Assert.False(vm.IsLoading);
        }
 public async Task UpdatesMetricsWhenRepositoryCloned()
 {
     var repositoryHost = Substitute.For<IRepositoryHost>();
     var cloneService = Substitute.For<IRepositoryCloneService>();
     var usageTracker = Substitute.For<IUsageTracker>();
     var vm = new RepositoryCloneViewModel(
         repositoryHost,
         cloneService,
         Substitute.For<IOperatingSystem>(),
         Substitute.For<INotificationService>(),
         usageTracker);
     
     vm.SelectedRepository = Substitute.For<IRemoteRepositoryModel>();
     await vm.CloneCommand.ExecuteAsync();
     Received.InOrder(async () => await usageTracker.IncrementCloneCount());
 }
        public void IsTrueInitially()
        {
            var repoSubject = new Subject<IRemoteRepositoryModel>();
            var col = TrackingCollection.Create(repoSubject);
            var repositoryHost = Substitute.For<IRepositoryHost>();
            repositoryHost.ModelService.GetRepositories(Arg.Any<ITrackingCollection<IRemoteRepositoryModel>>()).Returns(_ => col);
            var cloneService = Substitute.For<IRepositoryCloneService>();

            var vm = new RepositoryCloneViewModel(
                repositoryHost,
                cloneService,
                Substitute.For<IOperatingSystem>(),
                Substitute.For<INotificationService>(),
                Substitute.For<IUsageTracker>());

            Assert.False(vm.LoadingFailed);
            Assert.True(vm.NoRepositoriesFound);
        }