public async Task <IActionResult> CloneProject(int projectId, CloneProjectOptionDto option) { _logger.LogRequest("Cloning project {projectId}. Request body: {@option}", projectId, option); try { var ownerUserId = User.GetUserId(); var createdProject = await _projectService.CloneProject(projectId, option.NewProjectName, option.DisplayName, option.Client, ownerUserId, option.IncludeMembers, option.IncludeJobDefinitions); var project = _mapper.Map <ProjectDto>(createdProject); _logger.LogResponse("Project {projectId} cloned. Response body: {@project}", projectId, project); return(CreatedAtRoute("GetProjectById", new { projectId = project.Id }, project)); } catch (DuplicateProjectException dupEx) { _logger.LogWarning(dupEx, "Duplicate project name"); return(BadRequest(dupEx.Message)); } catch (ProjectNotFoundException nopEx) { _logger.LogWarning(nopEx, "Project not found"); return(BadRequest(nopEx.Message)); } }
public async void CloneProject_ReturnsCreatedProject() { _projectService .Setup(s => s.CloneProject(It.IsAny <int>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <bool>(), It.IsAny <bool>(), It.IsAny <CancellationToken>())) .ReturnsAsync((int id, string newProjectName, int ownerUserId, bool includeMembers, bool includeJobDefinitions, CancellationToken cancellationToken) => new Project { Id = 2, Name = newProjectName }); var httpContext = new DefaultHttpContext() { User = new ClaimsPrincipal(new[] { new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "1") }) }) }; var controller = new ProjectController(_projectService.Object, _mapper, _logger.Object) { ControllerContext = new ControllerContext { HttpContext = httpContext } }; var dto = new CloneProjectOptionDto { NewProjectName = "Project02" }; var result = await controller.CloneProject(1, dto); var createAtRouteActionResult = Assert.IsType <CreatedAtRouteResult>(result); var returnValue = Assert.IsType <ProjectDto>(createAtRouteActionResult.Value); Assert.Equal(2, returnValue.Id); Assert.Equal("Project02", returnValue.Name); }
public async Task <ProjectDto> CloneProject(int projectId, CloneProjectOptionDto option) { var path = $"project/{projectId}/clone"; return(await Api.Post <CloneProjectOptionDto, ProjectDto>(path, option)); }