public void CurrentProjectIsFirstIfNotSetInSettings()
        {
            // Arrange
            var context = new MockContext();
            context.SettingsRepoMock.Setup( s => s.GetById( SettingKeys.LastProject ) ).Returns( new Config { Value = "-1" } );

            var projects = new[]
            {
                new Project {Name = "One", Id = 1},
                new Project {Name = "Two", Id = 2},
                new Project {Name = "Three", Id = 3}
            };

            context.ProjectRepoMock.Setup( p => p.GetAll() ).Returns( projects );

            // Act
            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );

            // Assert
            Assert.IsNotNull( vm.CurrentProject );
            Assert.AreSame( projects[0], vm.CurrentProject.Model );

            context.SettingsRepoMock.VerifyAll();
            context.ProjectRepoMock.VerifyAll();
        }
        public void ChangingCurrentProjectSavesToSettings()
        {
            // Arrange
            var context = new MockContext();
            context.SettingsRepoMock.Setup( s => s.Set( SettingKeys.LastProject, "1" ) ).Verifiable();
            context.SettingsRepoMock.Setup( x => x.GetById( SettingKeys.LastProject ) ).Returns( new Config {Id = SettingKeys.LastProject, Value = "-1"} );
            context.ProjectRepoMock.Setup( x => x.GetAll() ).Returns( new[] { new Project {Id = 1} } );

            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );
            vm.Reset();

            // Act
            vm.Projects[0].IsCurrent = true;

            // Assert
            context.SettingsRepoMock.VerifyAll();
        }
        public void AddTagAddsToProject()
        {
            // Arrange
            var context = new MockContext();

            context.ProjectRepoMock.Setup( x => x.Update( It.Is<Project>( p => p.Id == 1 ) ) );
            context.ProjectRepoMock.Setup( x => x.GetAll() ).Returns( Enumerable.Empty<Project>() );
            context.SettingsRepoMock.Setup( x => x.GetById( "state.project" ) ).Returns( new Config { Id = "-1" } );

            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo )
            {
                CurrentProject = new ProjectViewModel( new Project { Id = 1 } )
            };

            // Act
            var tag = new Tag { Id = 123 };
            vm.AddTag( tag );

            // Assert
            Assert.IsNotNull( vm.CurrentProject.Model.Tags.SingleOrDefault( t => t.Id == tag.Id ) );
        }
        public void SettingCurrentProjectRaisesEvent()
        {
            // Arrange
            var context = new MockContext();
            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );

            bool raised = false;
            vm.CurrentProjectChanged += ( s, e ) => raised = true;

            // Act
            vm.CurrentProject = new ProjectViewModel( new Project() );

            // Assert
            Assert.IsTrue( raised );
        }
        public void ResetErasesProjectName()
        {
            // Arrange
            var context = new MockContext();
            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );

            // Act
            vm.NewProjectName = "test";
            vm.Reset();

            // Assert
            Assert.IsTrue( string.IsNullOrEmpty( vm.NewProjectName ) );
        }
        public void NewProjectCanOnlyBeAddedWithValidName()
        {
            // Arrange
            var context = new MockContext();
            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );

            // Act
            vm.NewProjectName = string.Empty;
            bool empty = vm.NewProjectCommand.CanExecute( null );

            vm.NewProjectName = "test";
            bool nonEmpty = vm.NewProjectCommand.CanExecute( null );

            // Assert
            Assert.IsFalse( empty );
            Assert.IsTrue( nonEmpty );
        }
        public void DeleteProjectRemovesFromListAndRepository()
        {
            // Arrange
            var context = new MockContext();
            var projects = new[]
            {
                new Project {Name = "One", Id = 1},
                new Project {Name = "Two", Id = 2},
                new Project {Name = "Three", Id = 3}
            };

            context.SettingsRepoMock.Setup( s => s.GetById( SettingKeys.LastProject ) ).Returns( new Config { Value = "-1" } );

            context.ProjectRepoMock.Setup( p => p.GetAll() ).Returns( projects );
            context.ProjectRepoMock.Setup( p => p.Delete( It.Is<Project>( proj => proj.Id == 1 ) ) ).Verifiable();

            context.ViewServiceRepoMock.Setup( x => x.Execute<IConfirmationService, bool>( It.IsAny<ConfirmationServiceArgs>() ) )
                .Returns( Task.FromResult( true ) );

            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );

            // Act
            vm.DeleteProjectCommand.Execute( vm.Projects.First() );

            // Assert
            Assert.IsNull( vm.Projects.FirstOrDefault( p => p.Model.Id == 1 ) );

            context.ViewServiceRepoMock.VerifyAll();
            context.ProjectRepoMock.VerifyAll();
        }
        public void DeleteProjectNeedsConfirmation()
        {
            // Arrange
            var context = new MockContext();
            var projects = new[]
            {
                new Project {Name = "One", Id = 1},
                new Project {Name = "Two", Id = 2},
                new Project {Name = "Three", Id = 3}
            };

            context.SettingsRepoMock.Setup( s => s.GetById( SettingKeys.LastProject ) ).Returns( new Config { Value = "-1" } );
            context.ProjectRepoMock.Setup( p => p.GetAll() ).Returns( projects );

            context.ViewServiceRepoMock.Setup( x => x.Execute<IConfirmationService, bool>( It.IsAny<ConfirmationServiceArgs>() ) )
                .Returns( Task.FromResult( false ) );

            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );

            // Act
            vm.DeleteProjectCommand.Execute( vm.Projects.First() );

            // Assert
            context.ViewServiceRepoMock.VerifyAll();
        }
        public void DeleteProjectCommandNeedsValue()
        {
            // Arrange
            var context = new MockContext();
            var vm = new ProjectListViewModel( context.ViewServiceRepo, context.SettingsRepo, context.ProjectRepo );

            // Act
            bool withoutValue = vm.DeleteProjectCommand.CanExecute( null );
            bool withValue = vm.DeleteProjectCommand.CanExecute( new ProjectViewModel( new Project() ) );

            // Assert
            Assert.IsFalse( withoutValue );
            Assert.IsTrue( withValue );
        }