Skip to content

Commit f3b0bd4

Browse files
committed
Batch duplicate test cases
1 parent 621e233 commit f3b0bd4

File tree

52 files changed

+2638
-148
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2638
-148
lines changed

src/main/java/com/epam/ta/reportportal/core/tms/controller/TestCaseController.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import com.epam.ta.reportportal.core.tms.dto.DeleteTagsRQ;
66
import com.epam.ta.reportportal.core.tms.dto.TmsTestCaseRQ;
77
import com.epam.ta.reportportal.core.tms.dto.TmsTestCaseRS;
8-
import com.epam.ta.reportportal.core.tms.dto.TmsTestCaseTestFolderRQ;
98
import com.epam.ta.reportportal.core.tms.dto.batch.BatchDeleteTagsRQ;
109
import com.epam.ta.reportportal.core.tms.dto.batch.BatchDeleteTestCasesRQ;
10+
import com.epam.ta.reportportal.core.tms.dto.batch.BatchDuplicateTestCasesRQ;
1111
import com.epam.ta.reportportal.core.tms.dto.batch.BatchPatchTestCasesRQ;
1212
import com.epam.ta.reportportal.core.tms.service.TmsTestCaseService;
1313
import com.epam.ta.reportportal.model.Page;
@@ -384,4 +384,30 @@ public void deleteTagsFromTestCases(@PathVariable("projectKey") String projectKe
384384
deleteRequest.getTagIds()
385385
);
386386
}
387+
388+
/**
389+
* Creates duplicates of multiple test cases with all their related data.
390+
*
391+
* @param projectKey The key of the project.
392+
* @param duplicateRequest Request containing list of test case IDs to duplicate.
393+
* @return A list of data transfer objects ({@link TmsTestCaseRS}) containing details of the
394+
* duplicated test cases.
395+
*/
396+
@PostMapping("/batch/duplicate")
397+
@Operation(
398+
summary = "Duplicate multiple test cases",
399+
description = "Creates full copies of multiple test cases including their default versions, manual scenarios, and attachments.",
400+
tags = {"Batch Operations"}
401+
)
402+
@ApiResponse(responseCode = "200", description = "Test cases duplicated successfully")
403+
public List<TmsTestCaseRS> duplicateTestCases(@PathVariable("projectKey") String projectKey,
404+
@Valid @RequestBody BatchDuplicateTestCasesRQ duplicateRequest,
405+
@AuthenticationPrincipal ReportPortalUser user) {
406+
return tmsTestCaseService.duplicate(
407+
projectExtractor
408+
.extractMembershipDetails(user, EntityUtils.normalizeId(projectKey))
409+
.getProjectId(),
410+
duplicateRequest
411+
);
412+
}
387413
}

src/main/java/com/epam/ta/reportportal/core/tms/db/repository/TmsTestCaseVersionRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
public interface TmsTestCaseVersionRepository extends ReportPortalRepository<TmsTestCaseVersion, Long> {
1313

1414
@Query("SELECT tcv FROM TmsTestCaseVersion tcv "
15-
+ "JOIN FETCH tcv.manualScenario ms "
15+
+ "LEFT JOIN FETCH tcv.manualScenario ms "
1616
+ "LEFT JOIN FETCH ms.textScenario ts "
1717
+ "LEFT JOIN FETCH ms.stepsScenario ss "
1818
+ "LEFT JOIN FETCH ms.attributes t "
@@ -24,7 +24,7 @@ public interface TmsTestCaseVersionRepository extends ReportPortalRepository<Tms
2424
@Query("SELECT new com.epam.ta.reportportal.core.tms.db.entity."
2525
+ "TmsTestCaseDefaultVersionTestCaseId(tcv, tcv.testCase.id) "
2626
+ "FROM TmsTestCaseVersion tcv "
27-
+ "JOIN FETCH tcv.manualScenario ms "
27+
+ "LEFT JOIN FETCH tcv.manualScenario ms "
2828
+ "LEFT JOIN FETCH ms.textScenario ts "
2929
+ "LEFT JOIN FETCH ms.stepsScenario ss "
3030
+ "LEFT JOIN FETCH ms.attributes t "
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
@NoArgsConstructor
1010
@AllArgsConstructor
1111
@Builder
12-
public class TmsTestCaseTestFolderRQ {
12+
public class NewTestFolderRQ {
1313

1414
private String name;
1515

src/main/java/com/epam/ta/reportportal/core/tms/dto/TmsTestCaseRQ.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class TmsTestCaseRQ {
2626

2727
private Long testFolderId;
2828

29-
private TmsTestCaseTestFolderRQ testFolder;
29+
private NewTestFolderRQ testFolder;
3030

3131
private List<TmsAttributeRQ> tags;
3232

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.epam.ta.reportportal.core.tms.dto.batch;
2+
3+
import com.epam.ta.reportportal.core.tms.dto.NewTestFolderRQ;
4+
import com.epam.ta.reportportal.core.tms.validation.ValidTestFolderIdentifier;
5+
import jakarta.validation.Valid;
6+
import jakarta.validation.constraints.NotEmpty;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
9+
import lombok.Data;
10+
import lombok.NoArgsConstructor;
11+
12+
import java.util.List;
13+
14+
@Data
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
@Builder
18+
@Valid
19+
@ValidTestFolderIdentifier
20+
public class BatchDuplicateTestCasesRQ {
21+
22+
@NotEmpty(message = "Test case IDs list cannot be empty")
23+
private List<Long> testCaseIds;
24+
25+
private Long testFolderId;
26+
27+
private NewTestFolderRQ testFolder;
28+
}

src/main/java/com/epam/ta/reportportal/core/tms/mapper/TmsManualScenarioAttributeMapper.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.epam.ta.reportportal.core.tms.mapper;
22

33
import com.epam.ta.reportportal.core.tms.db.entity.TmsAttribute;
4+
import com.epam.ta.reportportal.core.tms.db.entity.TmsManualScenario;
45
import com.epam.ta.reportportal.core.tms.db.entity.TmsManualScenarioAttribute;
6+
import com.epam.ta.reportportal.core.tms.db.entity.TmsManualScenarioAttributeId;
57
import com.epam.ta.reportportal.core.tms.dto.TmsAttributeRQ;
68
import com.epam.ta.reportportal.core.tms.dto.TmsAttributeRS;
79
import com.epam.ta.reportportal.core.tms.mapper.config.CommonMapperConfig;
@@ -49,4 +51,23 @@ public abstract TmsManualScenarioAttribute convertManualScenarioAttribute(
4951
@Mapping(target = "value", source = "tmsManualScenarioAttribute.value")
5052
public abstract TmsAttributeRS convertTmsAttributeRS(
5153
TmsManualScenarioAttribute tmsManualScenarioAttribute);
54+
55+
public TmsManualScenarioAttribute duplicateAttribute(
56+
TmsManualScenarioAttribute originalAttribute,
57+
TmsManualScenario newScenario) {
58+
59+
var duplicatedAttribute = new TmsManualScenarioAttribute();
60+
61+
var newAttributeId = new TmsManualScenarioAttributeId();
62+
newAttributeId.setManualScenarioId(newScenario.getId());
63+
newAttributeId.setAttributeId(originalAttribute.getAttribute().getId());
64+
65+
duplicatedAttribute.setId(newAttributeId);
66+
duplicatedAttribute.setManualScenario(newScenario);
67+
duplicatedAttribute.setAttribute(
68+
originalAttribute.getAttribute()); // using same TmsAttribute
69+
duplicatedAttribute.setValue(originalAttribute.getValue());
70+
71+
return duplicatedAttribute;
72+
}
5273
}

src/main/java/com/epam/ta/reportportal/core/tms/mapper/TmsManualScenarioMapper.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.epam.ta.reportportal.core.tms.mapper;
22

33
import com.epam.ta.reportportal.core.tms.db.entity.TmsManualScenario;
4+
import com.epam.ta.reportportal.core.tms.db.entity.TmsTestCaseVersion;
45
import com.epam.ta.reportportal.core.tms.dto.TmsManualScenarioRQ;
56
import com.epam.ta.reportportal.core.tms.dto.TmsManualScenarioRS;
67
import com.epam.ta.reportportal.core.tms.mapper.config.CommonMapperConfig;
@@ -59,4 +60,16 @@ public TmsManualScenarioRS convert(TmsManualScenario tmsManualScenario) {
5960
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
6061
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
6162
public abstract void patch(@MappingTarget TmsManualScenario target, TmsManualScenario source);
63+
64+
@Mapping(target = "id", ignore = true)
65+
@Mapping(target = "attributes", ignore = true)
66+
@Mapping(target = "textScenario", ignore = true)
67+
@Mapping(target = "stepsScenario", ignore = true)
68+
@Mapping(target = "executionEstimationTime", source = "originalScenario.executionEstimationTime")
69+
@Mapping(target = "linkToRequirements", source = "originalScenario.linkToRequirements")
70+
@Mapping(target = "preconditions", source = "originalScenario.preconditions")
71+
@Mapping(target = "type", source = "originalScenario.type")
72+
@Mapping(target = "testCaseVersion", source = "newVersion")
73+
public abstract TmsManualScenario duplicateManualScenario(TmsManualScenario originalScenario,
74+
TmsTestCaseVersion newVersion);
6275
}

src/main/java/com/epam/ta/reportportal/core/tms/mapper/TmsStepMapper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.epam.ta.reportportal.core.tms.mapper;
22

33
import com.epam.ta.reportportal.core.tms.db.entity.TmsStep;
4+
import com.epam.ta.reportportal.core.tms.db.entity.TmsStepsManualScenario;
45
import com.epam.ta.reportportal.core.tms.dto.TmsManualScenarioStepRQ;
56
import com.epam.ta.reportportal.core.tms.dto.TmsStepRS;
67
import com.epam.ta.reportportal.core.tms.dto.TmsStepsManualScenarioRQ;
@@ -42,4 +43,11 @@ default Set<TmsStep> convertToTmsSteps(TmsStepsManualScenarioRQ testCaseManualSc
4243
void patch(@MappingTarget TmsStep target, TmsStep source);
4344

4445
List<TmsStepRS> convert(Collection<TmsStep> steps);
46+
47+
@Mapping(target = "id", ignore = true)
48+
@Mapping(target = "attachments", ignore = true)
49+
@Mapping(target = "instructions", source = "originalStep.instructions")
50+
@Mapping(target = "expectedResult", source = "originalStep.expectedResult")
51+
@Mapping(target = "stepsManualScenario", source = "newStepsScenario")
52+
TmsStep duplicateStep(TmsStep originalStep, TmsStepsManualScenario newStepsScenario);
4553
}

src/main/java/com/epam/ta/reportportal/core/tms/mapper/TmsStepsManualScenarioMapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ default TmsStepsManualScenario createTmsStepsManualScenario() {
1515
return TmsStepsManualScenario.builder().build();
1616
}
1717

18+
default TmsStepsManualScenario createTmsStepsManualScenario(TmsManualScenario newScenario) {
19+
var tmsStepsManualScenario = createTmsStepsManualScenario();
20+
tmsStepsManualScenario.setManualScenario(newScenario);
21+
return tmsStepsManualScenario;
22+
}
23+
1824
@Mapping(target = "id", source = "id")
1925
@Mapping(target = "executionEstimationTime", source = "executionEstimationTime")
2026
@Mapping(target = "linkToRequirements", source = "linkToRequirements")

src/main/java/com/epam/ta/reportportal/core/tms/mapper/TmsTestCaseAttributeMapper.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.epam.ta.reportportal.core.tms.mapper;
22

33
import com.epam.ta.reportportal.core.tms.db.entity.TmsAttribute;
4+
import com.epam.ta.reportportal.core.tms.db.entity.TmsTestCase;
45
import com.epam.ta.reportportal.core.tms.db.entity.TmsTestCaseAttribute;
6+
import com.epam.ta.reportportal.core.tms.db.entity.TmsTestCaseAttributeId;
57
import com.epam.ta.reportportal.core.tms.dto.TmsAttributeRQ;
68
import com.epam.ta.reportportal.core.tms.dto.TmsAttributeRS;
79
import com.epam.ta.reportportal.core.tms.mapper.config.CommonMapperConfig;
@@ -10,7 +12,6 @@
1012
import java.util.Set;
1113
import java.util.stream.Collectors;
1214
import org.apache.commons.collections4.CollectionUtils;
13-
import org.apache.commons.lang3.StringUtils;
1415
import org.mapstruct.Mapper;
1516
import org.mapstruct.Mapping;
1617
import org.springframework.beans.factory.annotation.Autowired;
@@ -43,10 +44,28 @@ public Set<TmsTestCaseAttribute> convertToTmsTestCaseAttributes(
4344
@Mapping(target = "attribute", source = "tmsAttribute")
4445
@Mapping(target = "id.attributeId", source = "tmsAttribute.id")
4546
@Mapping(target = "value", source = "value")
46-
public abstract TmsTestCaseAttribute convertTmsTestCaseAttribute(TmsAttribute tmsAttribute, String value);
47+
public abstract TmsTestCaseAttribute convertTmsTestCaseAttribute(TmsAttribute tmsAttribute,
48+
String value);
4749

4850
@Mapping(target = "id", source = "tmsTestCaseAttribute.id.attributeId")
4951
@Mapping(target = "key", source = "tmsTestCaseAttribute.attribute.key")
5052
@Mapping(target = "value", source = "tmsTestCaseAttribute.value")
5153
public abstract TmsAttributeRS convertTmsAttributeRS(TmsTestCaseAttribute tmsTestCaseAttribute);
54+
55+
public TmsTestCaseAttribute duplicateTestCaseAttribute(TmsTestCaseAttribute originalAttribute,
56+
TmsTestCase newTestCase) {
57+
var duplicatedAttribute = new TmsTestCaseAttribute();
58+
59+
var newAttributeId = new TmsTestCaseAttributeId();
60+
newAttributeId.setTestCaseId(newTestCase.getId());
61+
newAttributeId.setAttributeId(originalAttribute.getAttribute().getId());
62+
63+
duplicatedAttribute.setId(newAttributeId);
64+
duplicatedAttribute.setTestCase(newTestCase);
65+
duplicatedAttribute.setAttribute(
66+
originalAttribute.getAttribute()); // use same TmsAttribute
67+
duplicatedAttribute.setValue(originalAttribute.getValue());
68+
69+
return duplicatedAttribute;
70+
}
5271
}

0 commit comments

Comments
 (0)