public void CanCreateProject()
			{
				var repository = new Mock<IProjectRepository>();
				IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				var project = new DeployProject
				{
					ProjectName = Guid.NewGuid().ToString(),
					Id = Guid.NewGuid().ToString(),
					UsesSharedComponentConfiguration = false
				};
				repository.Setup(i=>i.CreateProject(project.ProjectName, project.UsesSharedComponentConfiguration)).Returns(project);
				DeployProject result = sut.CreateProject(project.ProjectName, project.UsesSharedComponentConfiguration);
				Assert.AreEqual(project, result);
				repository.Verify(i => i.CreateProject(project.ProjectName, project.UsesSharedComponentConfiguration), Times.Once());
			}
			public void MissingProjectName_ThrowsError()
			{
				var repository = new Mock<IProjectRepository>();
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				Assert.Throws<ArgumentNullException>(delegate { sut.CreateProject(string.Empty, false); });
				repository.Verify(i => i.CreateProject(It.IsAny<string>(), It.IsAny<bool>()), Times.Never());
			}
			public void MissingTaskOptions_ThrowsError()
			{
				string projectId = Guid.NewGuid().ToString();
				string componentId = Guid.NewGuid().ToString();
				string deploymentStepId = Guid.NewGuid().ToString();
				string stepName = Guid.NewGuid().ToString();
				string taskTypeName = typeof(TestTaskType).ToString();
				string taskOptionsJson = null;
				var projectRepository = new Mock<IProjectRepository>();
                IProjectManager sut = new ProjectManager(projectRepository.Object, new Mock<IDeployTaskFactory>().Object);

				Assert.Throws<ArgumentNullException>(() => sut.UpdateComponentDeploymentStep(projectId, componentId, deploymentStepId, stepName, taskTypeName, taskOptionsJson));
                projectRepository.Verify(i => i.UpdateComponentDeploymentStep(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int?>()), Times.Never());
			}
			public void MissingTaskOptions_CreatesTaskOptions()
			{
                //var project = new DeployProject
                //{
                //    ProjectName = Guid.NewGuid().ToString(),
                //    Id = Guid.NewGuid().ToString(),
                //    UsesSharedComponentConfiguration = false
                //};
                //string componentId = Guid.NewGuid().ToString();
                //string stepName = Guid.NewGuid().ToString();
                //string taskTypeName = typeof(TestTaskType).ToString();
                //string taskOptionsJson = null;
                //var projectRepository = new Mock<IProjectRepository>();
                //projectRepository.Setup(i => i.GetProject(project.Id)).Returns(project);
                //var deployTaskFactory = new Mock<IDeployTaskFactory>();
                //deployTaskFactory.Setup(i=>i.CreateTaskDefinition(taskTypeName, It.IsAny<string>())).Returns(new TestTaskType() { DeployTaskOptions = new object() });
                //IProjectManager sut = new ProjectManager(projectRepository.Object, deployTaskFactory.Object);
                
                //var result = sut.CreateComponentDeploymentStep(project.Id, componentId, stepName, taskTypeName, taskOptionsJson);

                //Assert.IsNotNull(result);
                //Assert.AreEqual(stepName, result.StepName);
                //projectRepository.Verify(i => i.CreateComponentDeploymentStep(project.Id, componentId, stepName, taskTypeName, It.IsAny<string>(), null), Times.Once());

                string projectId = Guid.NewGuid().ToString();
                string componentId = Guid.NewGuid().ToString();
                string stepName = Guid.NewGuid().ToString();
                string taskTypeName = typeof(TestTaskType).ToString();
                string taskOptionsJson = null;
                var projectRepository = new Mock<IProjectRepository>();
                var project = new DeployProject
                {
                    Id = projectId,
                    ComponentList = new List<DeployComponent>(),
                    UsesSharedComponentConfiguration = false
                };
                projectRepository.Setup(i => i.GetProject(projectId))
                                    .Returns(project);
                projectRepository.Setup(i => i.CreateComponentDeploymentStep(project.Id, componentId, stepName, taskTypeName, It.IsAny<string>(), null))
                                    .Returns(new DeployStep
                                    {
                                        Id = Guid.NewGuid().ToString(),
                                        StepName = stepName,
                                        TaskTypeName = taskTypeName,
                                        TaskOptionsJson = taskOptionsJson,
                                        ProjectId = projectId,
                                        ParentId = componentId,
                                        SharedDeploymentStepId = Guid.NewGuid().ToString()
                                    });
                var deployTaskFactory = new Mock<IDeployTaskFactory>();
                deployTaskFactory.Setup(i=>i.CreateTaskDefinition(taskTypeName, It.IsAny<string>())).Returns(new TestTaskType() { DeployTaskOptions = new object() });
                IProjectManager sut = new ProjectManager(projectRepository.Object, deployTaskFactory.Object);

                var result = sut.CreateComponentDeploymentStep(projectId, componentId, stepName, taskTypeName, taskOptionsJson);

                Assert.IsNotNull(result);
                Assert.AreEqual(stepName, result.StepName);
                projectRepository.Verify(i => i.CreateComponentDeploymentStep(project.Id, componentId, stepName, taskTypeName, It.IsAny<string>(), null), Times.Once());
            }
			public void CanUpdateDeploymentStep()
			{
				string projectId = Guid.NewGuid().ToString();
				string componentId = Guid.NewGuid().ToString();
				string deploymentStepId = Guid.NewGuid().ToString();
				string stepName = Guid.NewGuid().ToString();
				string taskTypeName = typeof(TestTaskType).ToString();
				string taskOptionsJson = Guid.NewGuid().ToString();
				var projectRepository = new Mock<IProjectRepository>();
				var project = new DeployProject
				{
					Id = projectId,
					ComponentList = new List<DeployComponent>(),
					UsesSharedComponentConfiguration = false
				};
				projectRepository.Setup(i=>i.GetProject(projectId)).Returns(project);
				projectRepository.Setup(i => i.UpdateComponentDeploymentStep(deploymentStepId, project.Id, componentId, stepName, taskTypeName, taskOptionsJson, null, null))
									.Returns(new DeployStep
									{
										Id = deploymentStepId,
										StepName = stepName,
										TaskTypeName = taskTypeName,
										TaskOptionsJson = Guid.NewGuid().ToString(),
										ParentId = componentId,
										ProjectId = projectId,
										SharedDeploymentStepId = Guid.NewGuid().ToString(),
									});
                IProjectManager sut = new ProjectManager(projectRepository.Object, new Mock<IDeployTaskFactory>().Object);

				var result = sut.UpdateComponentDeploymentStep(deploymentStepId, projectId, componentId, stepName, taskTypeName, taskOptionsJson);

				Assert.IsNotNull(result);
				Assert.AreEqual(stepName, result.StepName);

				projectRepository.Verify(i => i.UpdateComponentDeploymentStep(deploymentStepId, project.Id, componentId, stepName, taskTypeName, taskOptionsJson,null, null), Times.Once());
			}
			public void CanUpdateProject()
			{
				var repository = new Mock<IProjectRepository>();
				string projectId = Guid.NewGuid().ToString();
				string projectName = Guid.NewGuid().ToString();
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				sut.UpdateProject(projectId, projectName, true);
				repository.Verify(i=>i.UpdateProject(projectId, projectName, true), Times.Once());
			}
			public void MissingProjectName_ThrowsError()
			{
				var repository = new Mock<IProjectRepository>();
				string projectId = Guid.NewGuid().ToString();
				string projectName = string.Empty;
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				Assert.Throws<ArgumentNullException>(delegate { sut.UpdateProject(projectId, projectName, true); });
				repository.Verify(i => i.UpdateProject(projectId, projectName, true), Times.Never());
			}
			public void CanGetProjectList()
			{
				var repository = new Mock<IProjectRepository>();
				var projectList = new List<DeployProject>
				{
					new DeployProject { Id = Guid.NewGuid().ToString(), ProjectName = Guid.NewGuid().ToString() },
					new DeployProject { Id = Guid.NewGuid().ToString(), ProjectName = Guid.NewGuid().ToString() },
					new DeployProject { Id = Guid.NewGuid().ToString(), ProjectName = Guid.NewGuid().ToString() }
				};
				repository.Setup(i=>i.GetProjectList()).Returns(projectList);
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				var result = sut.GetProjectList();
				Assert.AreEqual(projectList.Count, result.Count());
				repository.Verify(i=>i.GetProjectList(), Times.Once());
			}
			public void MissingBranchName_ThrowsError()
			{
				var repository = new Mock<IProjectRepository>();
				string projectId = Guid.NewGuid().ToString();
				string branchName = string.Empty;
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				Assert.Throws<ArgumentNullException>(delegate { sut.CreateBranch(projectId, branchName); });
				repository.Verify(i => i.CreateBranch(It.IsAny<string>(), It.IsAny<string>()), Times.Never());
			}
			public void CanCreateProjectBranch()
			{
				var repository = new Mock<IProjectRepository>();
				string projectId = Guid.NewGuid().ToString();
				var branch = new DeployProjectBranch
				{
					Id = Guid.NewGuid().ToString(),
					ProjectId = Guid.NewGuid().ToString(),
					BranchName = Guid.NewGuid().ToString()
				};
				repository.Setup(i=>i.CreateBranch(branch.ProjectId, branch.BranchName)).Returns(branch);
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				var result = sut.CreateBranch(branch.ProjectId, branch.BranchName);
				Assert.AreEqual(branch, result);
				repository.Verify(i=>i.CreateBranch(branch.ProjectId, branch.BranchName), Times.Once());
			}
			public void BadId_ThrowsError()
			{
				var repository = new Mock<IProjectRepository>();
				var project = new DeployProject
				{
					ProjectName = Guid.NewGuid().ToString(),
					Id = Guid.NewGuid().ToString()
				};
				repository.Setup(i => i.GetProject(project.Id)).Returns((DeployProject)null);
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				Assert.Throws<KeyNotFoundException>(delegate { sut.GetProject(project.Id); });
				repository.Verify(i => i.GetProject(It.IsAny<string>()), Times.Once());
			}
			public void CanRetrieveProjectByID()
			{
				var repository = new Mock<IProjectRepository>();
				var project = new DeployProject
				{
					ProjectName = Guid.NewGuid().ToString(),
					Id = Guid.NewGuid().ToString()
				};
				repository.Setup(i=>i.GetProject(project.Id)).Returns(project);
                IProjectManager sut = new ProjectManager(repository.Object, new Mock<IDeployTaskFactory>().Object);
				DeployProject result = sut.GetProject(project.Id);
				Assert.AreEqual(project, result);
				repository.Verify(i=>i.GetProject(project.Id), Times.Once());
			}