TSK-1037: WBDefinitonController accepts existing distributionTargets

This commit is contained in:
BVier 2020-01-23 10:10:09 +01:00 committed by Holger Hagen
parent 659272fda9
commit 0c63dfaea3
2 changed files with 129 additions and 67 deletions

View File

@ -132,25 +132,26 @@ public class WorkbasketDefinitionController {
// STEP 1: update or create workbaskets from the import // STEP 1: update or create workbaskets from the import
for (WorkbasketDefinitionResource definition : definitions) { for (WorkbasketDefinitionResource definition : definitions) {
Workbasket importedWb = workbasketDefinitionAssembler.toModel(definition.getWorkbasket()); Workbasket importedWb = workbasketDefinitionAssembler.toModel(definition.getWorkbasket());
Workbasket workbasket; String newId;
Workbasket wbWithoutId = removeId(importedWb);
if (systemIds.containsKey(logicalId(importedWb))) { if (systemIds.containsKey(logicalId(importedWb))) {
workbasket = workbasketService.updateWorkbasket(importedWb); workbasketService.updateWorkbasket(wbWithoutId);
newId = systemIds.get(logicalId(importedWb));
} else { } else {
Workbasket wbWithoutId = removeId(importedWb); newId = workbasketService.createWorkbasket(wbWithoutId).getId();
workbasket = workbasketService.createWorkbasket(wbWithoutId);
} }
// Since we would have a n² runtime when doing a lookup and updating the access items we // Since we would have a n² runtime when doing a lookup and updating the access items we
// decided to // decided to
// simply delete all existing accessItems and create new ones. // simply delete all existing accessItems and create new ones.
for (WorkbasketAccessItem accessItem : for (WorkbasketAccessItem accessItem :
workbasketService.getWorkbasketAccessItems(workbasket.getId())) { workbasketService.getWorkbasketAccessItems(newId)) {
workbasketService.deleteWorkbasketAccessItem(accessItem.getId()); workbasketService.deleteWorkbasketAccessItem(accessItem.getId());
} }
for (WorkbasketAccessItem authorization : definition.getAuthorizations()) { for (WorkbasketAccessItem authorization : definition.getAuthorizations()) {
workbasketService.createWorkbasketAccessItem(authorization); workbasketService.createWorkbasketAccessItem(authorization);
} }
idConversion.put(importedWb.getId(), workbasket.getId()); idConversion.put(importedWb.getId(), newId);
} }
// STEP 2: update distribution targets // STEP 2: update distribution targets
@ -160,6 +161,8 @@ public class WorkbasketDefinitionController {
for (String oldId : definition.getDistributionTargets()) { for (String oldId : definition.getDistributionTargets()) {
if (idConversion.containsKey(oldId)) { if (idConversion.containsKey(oldId)) {
distributionTargets.add(idConversion.get(oldId)); distributionTargets.add(idConversion.get(oldId));
} else if (systemIds.containsValue(oldId)) {
distributionTargets.add(oldId);
} else { } else {
throw new InvalidWorkbasketException( throw new InvalidWorkbasketException(
String.format( String.format(

View File

@ -13,7 +13,9 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.util.ArrayList; import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
@ -41,18 +43,22 @@ import pro.taskana.impl.WorkbasketAccessItemImpl;
import pro.taskana.rest.resource.WorkbasketDefinitionResource; import pro.taskana.rest.resource.WorkbasketDefinitionResource;
import pro.taskana.sampledata.SampleDataGenerator; import pro.taskana.sampledata.SampleDataGenerator;
/** Integration tests for WorkbasketDefinitionController. */ /**
* Integration tests for WorkbasketDefinitionController.
*/
@TaskanaSpringBootTest @TaskanaSpringBootTest
class WorkbasketDefinitionControllerIntTest { class WorkbasketDefinitionControllerIntTest {
private static RestTemplate template; private static RestTemplate template;
@Value("${taskana.schemaName:TASKANA}") @Value("${taskana.schemaName:TASKANA}")
String schemaName; String schemaName;
ObjectMapper objMapper = new ObjectMapper();
@Autowired RestHelper restHelper; @Autowired
RestHelper restHelper;
@Autowired private DataSource dataSource; @Autowired
private DataSource dataSource;
@BeforeAll @BeforeAll
static void init() { static void init() {
@ -67,12 +73,7 @@ class WorkbasketDefinitionControllerIntTest {
@Test @Test
void testExportWorkbasketFromDomain() { void testExportWorkbasketFromDomain() {
ResponseEntity<List<WorkbasketDefinitionResource>> response = ResponseEntity<List<WorkbasketDefinitionResource>> response = getExportForDomain("DOMAIN_A");
template.exchange(
restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS) + "?domain=DOMAIN_A",
HttpMethod.GET,
restHelper.defaultRequest(),
ParameterizedTypeReference.forType(WorkbasketDefinitionListResource.class));
assertNotNull(response.getBody()); assertNotNull(response.getBody());
assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(HttpStatus.OK, response.getStatusCode());
@ -85,7 +86,7 @@ class WorkbasketDefinitionControllerIntTest {
allAuthorizationsAreEmpty = false; allAuthorizationsAreEmpty = false;
} }
if (allDistributionTargetsAreEmpty if (allDistributionTargetsAreEmpty
&& !workbasketDefinition.getDistributionTargets().isEmpty()) { && !workbasketDefinition.getDistributionTargets().isEmpty()) {
allDistributionTargetsAreEmpty = false; allDistributionTargetsAreEmpty = false;
} }
if (!allAuthorizationsAreEmpty && !allDistributionTargetsAreEmpty) { if (!allAuthorizationsAreEmpty && !allDistributionTargetsAreEmpty) {
@ -98,46 +99,95 @@ class WorkbasketDefinitionControllerIntTest {
@Test @Test
void testExportWorkbasketsFromWrongDomain() { void testExportWorkbasketsFromWrongDomain() {
ResponseEntity<List<WorkbasketDefinitionResource>> response = ResponseEntity<List<WorkbasketDefinitionResource>> response = getExportForDomain("wrongDomain");
template.exchange(
restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS) + "?domain=wrongDomain",
HttpMethod.GET,
restHelper.defaultRequest(),
ParameterizedTypeReference.forType(List.class));
assertEquals(0, response.getBody().size()); assertEquals(0, response.getBody().size());
} }
@Test @Test
void testImportWorkbasket() throws IOException { void testImportEveryWorkbasketFromDomainA() throws IOException {
ResponseEntity<List<WorkbasketDefinitionResource>> response = List<WorkbasketDefinitionResource> wbList = getExportForDomain("DOMAIN_A").getBody();
template.exchange( for (WorkbasketDefinitionResource w : wbList) {
restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS) + "?domain=DOMAIN_A", importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w));
HttpMethod.GET, }
restHelper.defaultRequest(), }
ParameterizedTypeReference.forType(List.class));
List<String> list = new ArrayList<>(); @Test
ObjectMapper objMapper = new ObjectMapper(); void testImportWorkbasketWithoutDistributionTargets() throws IOException {
list.add(objMapper.writeValueAsString(response.getBody().get(0))); WorkbasketDefinitionResource w = getExportForDomain("DOMAIN_A").getBody().get(0);
ResponseEntity<Void> responseImport = importRequest(list); w.setDistributionTargets(new HashSet<>());
assertEquals(HttpStatus.NO_CONTENT, responseImport.getStatusCode());
this.importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w));
w.getWorkbasket().setKey("newKey");
importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w));
}
@Test
void testImportWorkbasketWithDistributionTargetsInImportFile() throws IOException {
List<WorkbasketDefinitionResource> wbList = getExportForDomain("DOMAIN_A").getBody();
WorkbasketDefinitionResource w = wbList.get(0);
w.setDistributionTargets(new HashSet<>());
String letMeBeYourDistributionTarget = w.getWorkbasket().workbasketId;
WorkbasketDefinitionResource w2 = wbList.get(1);
w2.setDistributionTargets(Collections.singleton(letMeBeYourDistributionTarget));
importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w),
objMapper.writeValueAsString(w2));
w.getWorkbasket().setWorkbasketId("fancyNewId");
w2.setDistributionTargets(Collections.singleton("fancyNewId"));
importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w),
objMapper.writeValueAsString(w2));
w.getWorkbasket().setKey("nowImANewWB");
importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w),
objMapper.writeValueAsString(w2));
w2.getWorkbasket().setKey("nowImAlsoANewWB");
importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w),
objMapper.writeValueAsString(w2));
}
@Test
void testImportWorkbasketWithDistributionTargetsInSystem() throws IOException {
List<WorkbasketDefinitionResource> wbList = getExportForDomain("DOMAIN_A").getBody();
wbList.removeIf(definition -> definition.getDistributionTargets().isEmpty());
WorkbasketDefinitionResource w = wbList.get(0);
importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w));
w.getWorkbasket().setKey("new");
importRequest(HttpStatus.NO_CONTENT, objMapper.writeValueAsString(w));
}
@Test
void testImportWorkbasketWithDistributionTargetsNotInSystem() throws IOException {
List<WorkbasketDefinitionResource> wbList = getExportForDomain("DOMAIN_A").getBody();
WorkbasketDefinitionResource w = wbList.get(0);
w.setDistributionTargets(Collections.singleton("invalidWorkbasketId"));
try {
importRequest(HttpStatus.BAD_REQUEST, objMapper.writeValueAsString(w));
fail("Expected http-Status 400");
} catch (HttpClientErrorException e) {
assertEquals(HttpStatus.BAD_REQUEST, e.getStatusCode());
}
w.getWorkbasket().setKey("anotherNewKey");
try {
importRequest(HttpStatus.BAD_REQUEST, objMapper.writeValueAsString(w));
fail("Expected http-Status 400");
} catch (HttpClientErrorException e) {
assertEquals(HttpStatus.BAD_REQUEST, e.getStatusCode());
}
} }
@Test @Test
void testFailOnImportDuplicates() throws IOException { void testFailOnImportDuplicates() throws IOException {
ResponseEntity<List<WorkbasketDefinitionResource>> response = WorkbasketDefinitionResource w = getExportForDomain("DOMAIN_A").getBody().get(0);
template.exchange(
restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS) + "?domain=DOMAIN_A",
HttpMethod.GET,
restHelper.defaultRequest(),
ParameterizedTypeReference.forType(WorkbasketDefinitionListResource.class));
List<String> list = new ArrayList<>();
ObjectMapper objMapper = new ObjectMapper();
list.add(objMapper.writeValueAsString(response.getBody().get(0)));
list.add(objMapper.writeValueAsString(response.getBody().get(0)));
try { try {
importRequest(list); importRequest(HttpStatus.CONFLICT, objMapper.writeValueAsString(w),
objMapper.writeValueAsString(w));
fail("Expected http-Status 409"); fail("Expected http-Status 409");
} catch (HttpClientErrorException e) { } catch (HttpClientErrorException e) {
assertEquals(HttpStatus.CONFLICT, e.getStatusCode()); assertEquals(HttpStatus.CONFLICT, e.getStatusCode());
@ -146,25 +196,33 @@ class WorkbasketDefinitionControllerIntTest {
@Test @Test
void testNoErrorWhenImportWithSameIdButDifferentKeyAndDomain() throws IOException { void testNoErrorWhenImportWithSameIdButDifferentKeyAndDomain() throws IOException {
ResponseEntity<List<WorkbasketDefinitionResource>> response = List<WorkbasketDefinitionResource> wbList = getExportForDomain("DOMAIN_A").getBody();
template.exchange(
restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS) + "?domain=DOMAIN_A",
HttpMethod.GET,
restHelper.defaultRequest(),
ParameterizedTypeReference.forType(WorkbasketDefinitionListResource.class));
List<String> list = new ArrayList<>(); String wbAsItIs = objMapper.writeValueAsString(wbList.get(0));
ObjectMapper objMapper = new ObjectMapper(); WorkbasketDefinitionResource differentLogicalId = wbList.get(0);
WorkbasketDefinitionResource wbDef = response.getBody().get(0); differentLogicalId.getWorkbasket().setKey("new Key for this WB");
list.add(objMapper.writeValueAsString(wbDef));
// breaks the logic - should we really allow this case?
WorkbasketDefinitionResource theDestroyer = wbList.get(1);
theDestroyer.setDistributionTargets(
Collections.singleton(differentLogicalId.getWorkbasket().workbasketId));
importRequest(HttpStatus.NO_CONTENT, wbAsItIs,
objMapper.writeValueAsString(differentLogicalId),
objMapper.writeValueAsString(theDestroyer));
}
private ResponseEntity<List<WorkbasketDefinitionResource>> getExportForDomain(String domain) {
return template.exchange(
restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS) + "?domain=" + domain,
HttpMethod.GET,
restHelper.defaultRequest(),
new ParameterizedTypeReference<List<WorkbasketDefinitionResource>>() {
});
int i = 1; int i = 1;
for (WorkbasketAccessItemImpl wbai : wbDef.getAuthorizations()) { for (WorkbasketAccessItemImpl wbai : wbDef.getAuthorizations()) {
wbai.setAccessId("user_" + i++); wbai.setAccessId("user_" + i++);
} }
wbDef.getWorkbasket().setKey("new Key for this WB");
list.add(objMapper.writeValueAsString(wbDef));
ResponseEntity<Void> responseImport = importRequest(list);
assertEquals(HttpStatus.NO_CONTENT, responseImport.getStatusCode());
} }
@Test @Test
@ -185,10 +243,11 @@ class WorkbasketDefinitionControllerIntTest {
Assertions.assertThrows(HttpClientErrorException.class, () -> importRequest(list)); Assertions.assertThrows(HttpClientErrorException.class, () -> importRequest(list));
} }
private ResponseEntity<Void> importRequest(List<String> clList) throws IOException { private void importRequest(HttpStatus expectedStatus, String... workbasketStrings)
throws IOException {
File tmpFile = File.createTempFile("test", ".tmp"); File tmpFile = File.createTempFile("test", ".tmp");
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(tmpFile), UTF_8); OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(tmpFile), UTF_8);
writer.write(clList.toString()); writer.write(Arrays.asList(workbasketStrings).toString());
writer.close(); writer.close();
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
@ -199,9 +258,9 @@ class WorkbasketDefinitionControllerIntTest {
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
String serverUrl = restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS); String serverUrl = restHelper.toUrl(Mapping.URL_WORKBASKETDEFIITIONS);
return template.postForEntity(serverUrl, requestEntity, Void.class); ResponseEntity<Void> responseImport = template
} .postForEntity(serverUrl, requestEntity, Void.class);
assertEquals(expectedStatus, responseImport.getStatusCode());
static class WorkbasketDefinitionListResource extends ArrayList<WorkbasketDefinitionResource> { static class WorkbasketDefinitionListResource extends ArrayList<WorkbasketDefinitionResource> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;