Closes #2227 : ClassificationCategories are ordered as defined in properties

This commit is contained in:
arolfes 2023-04-19 18:57:30 +02:00 committed by Alex
parent f1d23fc152
commit 127c976b41
5 changed files with 49 additions and 28 deletions

View File

@ -175,8 +175,8 @@ class TaskanaConfigurationTest {
assertThat(configuration.getClassificationCategoriesByType()) assertThat(configuration.getClassificationCategoriesByType())
.isEqualTo( .isEqualTo(
Map.ofEntries( Map.ofEntries(
Map.entry("TASK", Set.of("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS")), Map.entry("TASK", List.of("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS")),
Map.entry("DOCUMENT", Set.of("EXTERNAL")))); Map.entry("DOCUMENT", List.of("EXTERNAL"))));
// working time configuration // working time configuration
// //
// assertThat(configuration.getWorkingTimeSchedule()).isEqualTo(defaultWorkingTimeSchedule); // assertThat(configuration.getWorkingTimeSchedule()).isEqualTo(defaultWorkingTimeSchedule);
@ -248,8 +248,8 @@ class TaskanaConfigurationTest {
Map.entry(TaskanaRole.TASK_ROUTER, Set.of("task_router"))); Map.entry(TaskanaRole.TASK_ROUTER, Set.of("task_router")));
// classification configuration // classification configuration
List<String> expectedClassificationTypes = List.of("TYPE_A", "TYPE_B"); List<String> expectedClassificationTypes = List.of("TYPE_A", "TYPE_B");
Map<String, Set<String>> expectedClassificationCategories = Map<String, List<String>> expectedClassificationCategories =
Map.of("TYPE_A", Set.of("CATEGORY_A"), "TYPE_B", Set.of("CATEGORY_B")); Map.of("TYPE_A", List.of("CATEGORY_A"), "TYPE_B", List.of("CATEGORY_B"));
// working time configuration // working time configuration
Map<DayOfWeek, Set<LocalTimeInterval>> expectedWorkingTimeSchedule = Map<DayOfWeek, Set<LocalTimeInterval>> expectedWorkingTimeSchedule =
Map.of(DayOfWeek.MONDAY, Set.of(new LocalTimeInterval(LocalTime.MIN, LocalTime.NOON))); Map.of(DayOfWeek.MONDAY, Set.of(new LocalTimeInterval(LocalTime.MIN, LocalTime.NOON)));
@ -437,7 +437,7 @@ class TaskanaConfigurationTest {
// classification configuration // classification configuration
.classificationTypes(List.of("typeA", "typeB")) .classificationTypes(List.of("typeA", "typeB"))
.classificationCategoriesByType( .classificationCategoriesByType(
Map.of("typeA", Set.of("categoryA"), "typeB", Set.of("categoryB"))) Map.of("typeA", List.of("categoryA"), "typeB", List.of("categoryB")))
// working time configuration // working time configuration
.workingTimeSchedule( .workingTimeSchedule(
Map.of( Map.of(
@ -920,7 +920,7 @@ class TaskanaConfigurationTest {
new TaskanaConfiguration.Builder( new TaskanaConfiguration.Builder(
TestContainerExtension.createDataSourceForH2(), false, "TASKANA") TestContainerExtension.createDataSourceForH2(), false, "TASKANA")
.classificationTypes(List.of("valid")) .classificationTypes(List.of("valid"))
.classificationCategoriesByType(Map.of("does_not_exist", Set.of("a", "b"))); .classificationCategoriesByType(Map.of("does_not_exist", List.of("a", "b")));
ThrowingCallable call = builder::build; ThrowingCallable call = builder::build;
@ -939,7 +939,7 @@ class TaskanaConfigurationTest {
new TaskanaConfiguration.Builder( new TaskanaConfiguration.Builder(
TestContainerExtension.createDataSourceForH2(), false, "TASKANA") TestContainerExtension.createDataSourceForH2(), false, "TASKANA")
.classificationTypes(List.of("type1", "type2")) .classificationTypes(List.of("type1", "type2"))
.classificationCategoriesByType(Map.of("type1", Set.of("a", "b"))); .classificationCategoriesByType(Map.of("type1", List.of("a", "b")));
ThrowingCallable call = builder::build; ThrowingCallable call = builder::build;
@ -990,7 +990,7 @@ class TaskanaConfigurationTest {
new Builder(TestContainerExtension.createDataSourceForH2(), false, "TASKANA") new Builder(TestContainerExtension.createDataSourceForH2(), false, "TASKANA")
.classificationTypes(List.of("a", "b")) .classificationTypes(List.of("a", "b"))
.classificationCategoriesByType( .classificationCategoriesByType(
Map.ofEntries(Map.entry("a", Set.of()), Map.entry("b", Set.of()))) Map.ofEntries(Map.entry("a", List.of()), Map.entry("b", List.of())))
.build(); .build();
assertThat(configuration.getClassificationTypes()).containsExactlyInAnyOrder("A", "B"); assertThat(configuration.getClassificationTypes()).containsExactlyInAnyOrder("A", "B");
@ -1003,13 +1003,14 @@ class TaskanaConfigurationTest {
.classificationTypes(List.of("type_a", "type_b")) .classificationTypes(List.of("type_a", "type_b"))
.classificationCategoriesByType( .classificationCategoriesByType(
Map.ofEntries( Map.ofEntries(
Map.entry("type_a", Set.of("a", "b")), Map.entry("type_b", Set.of("c", "d")))) Map.entry("type_a", List.of("a", "b")),
Map.entry("type_b", List.of("c", "d"))))
.build(); .build();
assertThat(configuration.getClassificationCategoriesByType()) assertThat(configuration.getClassificationCategoriesByType())
.containsExactlyInAnyOrderEntriesOf( .containsExactlyInAnyOrderEntriesOf(
Map.ofEntries( Map.ofEntries(
Map.entry("TYPE_A", Set.of("A", "B")), Map.entry("TYPE_B", Set.of("C", "D")))); Map.entry("TYPE_A", List.of("A", "B")), Map.entry("TYPE_B", List.of("C", "D"))));
} }
@Test @Test

View File

@ -69,7 +69,7 @@ public class TaskanaConfiguration {
// region classification configuration // region classification configuration
private final List<String> classificationTypes; private final List<String> classificationTypes;
private final Map<String, Set<String>> classificationCategoriesByType; private final Map<String, List<String>> classificationCategoriesByType;
// endregion // endregion
// region working time configuration // region working time configuration
@ -147,7 +147,7 @@ public class TaskanaConfiguration {
builder.classificationCategoriesByType.entrySet().stream() builder.classificationCategoriesByType.entrySet().stream()
.collect( .collect(
Collectors.toUnmodifiableMap( Collectors.toUnmodifiableMap(
Entry::getKey, e -> Collections.unmodifiableSet(e.getValue()))); Entry::getKey, e -> Collections.unmodifiableList(e.getValue())));
// working time configuration // working time configuration
this.workingTimeSchedule = this.workingTimeSchedule =
builder.workingTimeSchedule.entrySet().stream() builder.workingTimeSchedule.entrySet().stream()
@ -208,17 +208,17 @@ public class TaskanaConfiguration {
return true; return true;
} }
public Set<String> getAllClassificationCategories() { public List<String> getAllClassificationCategories() {
return this.classificationCategoriesByType.values().stream() return this.classificationCategoriesByType.values().stream()
.flatMap(Collection::stream) .flatMap(Collection::stream)
.collect(Collectors.toSet()); .collect(Collectors.toList());
} }
public Set<String> getClassificationCategoriesByType(String type) { public List<String> getClassificationCategoriesByType(String type) {
return classificationCategoriesByType.getOrDefault(type, Collections.emptySet()); return classificationCategoriesByType.getOrDefault(type, Collections.emptyList());
} }
public Map<String, Set<String>> getClassificationCategoriesByType() { public Map<String, List<String>> getClassificationCategoriesByType() {
return this.classificationCategoriesByType; return this.classificationCategoriesByType;
} }
@ -632,7 +632,7 @@ public class TaskanaConfiguration {
private List<String> classificationTypes = new ArrayList<>(); private List<String> classificationTypes = new ArrayList<>();
@TaskanaProperty("taskana.classification.categories") @TaskanaProperty("taskana.classification.categories")
private Map<String, Set<String>> classificationCategoriesByType = new HashMap<>(); private Map<String, List<String>> classificationCategoriesByType = new HashMap<>();
// endregion // endregion
// region working time configuration // region working time configuration
@ -934,7 +934,7 @@ public class TaskanaConfiguration {
} }
public Builder classificationCategoriesByType( public Builder classificationCategoriesByType(
Map<String, Set<String>> classificationCategoriesByType) { Map<String, List<String>> classificationCategoriesByType) {
this.classificationCategoriesByType = classificationCategoriesByType; this.classificationCategoriesByType = classificationCategoriesByType;
return this; return this;
} }
@ -1180,7 +1180,7 @@ public class TaskanaConfiguration {
e.getKey().toUpperCase(), e.getKey().toUpperCase(),
e.getValue().stream() e.getValue().stream()
.map(String::toUpperCase) .map(String::toUpperCase)
.collect(Collectors.toSet()))) .collect(Collectors.toList())))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue)); .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
roleMap = roleMap =
Arrays.stream(TaskanaRole.values()) Arrays.stream(TaskanaRole.values())

View File

@ -8,7 +8,6 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -73,8 +72,8 @@ class TaskanaConfigAccTest {
assertThat(taskanaConfiguration.getClassificationCategoriesByType()) assertThat(taskanaConfiguration.getClassificationCategoriesByType())
.containsExactlyInAnyOrderEntriesOf( .containsExactlyInAnyOrderEntriesOf(
Map.ofEntries( Map.ofEntries(
Map.entry("TASK", Set.of("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS")), Map.entry("TASK", List.of("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS")),
Map.entry("DOCUMENT", Set.of("EXTERNAL")))); Map.entry("DOCUMENT", List.of("EXTERNAL"))));
} }
private String createNewConfigFile( private String createNewConfigFile(

View File

@ -2,7 +2,6 @@ package pro.taskana.common.rest;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.config.EnableHypermediaSupport; import org.springframework.hateoas.config.EnableHypermediaSupport;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -63,7 +62,7 @@ public class TaskanaEngineController {
*/ */
@GetMapping(path = RestEndpoints.URL_CLASSIFICATION_CATEGORIES) @GetMapping(path = RestEndpoints.URL_CLASSIFICATION_CATEGORIES)
@Transactional(readOnly = true, rollbackFor = Exception.class) @Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<Set<String>> getClassificationCategories( public ResponseEntity<List<String>> getClassificationCategories(
@RequestParam(required = false) String type) { @RequestParam(required = false) String type) {
if (type != null) { if (type != null) {
return ResponseEntity.ok(taskanaConfiguration.getClassificationCategoriesByType(type)); return ResponseEntity.ok(taskanaConfiguration.getClassificationCategoriesByType(type));
@ -90,7 +89,7 @@ public class TaskanaEngineController {
*/ */
@GetMapping(path = RestEndpoints.URL_CLASSIFICATION_CATEGORIES_BY_TYPES) @GetMapping(path = RestEndpoints.URL_CLASSIFICATION_CATEGORIES_BY_TYPES)
@Transactional(readOnly = true, rollbackFor = Exception.class) @Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<Map<String, Set<String>>> getClassificationCategoriesByTypeMap() { public ResponseEntity<Map<String, List<String>>> getClassificationCategoriesByTypeMap() {
return ResponseEntity.ok(taskanaConfiguration.getClassificationCategoriesByType()); return ResponseEntity.ok(taskanaConfiguration.getClassificationCategoriesByType());
} }

View File

@ -52,7 +52,7 @@ class TaskanaEngineControllerIntTest {
} }
@Test @Test
void testClassificationCategories() { void should_ReturnAllClassifications_When_GetClassificationCategories_isCalledWithoutType() {
String url = restHelper.toUrl(RestEndpoints.URL_CLASSIFICATION_CATEGORIES); String url = restHelper.toUrl(RestEndpoints.URL_CLASSIFICATION_CATEGORIES);
HttpEntity<?> auth = new HttpEntity<>(RestHelper.generateHeadersForUser("teamlead-1")); HttpEntity<?> auth = new HttpEntity<>(RestHelper.generateHeadersForUser("teamlead-1"));
@ -60,7 +60,29 @@ class TaskanaEngineControllerIntTest {
TEMPLATE.exchange( TEMPLATE.exchange(
url, HttpMethod.GET, auth, ParameterizedTypeReference.forType(List.class)); url, HttpMethod.GET, auth, ParameterizedTypeReference.forType(List.class));
assertThat(response.getBody()) assertThat(response.getBody())
.containsExactlyInAnyOrder("MANUAL", "EXTERNAL", "AUTOMATIC", "PROCESS"); .containsExactlyInAnyOrder("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS", "EXTERNAL");
}
@Test
void should_ReturnOnlyClassificationsForTypeTask_When_GetClassificationCategories_isCalled() {
String url = restHelper.toUrl(RestEndpoints.URL_CLASSIFICATION_CATEGORIES) + "?type=TASK";
HttpEntity<?> auth = new HttpEntity<>(RestHelper.generateHeadersForUser("teamlead-1"));
ResponseEntity<List<String>> response =
TEMPLATE.exchange(
url, HttpMethod.GET, auth, ParameterizedTypeReference.forType(List.class));
assertThat(response.getBody()).containsExactly("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS");
}
@Test
void should_ReturnOnlyClassificationsForTypeDocument_When_GetClassificationCategories_isCalled() {
String url = restHelper.toUrl(RestEndpoints.URL_CLASSIFICATION_CATEGORIES) + "?type=DOCUMENT";
HttpEntity<?> auth = new HttpEntity<>(RestHelper.generateHeadersForUser("teamlead-1"));
ResponseEntity<List<String>> response =
TEMPLATE.exchange(
url, HttpMethod.GET, auth, ParameterizedTypeReference.forType(List.class));
assertThat(response.getBody()).containsExactly("EXTERNAL");
} }
@Test @Test