From 64d78f99cfb175f73001ae397d97cda3fa4f52f3 Mon Sep 17 00:00:00 2001 From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr> Date: Thu, 27 Feb 2025 16:00:58 +0100 Subject: [PATCH 1/4] correction #14 --- .../configuration/BuilderNode.java | 44 +++--- .../application/configuration/Node.java | 42 ++++-- .../configuration/WithDepends.java | 4 +- .../HierarchicalDependancesBuilder.java | 49 +++++-- .../builder/ParentChildRelation.java | 25 ++-- .../data/configuration/hierarchical.json | 136 ++---------------- 6 files changed, 123 insertions(+), 177 deletions(-) diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java index cf36ccf..029882b 100644 --- a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java +++ b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java @@ -2,28 +2,29 @@ package fr.inra.oresing.domain.application.configuration; import org.apache.commons.collections4.CollectionUtils; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; public record BuilderNode( + int level, String nodeName, String componentKey, String columnToLookUpForRecursive, BuilderNode parent, - List<String> children, - List<String> depends, + Set<String> children, + Set<String> depends, Integer order, boolean isRecursive) implements WithDepends { - public BuilderNode(final String nodeName, final String componentKey, String columnToLookUpForRecursive, final BuilderNode parent, final List<String> children, final List<String> depends, final Integer order, final boolean isRecursive) { + public BuilderNode(final int level, final String nodeName, final String componentKey, String columnToLookUpForRecursive, final BuilderNode parent, final Set<String> children, final Set<String> depends, final Integer order, final boolean isRecursive) { + this.level = level; this.nodeName = nodeName; this.componentKey = componentKey; this.columnToLookUpForRecursive = columnToLookUpForRecursive; this.parent = parent; this.children = children; - this.depends = depends.stream().filter(depend->!depend.equals(nodeName)).collect(Collectors.toCollection(ArrayList::new)); + this.depends = depends.stream().filter(depend->!depend.equals(nodeName)).collect(Collectors.toCollection(TreeSet::new)); this.order = order; this.isRecursive = isRecursive; } @@ -35,25 +36,32 @@ public record BuilderNode( .toList(); } - public BuilderNode withAllDepends(final Collection<? extends WithDepends> nodes) { - final List<String> depends = depends(); + protected BuilderNode withAllDepends(final Collection<? extends WithDepends> nodes) { + final Set<String> depends = depends(); + int level = level(); if (CollectionUtils.isEmpty(depends)) { return this; } - List<String> childDepends = depends(); + Function<String, ? extends WithDepends> findNodeByName = name -> nodes.stream() + .filter(node -> node.nodeName().equals(name)) + .findFirst() + .orElse(null); + Set<String> childDepends = depends(); while (CollectionUtils.isNotEmpty(childDepends)) { + level++; childDepends = childDepends.stream() - .map(name -> nodes.stream().filter(node -> node.nodeName().equals(name)).findFirst().orElse(null)).filter(Objects::nonNull) + .map(findNodeByName) + .filter(Objects::nonNull) .map(WithDepends::depends) - .flatMap(List::stream) - .toList(); - depends.addAll(childDepends); + .flatMap(Set::stream) + .collect(Collectors.toSet()); + childDepends.stream().filter(Predicate.not(childDepends::contains)).forEach(childDepends::add); } - return new BuilderNode(nodeName(), componentKey(), columnToLookUpForRecursive(), parent(), children(), depends, order(), isRecursive); + return new BuilderNode(level, nodeName(), componentKey(), columnToLookUpForRecursive(), parent(), children(), depends, order(), isRecursive); } - public BuilderNode withComponentKeyAndRecursive(final String componentKey) { return new BuilderNode( + level(), nodeName(), componentKey, componentKey, @@ -67,6 +75,7 @@ public record BuilderNode( public BuilderNode withComponentKeyAndNotRecursive(final String componentKey, Boolean isParent) { return new BuilderNode( + level(), nodeName(), isParent?componentKey:componentKey(), columnToLookUpForRecursive(), @@ -80,6 +89,7 @@ public record BuilderNode( public BuilderNode withComponentKey(String componentKey) { return new BuilderNode( + level(), nodeName(), componentKey, columnToLookUpForRecursive(), diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java b/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java index bbfbb1a..7660a3d 100644 --- a/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java +++ b/src/main/java/fr/inra/oresing/domain/application/configuration/Node.java @@ -5,15 +5,21 @@ import java.util.function.Function; import java.util.stream.Collectors; public record Node( + Integer level, String nodeName, String componentKey, String columnToLookUpForRecursive, String parent, SortedSet<Node> children, - List<String> depends, + Set<String> depends, Integer order, boolean isRecursive ) implements Comparable<Node> { + public Node { + if(level==null){ + level = 0; + } + } public static SortedSet<Node> buildNode(final Collection<BuilderNode> nodes, final Validation validation) { record Builder(Collection<BuilderNode> fromNodes, Set<Node> buildedNodes, Set<Node> currentParentsNodes, @@ -24,6 +30,7 @@ public record Node( .collect(Collectors.toMap(BuilderNode::nodeName, Function.identity())); final Set<Node> buildedNodes = BuilderNode.getNodeLeaves(nodesWithAllDepends.values()).stream() .map(node -> new Node( + node.level(), node.nodeName(), node.componentKey(), node.columnToLookUpForRecursive(), @@ -41,6 +48,7 @@ public record Node( ); return buildNodesRecursively(buildedNodes, notBuildedNodes.values()); } + private static SortedSet<Node> buildNodesRecursively(Set<Node> buildedNodes, Collection<BuilderNode> notBuildedNodes) { Map<Boolean, List<Node>> nodesByNoParent = buildedNodes.stream() .collect(Collectors.partitioningBy(Node::isRoot)); @@ -48,6 +56,7 @@ public record Node( Map<String, List<Node>> nodeWithParent = nodesByNoParent.get(false).stream() .collect(Collectors.groupingBy(Node::parent)); Function<BuilderNode, Node> findNode = node -> new Node( + node.level(), node.nodeName(), node.componentKey(), node.columnToLookUpForRecursive(), @@ -67,7 +76,7 @@ public record Node( .filter(node -> node.nodeName().equals(parentName)) .findFirst() .orElse(null); - if(parent ==null) { + if (parent == null) { parent = notBuildedNodes.stream() .filter(node -> node.nodeName().equals(parentName)) .map(findNode) @@ -89,20 +98,21 @@ public record Node( } nodesByNoParent = parentNodes.stream() - .collect(Collectors.partitioningBy(Node::isRoot)); + .collect(Collectors.partitioningBy(Node::isRoot)); nodeWithParent = nodesByNoParent.get(false).stream() .collect(Collectors.groupingBy(Node::parent)); } notBuildedNodes.stream() - .map(findNode) - .forEach(rootNodes::add); + .map(findNode) + .forEach(rootNodes::add); return rootNodes; } private Node findNode(final String nodeName) { return buildedNodes().stream().filter(node -> node.nodeName().equals(nodeName)).findFirst().orElse(null); } + private Node findOrCreateNode(final String childNodeName) { final Node childNode = findNode(childNodeName); if (childNode != null) { @@ -113,6 +123,7 @@ public record Node( .findFirst() .orElseThrow(() -> new IllegalArgumentException("pas ici")); return new Node( + builderNode.level(), builderNode.nodeName(), builderNode.componentKey(), builderNode.columnToLookUpForRecursive(), @@ -130,11 +141,11 @@ public record Node( } - private boolean isRoot() { return Optional.ofNullable(parent()).map(String::isEmpty).orElse(true); } - private List<String> dependsRecursively(){ + + private List<String> dependsRecursively() { Set<String> result = new HashSet<>(depends()); children().forEach(child -> result.addAll(child.dependsRecursively())); return new ArrayList<>(result); @@ -145,17 +156,18 @@ public record Node( if (o == null) { return 1; } - if (o.dependsRecursively().contains(nodeName()) ) { - return -o.dependsRecursively().size(); - } - if (dependsRecursively().contains(o.nodeName())) { - return dependsRecursively().size(); + int compareLevel = level().compareTo(o.level()); + if (compareLevel != 0) { + return compareLevel; } + + if (depends().contains(o.nodeName())) return 1; + if (o.depends().contains(nodeName())) return -1; int compareOrder = Optional.ofNullable(order()).orElse(9999).compareTo(Optional.ofNullable(o.order()).orElse(9999)); - if(compareOrder == 0){ - return nodeName().compareTo(o.nodeName()); + if (compareOrder != 0) { + return compareOrder; } - return compareOrder; + return nodeName().compareTo(o.nodeName()); } public Node findNode(final String refType) { diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java b/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java index da6abab..1f3ab80 100644 --- a/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java +++ b/src/main/java/fr/inra/oresing/domain/application/configuration/WithDepends.java @@ -1,9 +1,9 @@ package fr.inra.oresing.domain.application.configuration; import java.util.List; +import java.util.Set; interface WithDepends { - List<String> depends(); - + Set<String> depends(); String nodeName(); } diff --git a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java index 196790b..a99f0bf 100644 --- a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java +++ b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/HierarchicalDependancesBuilder.java @@ -7,6 +7,7 @@ import fr.inra.oresing.domain.application.configuration.checker.ReferenceChecker import java.util.*; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; public record HierarchicalDependancesBuilder( @@ -64,16 +65,16 @@ public record HierarchicalDependancesBuilder( if (dataName.equals(refType)) { Objects.requireNonNull(nodes.put(refType, nodes.containsKey(refType) ? nodes.get(refType).withComponentKeyAndRecursive(componentKey) : - new BuilderNode(refType, componentKey, componentKey, null, new LinkedList<>(), new LinkedList<>(), orderTags.get(refType), isRecursive) + new BuilderNode(0,refType, componentKey, componentKey, null, new TreeSet<>(), new TreeSet<>(), orderTags.get(refType), isRecursive) )).withComponentKeyAndRecursive(componentKey); } else { ParentChildRelation relation = new ParentChildRelation( - nodes.containsKey(refType)? - nodes.get(refType): - new BuilderNode(refType, componentKey, null, null, new LinkedList<>(), new LinkedList<>(), orderTags.get(refType), isRecursive).withComponentKeyAndNotRecursive(componentKey, isParent), - nodes.containsKey(dataName)? - nodes.get(dataName).withComponentKey(componentKey): - new BuilderNode(dataName, componentKey, null,null, new LinkedList<>(), new LinkedList<>(), orderTags.get(dataName), isRecursive), + nodes.containsKey(refType) ? + nodes.get(refType) : + new BuilderNode(0, refType, componentKey, null, null, new TreeSet<>(), new TreeSet<>(), orderTags.get(refType), isRecursive).withComponentKeyAndNotRecursive(componentKey, isParent), + nodes.containsKey(dataName) ? + nodes.get(dataName).withComponentKey(componentKey) : + new BuilderNode(0, dataName, componentKey, null, null, new TreeSet<>(), new TreeSet<>(), orderTags.get(dataName), isRecursive), orderTags.get(dataName) ); if (isParent) { @@ -84,18 +85,50 @@ public record HierarchicalDependancesBuilder( } }); } + //addRecursivlyDepends(nodes.values()); return Node.buildNode( nodes.values(), new Validation(buildErrorWithValidationParams, null, Map.of("domainTags", domainTags))); } + protected static void addRecursivlyDepends(Collection<BuilderNode> nodes) { + Map<String, BuilderNode> nodeMap = nodes.stream() + .collect(Collectors.toMap(BuilderNode::nodeName, node -> node)); + Map<String, Set<String>> dependsByNodeNames = new HashMap<>(); + for (String nodeName : nodeMap.keySet()) { + collectDependencies(nodeName, nodeMap, dependsByNodeNames); + } + nodes.stream() + .forEach(node -> { + node.depends().clear(); + String nodeName = node.nodeName(); + dependsByNodeNames.get(nodeName).stream() + .filter(Predicate.not(nodeName::equals)) + .forEach(node.depends()::add); + }); + } + + private static void collectDependencies(String nodeName, Map<String, BuilderNode> nodeMap, Map<String, Set<String>> dependsByNodeNames) { + BuilderNode node = nodeMap.get(nodeName); + if (node == null) return; + dependsByNodeNames.putIfAbsent(nodeName, new HashSet<>()); + Set<String> dependencies = dependsByNodeNames.get(nodeName); + dependencies.addAll(node.depends()); + for (String childName : node.children()) { + if (!dependsByNodeNames.containsKey(childName)) { + collectDependencies(childName, nodeMap, dependsByNodeNames); + } + dependencies.addAll(dependsByNodeNames.get(childName)); + } + } + public SortedSet<Node> build(Consumer<ValidationParams> buildErrorWithValidationParams) { return buildHierchicalDependances( buildErrorWithValidationParams, checkerdescriptions, orders, data.keySet().stream() - .map(name -> new BuilderNode(name, null, null, null, new LinkedList<>(), new LinkedList<>(), orders.get(name), false)) + .map(name -> new BuilderNode(0, name, null, null, null, new TreeSet<>(), new TreeSet<>(), orders.get(name), false)) .collect(Collectors.toMap(BuilderNode::nodeName, Function.identity())), domainTags ); diff --git a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java index 4afc401..2540b0e 100644 --- a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java +++ b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/ParentChildRelation.java @@ -1,16 +1,16 @@ package fr.inra.oresing.rest.model.configuration.builder; import fr.inra.oresing.domain.application.configuration.BuilderNode; +import groovyjarjarantlr4.runtime.tree.Tree; import org.apache.commons.collections4.CollectionUtils; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; +import java.util.*; record ParentChildRelation(BuilderNode parent, BuilderNode child, Integer order) { ParentChildRelation(final BuilderNode parent, final BuilderNode child, final Integer order) { final BuilderNode parentNode = new BuilderNode( + parent.level(), parent.nodeName(), parent.componentKey(), parent.columnToLookUpForRecursive(), @@ -20,6 +20,7 @@ record ParentChildRelation(BuilderNode parent, BuilderNode child, parent.order(), parent.isRecursive()); final BuilderNode childNode = new BuilderNode( + child.level(), child.nodeName(), child.componentKey(), child.columnToLookUpForRecursive(), @@ -33,30 +34,27 @@ record ParentChildRelation(BuilderNode parent, BuilderNode child, this.order = Optional.ofNullable(order).orElse(child.order()); } - private static List<String> addDependance(final BuilderNode child, final BuilderNode parent) { - final List<String> dependances = new LinkedList<>(); + private static Set<String> addDependance(final BuilderNode child, final BuilderNode parent) { + final Set<String> dependances = new TreeSet<>(); if (CollectionUtils.isNotEmpty(child.depends())) { dependances.addAll(child.depends()); } - if (!dependances.contains(parent.nodeName())) { - dependances.add(parent.nodeName()); - } + dependances.add(parent.nodeName()); return dependances; } - private static List<String> addChildren(final BuilderNode child, final BuilderNode parent) { - final List<String> children = new LinkedList<>(); + private static Set<String> addChildren(final BuilderNode child, final BuilderNode parent) { + final Set<String> children = new TreeSet<>(); if (CollectionUtils.isNotEmpty(parent.children())) { children.addAll(parent.children()); } - if (!children.contains(child.nodeName())) { - children.add(child.nodeName()); - } + children.add(child.nodeName()); return children; } ParentChildRelation setParent() { final BuilderNode parentNode = new BuilderNode( + parent().level(), parent().nodeName(), parent().componentKey(), parent().columnToLookUpForRecursive(), @@ -66,6 +64,7 @@ record ParentChildRelation(BuilderNode parent, BuilderNode child, parent().order(), parent().isRecursive()); final BuilderNode childNode = new BuilderNode( + child().level(), child().nodeName(), child().componentKey(), child.columnToLookUpForRecursive(), diff --git a/src/test/resources/data/configuration/hierarchical.json b/src/test/resources/data/configuration/hierarchical.json index 8320193..051d431 100644 --- a/src/test/resources/data/configuration/hierarchical.json +++ b/src/test/resources/data/configuration/hierarchical.json @@ -1,4 +1,5 @@ [ { + "level" : 0, "nodeName" : "valeur_qualitative_vqe", "componentKey" : null, "columnToLookUpForRecursive" : null, @@ -8,17 +9,19 @@ "order" : 5, "isRecursive" : false }, { + "level" : 0, "nodeName" : "type_de_taxon_ttx", "componentKey" : null, "columnToLookUpForRecursive" : null, "parent" : null, "children" : [ { + "level" : 1, "nodeName" : "taxon_tax", "componentKey" : "ttx_nom", "columnToLookUpForRecursive" : null, "parent" : "type_de_taxon_ttx", "children" : [ ], - "depends" : [ "valeur_qualitative_vqe", "type_de_taxon_ttx" ], + "depends" : [ "type_de_taxon_ttx", "valeur_qualitative_vqe" ], "order" : 9999, "isRecursive" : false } ], @@ -26,157 +29,45 @@ "order" : 6, "isRecursive" : false }, { + "level" : 0, "nodeName" : "type_de_site_tsi", "componentKey" : null, "columnToLookUpForRecursive" : null, "parent" : null, "children" : [ { + "level" : 1, "nodeName" : "site_sit", "componentKey" : "sit_parent", "columnToLookUpForRecursive" : "sit_parent", "parent" : "type_de_site_tsi", "children" : [ { + "level" : 2, "nodeName" : "traitement_tra", "componentKey" : "sit_key", "columnToLookUpForRecursive" : null, "parent" : "site_sit", "children" : [ ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], + "depends" : [ "site_sit" ], "order" : 1, "isRecursive" : false }, { + "level" : 2, "nodeName" : "parcelle_par", "componentKey" : "sit_key", "columnToLookUpForRecursive" : null, "parent" : "site_sit", "children" : [ { + "level" : 3, "nodeName" : "plot_plo", "componentKey" : "sit_key", "columnToLookUpForRecursive" : null, "parent" : "parcelle_par", "children" : [ ], - "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], + "depends" : [ "parcelle_par" ], "order" : 9999, "isRecursive" : false } ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 2, - "isRecursive" : false - } ], - "depends" : [ "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 9999, - "isRecursive" : true - }, { - "nodeName" : "site_sit", - "componentKey" : "sit_parent", - "columnToLookUpForRecursive" : "sit_parent", - "parent" : "type_de_site_tsi", - "children" : [ { - "nodeName" : "traitement_tra", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "site_sit", - "children" : [ ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 1, - "isRecursive" : false - }, { - "nodeName" : "parcelle_par", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "site_sit", - "children" : [ { - "nodeName" : "plot_plo", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "parcelle_par", - "children" : [ ], - "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 9999, - "isRecursive" : false - } ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 2, - "isRecursive" : false - } ], - "depends" : [ "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 9999, - "isRecursive" : true - } ], - "depends" : [ ], - "order" : 9999, - "isRecursive" : false -}, { - "nodeName" : "type_de_site_tsi", - "componentKey" : null, - "columnToLookUpForRecursive" : null, - "parent" : null, - "children" : [ { - "nodeName" : "site_sit", - "componentKey" : "sit_parent", - "columnToLookUpForRecursive" : "sit_parent", - "parent" : "type_de_site_tsi", - "children" : [ { - "nodeName" : "traitement_tra", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "site_sit", - "children" : [ ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 1, - "isRecursive" : false - }, { - "nodeName" : "parcelle_par", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "site_sit", - "children" : [ { - "nodeName" : "plot_plo", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "parcelle_par", - "children" : [ ], - "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 9999, - "isRecursive" : false - } ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 2, - "isRecursive" : false - } ], - "depends" : [ "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 9999, - "isRecursive" : true - }, { - "nodeName" : "site_sit", - "componentKey" : "sit_parent", - "columnToLookUpForRecursive" : "sit_parent", - "parent" : "type_de_site_tsi", - "children" : [ { - "nodeName" : "traitement_tra", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "site_sit", - "children" : [ ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 1, - "isRecursive" : false - }, { - "nodeName" : "parcelle_par", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "site_sit", - "children" : [ { - "nodeName" : "plot_plo", - "componentKey" : "sit_key", - "columnToLookUpForRecursive" : null, - "parent" : "parcelle_par", - "children" : [ ], - "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], - "order" : 9999, - "isRecursive" : false - } ], - "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], + "depends" : [ "site_sit" ], "order" : 2, "isRecursive" : false } ], @@ -188,12 +79,13 @@ "order" : 9999, "isRecursive" : false }, { + "level" : 4, "nodeName" : "data", "componentKey" : "plo_key", "columnToLookUpForRecursive" : null, "parent" : null, "children" : [ ], - "depends" : [ "valeur_qualitative_vqe", "plot_plo", "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], + "depends" : [ "plot_plo", "valeur_qualitative_vqe" ], "order" : 9999, "isRecursive" : false } ] \ No newline at end of file -- GitLab From 6003d67d67146c7fe8eb8bc36afed67c7dba9b61 Mon Sep 17 00:00:00 2001 From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr> Date: Thu, 27 Feb 2025 16:17:19 +0100 Subject: [PATCH 2/4] =?UTF-8?q?Erreur=20oubliee=20(non=20comit=C3=89e)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/inra/oresing/domain/application/Application.java | 2 +- .../oresing/domain/application/configuration/BuilderNode.java | 2 +- .../fr/inra/oresing/domain/application/BuilderNodeTest.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/inra/oresing/domain/application/Application.java b/src/main/java/fr/inra/oresing/domain/application/Application.java index a09d0db..5cc8eee 100644 --- a/src/main/java/fr/inra/oresing/domain/application/Application.java +++ b/src/main/java/fr/inra/oresing/domain/application/Application.java @@ -187,7 +187,7 @@ public class Application extends OreSiEntity { .filter(Optional::isPresent) .map(Optional::get) .map(Node::depends) - .flatMap(List::stream) + .flatMap(Set::stream) .collect(Collectors.toSet()); } diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java index 029882b..7eab92d 100644 --- a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java +++ b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java @@ -36,7 +36,7 @@ public record BuilderNode( .toList(); } - protected BuilderNode withAllDepends(final Collection<? extends WithDepends> nodes) { + public BuilderNode withAllDepends(final Collection<? extends WithDepends> nodes) { final Set<String> depends = depends(); int level = level(); if (CollectionUtils.isEmpty(depends)) { diff --git a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java index d500f50..0503b93 100644 --- a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java @@ -155,7 +155,7 @@ class BuilderNodeTest { .filter(n -> "pem".equals(n.nodeName())) .findFirst() .map(BuilderNode::depends) - .orElse(List.of()).toArray() + .orElse(Set.of()).toArray() ); Assertions.assertArrayEquals( List.of("projet", "sites", "themes", "type_de_sites").toArray(), @@ -163,7 +163,7 @@ class BuilderNodeTest { .filter(n -> "site_theme_datatype".equals(n.nodeName())) .findFirst() .map(BuilderNode::depends) - .orElse(List.of()).toArray() + .orElse(Set.of()).toArray() ); } -- GitLab From 521bdb076abaaf6fc2b0afcb98afa2d423ec5c1e Mon Sep 17 00:00:00 2001 From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr> Date: Thu, 27 Feb 2025 17:39:14 +0100 Subject: [PATCH 3/4] =?UTF-8?q?Ajout=20d'un=20test=20pour=20d=C3=A9tecter?= =?UTF-8?q?=20les=20d=C3=A9pendances=20cycliques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/BuilderNode.java | 50 ++++++++----- .../BadApplicationConfigurationException.java | 2 +- .../configuration/ConfigurationException.java | 1 + .../configuration/builder/RootBuilder.java | 22 ++++-- .../domain/application/BuilderNodeTest.java | 12 ++-- .../configuration/BuilderNodeTest.java | 70 +++++++++++++++++++ .../data/configuration/hierarchical.json | 8 +-- 7 files changed, 131 insertions(+), 34 deletions(-) create mode 100644 src/test/java/fr/inra/oresing/domain/application/configuration/BuilderNodeTest.java diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java index 7eab92d..9541265 100644 --- a/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java +++ b/src/main/java/fr/inra/oresing/domain/application/configuration/BuilderNode.java @@ -1,10 +1,12 @@ package fr.inra.oresing.domain.application.configuration; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException; +import fr.inra.oresing.domain.exceptions.configuration.ConfigurationException; +import lombok.Getter; import org.apache.commons.collections4.CollectionUtils; import java.util.*; -import java.util.function.Function; -import java.util.function.Predicate; import java.util.stream.Collectors; public record BuilderNode( @@ -24,41 +26,57 @@ public record BuilderNode( this.columnToLookUpForRecursive = columnToLookUpForRecursive; this.parent = parent; this.children = children; - this.depends = depends.stream().filter(depend->!depend.equals(nodeName)).collect(Collectors.toCollection(TreeSet::new)); + this.depends = depends.stream().filter(depend -> !depend.equals(nodeName)).collect(Collectors.toCollection(TreeSet::new)); this.order = order; this.isRecursive = isRecursive; } public static List<BuilderNode> getNodeLeaves(final Collection<BuilderNode> builderNodes) { return builderNodes.stream() - .filter(node -> node.parent() != null || node.depends().isEmpty() ) + .filter(node -> node.parent() != null || node.depends().isEmpty()) .filter(node -> CollectionUtils.isEmpty(node.children())) .toList(); } public BuilderNode withAllDepends(final Collection<? extends WithDepends> nodes) { - final Set<String> depends = depends(); - int level = level(); + final Set<String> depends = new HashSet<>(depends()); + int level = 0; + if (CollectionUtils.isEmpty(depends)) { return this; } - Function<String, ? extends WithDepends> findNodeByName = name -> nodes.stream() - .filter(node -> node.nodeName().equals(name)) - .findFirst() - .orElse(null); - Set<String> childDepends = depends(); + + Set<String> processedDependencies = new HashSet<>(depends); + List<String> childDepends = new ArrayList<>(depends); while (CollectionUtils.isNotEmpty(childDepends)) { level++; - childDepends = childDepends.stream() - .map(findNodeByName) + + List<String> newChildDepends = childDepends.stream() + .map(name -> nodes.stream() + .filter(node -> node.nodeName().equals(name)) + .findFirst() + .orElse(null)) .filter(Objects::nonNull) .map(WithDepends::depends) .flatMap(Set::stream) - .collect(Collectors.toSet()); - childDepends.stream().filter(Predicate.not(childDepends::contains)).forEach(childDepends::add); + .filter(dep -> !processedDependencies.contains(dep)) // Éviter les cycles + .toList(); + + if (newChildDepends.contains(nodeName())) { + throw new BadApplicationConfigurationException( + nodeName(), ConfigurationException.CYCLIC_DEPENDANCIES + ); + } + depends.addAll(newChildDepends); + processedDependencies.addAll(newChildDepends); + childDepends = newChildDepends; } + + return new BuilderNode(level, nodeName(), componentKey(), columnToLookUpForRecursive(), parent(), children(), depends, order(), isRecursive); } + + public BuilderNode withComponentKeyAndRecursive(final String componentKey) { return new BuilderNode( level(), @@ -77,7 +95,7 @@ public record BuilderNode( return new BuilderNode( level(), nodeName(), - isParent?componentKey:componentKey(), + isParent ? componentKey : componentKey(), columnToLookUpForRecursive(), parent(), children(), diff --git a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java index 4279f32..4959a36 100644 --- a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java +++ b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/BadApplicationConfigurationException.java @@ -8,7 +8,7 @@ public class BadApplicationConfigurationException extends OreSiTechnicalExceptio private final ConfigurationException configurationException; - private BadApplicationConfigurationException(final String message, final ConfigurationException configurationException) { + public BadApplicationConfigurationException(final String message, final ConfigurationException configurationException) { super(message); this.configurationException = configurationException; } diff --git a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java index a664cab..568b8a5 100644 --- a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java +++ b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java @@ -180,6 +180,7 @@ public enum ConfigurationException { UNSUPPORTED_NAME_APPLICATION, MISSING_NAME_APPLICATION, UNSUPPORTED_VERSION_APPLICATION, + CYCLIC_DEPENDANCIES, MISSING_VERSION_APPLICATION, UNSUPPORTED_OPENADOM_VERSION, EXISTING_OPENADOM_VERSION, diff --git a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java index 5fa9ced..c2309f1 100644 --- a/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java +++ b/src/main/java/fr/inra/oresing/rest/model/configuration/builder/RootBuilder.java @@ -12,6 +12,7 @@ import fr.inra.oresing.domain.application.configuration.internationalization.Int import fr.inra.oresing.domain.application.configuration.internationalization.Internationalizations; import fr.inra.oresing.domain.application.configuration.type.RootType; import fr.inra.oresing.domain.exceptions.SiOreIllegalArgumentException; +import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException; import fr.inra.oresing.domain.exceptions.configuration.ConfigurationException; import fr.inra.oresing.rest.reactive.ReactiveProgression; import lombok.Getter; @@ -133,13 +134,20 @@ public class RootBuilder { i18n = rightRequest.i18n(); final Parsing<Map<String, AdditionalFileDescription>> aditionnalFiles = additionalFilesBuilder.buildAdditionalFiles(rootNode.findPath(OA_ADDITIONAL_FILES), i18n); i18n = aditionnalFiles.i18n(); - - final SortedSet<Node> hierarchicalNodes = HierarchicalDependancesBuilder.of( - checkers, - data.result(), - domainTags - ) - .build(buildErrorWithValidationParams); + SortedSet<Node> hierarchicalNodes = new TreeSet<>(); + try { + hierarchicalNodes = HierarchicalDependancesBuilder.of( + checkers, + data.result(), + domainTags + ) + .build(buildErrorWithValidationParams); + } catch (BadApplicationConfigurationException badApplicationConfigurationException) { + buildError( + badApplicationConfigurationException.getConfigurationException(), + Map.of("nodeName", badApplicationConfigurationException.getMessage()), + OA_DATA); + } final Internationalizations internationalizations = mapper .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .convertValue( diff --git a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java index 0503b93..fb0742a 100644 --- a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java @@ -150,7 +150,7 @@ class BuilderNodeTest { public void TestBuildAllDepends() { final List<BuilderNode> withAllDepends = builderNodes.values().stream().map(node -> node.withAllDepends(builderNodes.values())).toList(); Assertions.assertArrayEquals( - List.of("sites", "especes", "valeurs_qualitative", "unites", "type_de_sites", "variables").toArray(), + List.of("especes", "sites", "type_de_sites", "unites", "valeurs_qualitative", "variables").toArray(), withAllDepends.stream() .filter(n -> "pem".equals(n.nodeName())) .findFirst() @@ -182,15 +182,15 @@ class BuilderNodeTest { projet themes type_de_sites - site_theme_datatype unites variables - variables_et_unites_par_types_de_donnees - especes valeurs_qualitative valeurs_qualitatives - pem - type_de_fichiers""", + type_de_fichiers + variables_et_unites_par_types_de_donnees + especes + site_theme_datatype + pem""", orderedNodes.stream().map(Node::nodeName).collect(Collectors.joining("\n")) ); } diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/BuilderNodeTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/BuilderNodeTest.java new file mode 100644 index 0000000..cba204e --- /dev/null +++ b/src/test/java/fr/inra/oresing/domain/application/configuration/BuilderNodeTest.java @@ -0,0 +1,70 @@ +package fr.inra.oresing.domain.application.configuration; + +import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class BuilderNodeTest { + + @Test + void withAllDepends_shouldAddTransitiveDependencies() { + // Arrange + // Créer un nœud A qui dépend de B + BuilderNode nodeA = new BuilderNode(0, "A", null, null, null, Set.of(), Set.of("B"), null, false); + + // Créer un nœud B qui dépend de C + WithDepends nodeB = mock(WithDepends.class); + when(nodeB.nodeName()).thenReturn("B"); + when(nodeB.depends()).thenReturn(Set.of("C")); + + // Créer un nœud C qui ne dépend de rien + WithDepends nodeC = mock(WithDepends.class); + when(nodeC.nodeName()).thenReturn("C"); + when(nodeC.depends()).thenReturn(Set.of()); + + Collection<WithDepends> allNodes = List.of(nodeB, nodeC); + + // Act + BuilderNode result = nodeA.withAllDepends(allNodes); + + // Assert + assertEquals(2, result.level()); // Le niveau devrait être 1 car il y a une dépendance transitive + assertTrue(result.depends().contains("B")); // Dépendance directe + assertTrue(result.depends().contains("C")); // Dépendance transitive + assertEquals(2, result.depends().size()); // Total des dépendances + } + + @Test + void withAllDepends_shouldThrowExceptionOnCyclicDependency() { + // Arrange + // Créer un nœud A qui dépend de B + BuilderNode nodeA = new BuilderNode(0, "A", null, null, null, Set.of(), Set.of("B"), null, false); + + // Créer un nœud B qui dépend de C + WithDepends nodeB = mock(WithDepends.class); + when(nodeB.nodeName()).thenReturn("B"); + when(nodeB.depends()).thenReturn(Set.of("C")); + + // Créer un nœud C qui dépend de A (créant un cycle) + WithDepends nodeC = mock(WithDepends.class); + when(nodeC.nodeName()).thenReturn("C"); + when(nodeC.depends()).thenReturn(Set.of("A")); + + Collection<WithDepends> allNodes = List.of(nodeB, nodeC); + + // Act & Assert + assertThrows(BadApplicationConfigurationException.class, () -> { + nodeA.withAllDepends(allNodes); + }); + } +} \ No newline at end of file diff --git a/src/test/resources/data/configuration/hierarchical.json b/src/test/resources/data/configuration/hierarchical.json index 051d431..effffa4 100644 --- a/src/test/resources/data/configuration/hierarchical.json +++ b/src/test/resources/data/configuration/hierarchical.json @@ -47,7 +47,7 @@ "columnToLookUpForRecursive" : null, "parent" : "site_sit", "children" : [ ], - "depends" : [ "site_sit" ], + "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], "order" : 1, "isRecursive" : false }, { @@ -63,11 +63,11 @@ "columnToLookUpForRecursive" : null, "parent" : "parcelle_par", "children" : [ ], - "depends" : [ "parcelle_par" ], + "depends" : [ "parcelle_par", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], "order" : 9999, "isRecursive" : false } ], - "depends" : [ "site_sit" ], + "depends" : [ "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], "order" : 2, "isRecursive" : false } ], @@ -85,7 +85,7 @@ "columnToLookUpForRecursive" : null, "parent" : null, "children" : [ ], - "depends" : [ "plot_plo", "valeur_qualitative_vqe" ], + "depends" : [ "parcelle_par", "plot_plo", "site_sit", "type_de_site_tsi", "valeur_qualitative_vqe" ], "order" : 9999, "isRecursive" : false } ] \ No newline at end of file -- GitLab From f08c2eb9fabc445ae8b2bc97e4817b52b33223bf Mon Sep 17 00:00:00 2001 From: Philippe Tcherniatinsky <philippe.tcherniatinsky@inra.fr> Date: Tue, 25 Feb 2025 13:02:55 +0100 Subject: [PATCH 4/4] =?UTF-8?q?Modification=20de=20la=20strat=C3=A9gie=20d?= =?UTF-8?q?e=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 24 +- .gitlab_test_mvn.yml | 161 ++++------ pom.xml | 300 +++++++++++++----- src/test/java/TestConfigurationSuite.java | 10 - .../java/fr/inra/oresing/ApplicationTest.java | 2 +- .../domain/LocalDateTimeRangeTest.java | 2 +- .../application/BrokenConfigurationTest.java | 3 +- .../domain/application/BuilderNodeTest.java | 2 +- .../configuration/ConfigurationTest.java | 2 +- .../application/configuration/LtreeTest.java | 2 +- .../configuration/SubmissionTest.java | 5 +- .../configuration/date/DatePatternTest.java | 2 +- .../checker/type/ReferenceTypeTest.java | 1 + .../data/read/DataHeaderReaderTest.java | 1 + .../domain/groovy/GroovyExpressionTest.java | 2 +- .../InternationalizationDisplayTest.java | 2 +- .../massimport/BuildFileHeaderTest.java | 2 + .../AuthenticationServiceTest.java | 3 +- .../data/read/bundle/FileContentTest.java | 2 + .../index/AuthorizationIndexTest.java | 1 + .../ApplicationConfigurationServiceTest.java | 2 +- .../rest/AuthorizationResourcesTest.java | 2 + .../fr/inra/oresing/rest/MigrationTest.java | 4 +- .../fr/inra/oresing/rest/MultiYamlTest.java | 2 +- .../inra/oresing/rest/OreSiResourcesTest.java | 41 ++- .../oresing/rest/TestReferencesErrors.java | 43 +-- .../CreateAuthorizationRequestTest.java | 4 +- ...ownloadDatasetQueryAdvancedSearchTest.java | 2 +- .../model/data/DownloadDatasetQueryTest.java | 2 +- .../rest/services/RelationalServiceTest.java | 2 + 30 files changed, 363 insertions(+), 270 deletions(-) delete mode 100644 src/test/java/TestConfigurationSuite.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 579dec6..22e131b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,7 +41,15 @@ stages: maven_build: image: maven:3.9.4-amazoncorretto-21 stage: build - script: mvn --batch-mode clean compile + script: + - mvn --batch-mode clean compile test-compile -DskipTests + cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - .m2/repository/ + artifacts: + paths: + - target/ tags: - docker rules: @@ -53,6 +61,8 @@ include: # - local: .gitlab_package.yml - local: .gitlab_build_doc.yml path: . + - local: .gitlab_test_mvn.yml + path: . - local: .gitlab-ci_docker.yml path: . #- local: .gitlab-ci_sonar.yml @@ -60,15 +70,3 @@ include: # - local: .gitlab_build_doc2.yml -maven_test_configuration_build: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_configuration_build - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" diff --git a/.gitlab_test_mvn.yml b/.gitlab_test_mvn.yml index bec71a4..fd40243 100644 --- a/.gitlab_test_mvn.yml +++ b/.gitlab_test_mvn.yml @@ -1,118 +1,71 @@ -maven_test_rest_1: +.st_test_template: &test_template image: maven:3.9.4-amazoncorretto-21 stage: test - script: mvn --batch-mode clean test -Ptest_rest_1 - tags: - - docker artifacts: + when: always reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" + junit: target/surefire-reports/*.xml + paths: + - target/surefire-reports/ + script: + - | + # Par défaut, si le job est nommé "test_all" on ne filtre pas (profil all-tests) + # Sinon, on retire le préfixe "test_" et on remplace le premier underscore par un point. + if [[ "$CI_JOB_NAME" == "test_all" ]]; then + export MAVEN_PROFILE=all-tests + else + export MAVEN_PROFILE=$(echo "$CI_JOB_NAME" | sed -e 's/^test_//' -e 's/_/./') + fi + echo "Utilisation du profil Maven: $MAVEN_PROFILE" + - mvn test -P$MAVEN_PROFILE -maven_test_rest_1_ACBB: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_rest_1_ACBB - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" +test_core_basic: + <<: *test_template -maven_test_rest_1_Haute_Frequence: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_rest_1_Haute_Frequence - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" +test_core_config: + <<: *test_template -maven_test_rest_2: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_rest_2 - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" +test_core_auth: + <<: *test_template -maven_test_rest_others: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_rest_others - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" +test_domain_model: + <<: *test_template -maven_test_checker: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_checker - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" +test_domain_checker: + <<: *test_template -maven_test_model: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_model - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" +test_domain_i18n: + <<: *test_template -maven_test_persistence: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: mvn --batch-mode clean test -Ptest_persistence - tags: - - docker - artifacts: - reports: - junit: - - target/surefire-reports/TEST-*.xml - rules: - - if: $CI_JOB_MANUAL!= "true" +test_integration_rest: + <<: *test_template +test_integration_persistence: + <<: *test_template +test_app_monsoere: + <<: *test_template -maven_swagger_build: - image: maven:3.9.4-amazoncorretto-21 - stage: test - script: - - mvn --batch-mode clean test -Pswagger_build - tags: - - docker - artifacts: - paths: - - documentations/ - rules: - - if: $CI_JOB_MANUAL!= "true" +test_app_haute_frequence: + <<: *test_template + +test_app_acbb: + <<: *test_template + +test_app_olac: + <<: *test_template + +test_app_foret: + <<: *test_template + +test_app_pattern: + <<: *test_template + +test_app_recursivity: + <<: *test_template + +test_app_teledetection: + <<: *test_template + +test_no-tags: + <<: *test_template diff --git a/pom.xml b/pom.xml index e618948..721908f 100644 --- a/pom.xml +++ b/pom.xml @@ -88,7 +88,8 @@ <!--sonar--> <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> - <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco.exec</sonar.coverage.jacoco.xmlReportPaths> + <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco.exec + </sonar.coverage.jacoco.xmlReportPaths> <sonar.language>java</sonar.language> <sonar.projectKey>anaee-dev_openadom_backend_caf3d282-990e-4907-8f15-44424cf3c8b0</sonar.projectKey> <sonar.projectName>openADOM-backend</sonar.projectName> @@ -400,6 +401,12 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <!-- Utilisez une version récente pour être certain du support adéquat de JUnit 5 --> + <version>3.0.0-M5</version> + </plugin> </plugins> </build> <profiles> @@ -442,224 +449,345 @@ </plugins> </build> </profile> + <profile> + <id>core.basic</id> + <properties> + <junit.jupiter.tags>core.basic</junit.jupiter.tags> + </properties> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> + <configuration> + <groups>${junit.jupiter.tags}</groups> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <!-- Profil pour les tests tagués "core.config" --> <profile> - <id>test_checker</id> + <id>core.config</id> + <properties> + <junit.jupiter.tags>core.config</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <parallel>classesAndMethods</parallel> - <threadCount>4</threadCount> - <perCoreThreadCount>true</perCoreThreadCount> - <parallelTestsTimeoutInSeconds>300</parallelTestsTimeoutInSeconds> - <parallelTestsTimeoutForcedInSeconds>600</parallelTestsTimeoutForcedInSeconds> - <parallelOptimized>true</parallelOptimized> - - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <includes> - <include>fr/inra/oresing/checker/**.java</include> - </includes> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <!-- Profil pour les tests tagués "core.auth" --> <profile> - <id>test_model</id> + <id>core.auth</id> + <properties> + <junit.jupiter.tags>core.auth</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <includes> - <include>fr/inra/oresing/model/**Test.java</include> - <include>fr/inra/oresing/model/**/**Test.java</include> - </includes> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <!-- Profil pour les tests tagués "domain.model" --> <profile> - <id>test_persistence</id> + <id>domain.model</id> + <properties> + <junit.jupiter.tags>domain.model</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <includes> - <include>fr/inra/oresing/persistence/**Test.java</include> - </includes> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <!-- Profil pour les tests tagués "domain.checker" --> <profile> - <id>test_rest_1</id> + <id>domain.checker</id> + <properties> + <junit.jupiter.tags>domain.checker</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <includes> - <include>fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java</include> - <include>fr/inra/oresing/rest/Migration.java</include> - <include>fr/inra/oresing/rest/MultiYaml.java</include> - <include>fr/inra/oresing/rest/RelationalService.java</include> - <include>fr/inra/oresing/rest/TestReferencesErrors.java</include> - </includes> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <!-- Profil pour les tests tagués "domain.i18n" --> <profile> - <id>test_rest_1_Haute_Frequence</id> + <id>domain.i18n</id> + <properties> + <junit.jupiter.tags>domain.i18n</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <groups>HAUTE_FREQUENCE_TEST</groups> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <!-- Profil pour les tests tagués "integration.rest" --> <profile> - <id>test_rest_1_ACBB</id> + <id>integration.rest</id> + <properties> + <junit.jupiter.tags>integration.rest</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <groups>ACBB_TEST</groups> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <!-- Profil pour les tests tagués "integration.persistence" --> <profile> - <id>test_rest_2</id> + <id>integration.persistence</id> + <properties> + <junit.jupiter.tags>integration.persistence</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <includes> - </includes> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <!-- Profils pour les tests applicatifs --> <profile> - <id>swagger_build</id> + <id>app.monsoere</id> + <properties> + <junit.jupiter.tags>app.monsoere</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <groups>SWAGGER_BUILD</groups> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + <profile> - <id>test_rest_others</id> + <id>app.haute_frequence</id> + <properties> + <junit.jupiter.tags>app.haute_frequence</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <groups>OTHERS_TEST</groups> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + <profile> - <id>test_rest_model_request_test</id> + <id>app.acbb</id> + <properties> + <junit.jupiter.tags>app.acbb</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <forkCount>4</forkCount> - <reuseForks>false</reuseForks> - <testSourceDirectory>src/test</testSourceDirectory> - <testFailureIgnore>false</testFailureIgnore> - <groups>MODEL_REQUEST_TEST</groups> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + <profile> - <id>test_configuration_build</id> + <id>app.olac</id> + <properties> + <junit.jupiter.tags>app.olac</junit.jupiter.tags> + </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> <configuration> - <includes> - <include>TestConfigurationSuite</include> - </includes> + <groups>${junit.jupiter.tags}</groups> </configuration> </plugin> </plugins> </build> </profile> + + <profile> + <id>app.foret</id> + <properties> + <junit.jupiter.tags>app.foret</junit.jupiter.tags> + </properties> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> + <configuration> + <groups>${junit.jupiter.tags}</groups> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + <profile> + <id>app.pattern</id> + <properties> + <junit.jupiter.tags>app.pattern</junit.jupiter.tags> + </properties> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> + <configuration> + <groups>${junit.jupiter.tags}</groups> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + <profile> + <id>app.recursivity</id> + <properties> + <junit.jupiter.tags>app.recursivity</junit.jupiter.tags> + </properties> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> + <configuration> + <groups>${junit.jupiter.tags}</groups> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + <profile> + <id>app.teledetection</id> + <properties> + <junit.jupiter.tags>app.teledetection</junit.jupiter.tags> + </properties> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> + <configuration> + <groups>${junit.jupiter.tags}</groups> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>no-tags</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0-M5</version> + <configuration> + <argLine>-XX:+EnableDynamicAgentLoading</argLine> + <excludedGroups> + SUITE,core.basic,core.config,core.auth, + domain.model,domain.checker,domain.i18n, + integration.rest,integration.persistence, + app.monsoere,app.haute_frequence,app.acbb, + app.olac,app.foret,app.pattern,app.recursivity,app.teledetection + </excludedGroups> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>all-tests</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + </profile> </profiles> </project> \ No newline at end of file diff --git a/src/test/java/TestConfigurationSuite.java b/src/test/java/TestConfigurationSuite.java deleted file mode 100644 index 43754ee..0000000 --- a/src/test/java/TestConfigurationSuite.java +++ /dev/null @@ -1,10 +0,0 @@ -import org.junit.jupiter.api.Tag; -import org.junit.platform.suite.api.*; - -@Suite -@SelectPackages("fr.inra.oresing") -@SuiteDisplayName("Tests for BrokenAdom") -@Tag("MODEL_REQUEST_TEST") -@IncludeTags({"UPLOAD_BUNDLE", "SUITE"}) -public class TestConfigurationSuite { -} diff --git a/src/test/java/fr/inra/oresing/ApplicationTest.java b/src/test/java/fr/inra/oresing/ApplicationTest.java index f5f2ec4..c7398cf 100644 --- a/src/test/java/fr/inra/oresing/ApplicationTest.java +++ b/src/test/java/fr/inra/oresing/ApplicationTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import java.util.UUID; -@org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("core.basic") public class ApplicationTest { @Test public void test() { diff --git a/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java b/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java index d649aff..964b7a6 100644 --- a/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java +++ b/src/test/java/fr/inra/oresing/domain/LocalDateTimeRangeTest.java @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; -@org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("domain.model") public class LocalDateTimeRangeTest { /*@Test diff --git a/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java b/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java index de3f493..a277570 100644 --- a/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/BrokenConfigurationTest.java @@ -8,7 +8,8 @@ import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; -@org.junit.jupiter.api.Tag("SUITE") + +@org.junit.jupiter.api.Tag("core.config") class ConfigurationTest { diff --git a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java index fb0742a..0f765ff 100644 --- a/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/BuilderNodeTest.java @@ -12,7 +12,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; -@org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("core.config") class BuilderNodeTest { final Map<String, BuilderNode> builderNodes = Arrays.stream(new JsonRowMapper<BuilderNode>().readValue(""" [ diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java index 6ba94dc..82fb90c 100644 --- a/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/configuration/ConfigurationTest.java @@ -12,7 +12,7 @@ import org.mockito.Mockito; import java.util.*; -@org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("core.config") class ConfigurationTest { public static final JsonRowMapper MAPPER = new JsonRowMapper<ComponentDescription>(); diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java index 80e5897..1de2049 100644 --- a/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/configuration/LtreeTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.*; -@Tag("SUITE") +@Tag("core.config") class LtreeTest { @Test void assertThatAStringWithInvalidCharactersCanBeEncodedTwice(){ diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java index 5955b26..b171d49 100644 --- a/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/configuration/SubmissionTest.java @@ -3,9 +3,7 @@ package fr.inra.oresing.domain.application.configuration; import fr.inra.oresing.domain.BinaryFileDataset; import fr.inra.oresing.domain.exceptions.authorization.AuthorizationRequestException; import fr.inra.oresing.domain.exceptions.authorization.SiOreAuthorizationRequestException; -import groovy.lang.Tuple; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.util.LinkedList; @@ -13,6 +11,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; +@Tag("domain.model") class SubmissionTest { final Submission submission = new Submission( SubmissionType.OA_VERSIONING, diff --git a/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java b/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java index 10962c5..dd5c0b3 100644 --- a/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java +++ b/src/test/java/fr/inra/oresing/domain/application/configuration/date/DatePatternTest.java @@ -10,7 +10,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.Objects; -@org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("domain.model") class DatePatternTest { public static final String DATE = "12/01/1925"; public static final String TIME = "12:23:56"; diff --git a/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java b/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java index d9a27bb..80dc060 100644 --- a/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java +++ b/src/test/java/fr/inra/oresing/domain/checker/type/ReferenceTypeTest.java @@ -15,6 +15,7 @@ import org.mockito.Mockito; import java.util.UUID; +@Tag("domain.checker") class ReferenceTypeTest { LineChecker.Transformer transformer; ImmutableMap<DataValue.LineIdentityColumnName, ImmutableSet<UUID>> referenceValues; diff --git a/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java b/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java index 17efa81..b1867ba 100644 --- a/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java +++ b/src/test/java/fr/inra/oresing/domain/data/read/DataHeaderReaderTest.java @@ -32,6 +32,7 @@ import java.util.Map; import java.util.stream.Collectors; @Tag("SUITE") +@Tag("domain.model") class DataHeaderReaderTest { Iterator<CSVRecord> lineIterator; DataHeaderReader reader; diff --git a/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java b/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java index d5c2119..2d44f51 100644 --- a/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java +++ b/src/test/java/fr/inra/oresing/domain/groovy/GroovyExpressionTest.java @@ -17,7 +17,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; -@Tag("SUITE") +@Tag("domain.model") class GroovyExpressionTest { private Map<String, Object> context; diff --git a/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java b/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java index f388752..1e2c26e 100644 --- a/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java +++ b/src/test/java/fr/inra/oresing/domain/internationalization/InternationalizationDisplayTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import java.util.List; -@org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("domain.i18n") public class InternationalizationDisplayTest { final String pattern = "column 1 {column1} column 2 {column2} column 3 {column3} end"; diff --git a/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java b/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java index 32a14e1..7b967bf 100644 --- a/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java +++ b/src/test/java/fr/inra/oresing/domain/massimport/BuildFileHeaderTest.java @@ -5,6 +5,7 @@ import fr.inra.oresing.domain.ConfigurationBuiderTestBuilder; import fr.inra.oresing.domain.application.configuration.*; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.Logger; @@ -15,6 +16,7 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.function.Function; +@Tag("domain.model") public class BuildFileHeaderTest { private static final Logger log = LoggerFactory.getLogger(BuildFileHeaderTest.class); static final String RESOURCE_PATH = "fr/inra/oresing/domain/massimport/massimport.yaml"; diff --git a/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java b/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java index 8c129eb..5778b07 100644 --- a/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java +++ b/src/test/java/fr/inra/oresing/persistence/AuthenticationServiceTest.java @@ -45,13 +45,14 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @ActiveProfiles("testmail") -@SpringBootTest(classes = {OreSiNg.class, OreSiNg.MailSenderForTest.class, TestDatabaseConfig.class}) +@SpringBootTest(classes = {OreSiNg.class, OreSiNg.MailSenderForTest.class, TestDatabaseConfig.class, OreSiNg.class, TestDatabaseConfig.class}) @TestPropertySource(locations = "classpath:/application-tests.properties") @AutoConfigureWebMvc @AutoConfigureMockMvc(print = MockMvcPrint.NONE) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @Tag("SUITE") +@Tag("core.auth") public class AuthenticationServiceTest { @Value("${spring.mail.from}") String mailFrom; diff --git a/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java b/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java index d0dd693..2ae6fd8 100644 --- a/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java +++ b/src/test/java/fr/inra/oresing/persistence/data/read/bundle/FileContentTest.java @@ -5,6 +5,7 @@ import fr.inra.oresing.domain.application.configuration.Submission; import fr.inra.oresing.domain.application.configuration.SubmissionType; import org.assertj.core.api.AssertJProxySetup; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -14,6 +15,7 @@ import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; +@Tag("domain.model") class FileContentTest { final Submission submission = new Submission( SubmissionType.OA_VERSIONING, diff --git a/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java b/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java index df59246..9861401 100644 --- a/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java +++ b/src/test/java/fr/inra/oresing/persistence/index/AuthorizationIndexTest.java @@ -18,6 +18,7 @@ import java.util.*; import static org.junit.jupiter.api.Assertions.assertEquals; +@org.junit.jupiter.api.Tag("core.auth") class AuthorizationIndexTest { private AuthorizationIndex authorizationIndex; diff --git a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java index 30b034e..c22327b 100644 --- a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java +++ b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java @@ -16,7 +16,6 @@ import fr.inra.oresing.rest.services.ApplicationConfigurationService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -47,6 +46,7 @@ import static org.junit.jupiter.api.Assertions.*; @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) @Slf4j @org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("core.config") public class ApplicationConfigurationServiceTest { public static final Map<String, List<ReactiveResult>> errors = new HashMap<>(); diff --git a/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java b/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java index a51eee5..9c3923f 100644 --- a/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java +++ b/src/test/java/fr/inra/oresing/rest/AuthorizationResourcesTest.java @@ -19,6 +19,7 @@ import org.hamcrest.core.IsEqual; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -53,6 +54,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureMockMvc(print = MockMvcPrint.NONE) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @Slf4j +@Tag("core.auth") public class AuthorizationResourcesTest { @Autowired diff --git a/src/test/java/fr/inra/oresing/rest/MigrationTest.java b/src/test/java/fr/inra/oresing/rest/MigrationTest.java index 6612694..58d3b68 100644 --- a/src/test/java/fr/inra/oresing/rest/MigrationTest.java +++ b/src/test/java/fr/inra/oresing/rest/MigrationTest.java @@ -5,6 +5,7 @@ import fr.inra.oresing.TestDatabaseConfig; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -25,12 +26,13 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @ActiveProfiles("testmail") +@Tag("integration.persistence") @SpringBootTest(classes = {OreSiNg.class, TestDatabaseConfig.class}) @TestPropertySource(locations = "classpath:/application-tests.properties") @AutoConfigureWebMvc @AutoConfigureMockMvc(print = MockMvcPrint.NONE) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @Slf4j public class MigrationTest { diff --git a/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java b/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java index 662994b..c0e6d38 100644 --- a/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java +++ b/src/test/java/fr/inra/oresing/rest/MultiYamlTest.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Map; -@org.junit.jupiter.api.Tag("SUITE") +@org.junit.jupiter.api.Tag("core.basic") public class MultiYamlTest { @Test public void testYaml() throws IOException { diff --git a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java index 98a25f9..e00c830 100644 --- a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java +++ b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java @@ -90,6 +90,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureWebMvc @AutoConfigureMockMvc(print = MockMvcPrint.NONE) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +@Tag("integration.rest") @Slf4j public class OreSiResourcesTest { @@ -168,7 +169,7 @@ public class OreSiResourcesTest { } @Test - @Tag("SUITE") + @Tag("core.basic") public void testDatabaseUser() throws SQLException { String currentUser = getCurrentDatabaseUser(); Assertions.assertEquals("openAdomTechUser", currentUser, "Le test devrait être exécuté en tant qu'openadomTechUser"); @@ -187,7 +188,7 @@ public class OreSiResourcesTest { @Test @Tag("SWAGGER_BUILD") - @Tag("SUITE") + @Tag("integration.rest") public void services_model() throws Exception { final String services_model = mockMvc.perform(get("/api-docs") .accept(MediaType.APPLICATION_JSON_VALUE) @@ -248,7 +249,7 @@ public class OreSiResourcesTest { @Test @Tag("OTHERS_TEST") - @Tag("SUITE") + @Tag("app.monsoere") @Tag("MONSOERE") public void addApplicationMonsore() throws Exception { final String appId; @@ -808,14 +809,14 @@ public class OreSiResourcesTest { @Test @Tag("OTHERS_TEST") - @Tag("SUITE") + @Tag("integration.rest") public void buildSwaggerApi() throws Exception { mockMvc.perform(get("/v2/api-docs")); } @Test @Tag("OTHERS_TEST") - @Tag("SUITE") + @Tag("domain.model") public void testMultiplicityMany() throws Exception { final URL resource = getClass().getResource(Fixtures.getMultiplicityMany()); try (final InputStream in = Objects.requireNonNull(resource).openStream()) { @@ -887,7 +888,7 @@ public class OreSiResourcesTest { } @Test - @Tag("OTHERS_TEST") + @Tag("core.config") @Disabled public void addApplicationWithComputedComponentsWithReferences() throws Exception { final URL resource = getClass().getResource(Fixtures.getApplicationWithComputedComponentsWithReferences()); @@ -950,7 +951,7 @@ public class OreSiResourcesTest { @Test @Tag("OTHERS_TEST") - @Tag("SUITE") + @Tag("app.monsoere") @Tag("MONSOERE") public void addApplicationMonsoreWithRepository() throws Exception { URL resource = getClass().getResource(Fixtures.getMonsoreApplicationConfigurationWithRepositoryResourceName()); @@ -1733,6 +1734,7 @@ public class OreSiResourcesTest { } @Test + @Tag("app.teledetection") @Disabled public void addApplicationTeledetection() throws Exception { final URL resource = getClass().getResource(Fixtures.getTeledetectionConfigurationResourceName()); @@ -1993,6 +1995,7 @@ public class OreSiResourcesTest { * The only authorizations that can be put on are on none or all values. */ @Test + @Tag("core.config") @Disabled public void testProgressiveYamlWithoutAuthorization() throws Exception { final String authorizationId; @@ -2099,6 +2102,7 @@ public class OreSiResourcesTest { @Test @Disabled + @Tag("core.config") public void testProgressiveYamlWithEmptyDatagroup() throws Exception { final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("yamlWithEmptyDatagroup")); @@ -2121,6 +2125,7 @@ public class OreSiResourcesTest { */ @Test @Disabled + @Tag("core.config") public void testProgressiveYamlWithNoReference() throws Exception { final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testAuthorizationScopeWithoutReference")); @@ -2146,6 +2151,7 @@ public class OreSiResourcesTest { @Test @Disabled + @Tag("core.config") public void testProgressiveYamlWithoutAuthorizationScope() { final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testProgressiveYamlWithoutAuthorizationScope")); @@ -2165,6 +2171,7 @@ public class OreSiResourcesTest { @Test @Disabled + @Tag("core.config") public void testProgressiveYamlWithoutTimescopeScope() { final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testProgressiveYamlWithoutTimescopeScope")); @@ -2188,6 +2195,7 @@ public class OreSiResourcesTest { */ @Test @Disabled + @Tag("core.config") public void testProgressiveWithReferenceAndNoHierarchicalReferenceYaml() throws Exception { final URL resource = getClass().getResource(Fixtures.getProgressiveYaml().get("testAuthorizationScopeWithReferenceAndNoHierarchicalReference")); @@ -2242,8 +2250,7 @@ public class OreSiResourcesTest { @Test @Tag("SUITE") - - + @Tag("app.recursivity") public void testRecursivity() throws Exception { final URL resource = getClass().getResource(Fixtures.getRecursivityApplicationConfigurationResourceName()); @@ -2329,6 +2336,7 @@ public class OreSiResourcesTest { @Test @Tag("SUITE") + @Tag("app.pattern") public void testPattern() throws Exception { final URL resource = getClass().getResource(Fixtures.getPatternApplicationConfigurationResourceName()); @@ -2443,6 +2451,7 @@ public class OreSiResourcesTest { @Test @Tag("SUITE") + @Tag("core.config") public void testComputedWithNaturalKeyColumns() throws Exception { final URL resource = getClass().getResource(Fixtures.getComputedWithNaturalKeyColumns()); @@ -2539,7 +2548,7 @@ public class OreSiResourcesTest { } @Test - @Tag("ACBB_TEST") + @Tag("app.acbb") public void addApplicationAcbb() throws Exception { addUserRightCreateApplication(authUserId, "acbb"); final URL resource = getClass().getResource(Fixtures.getAcbbApplicationConfigurationResourceName()); @@ -2772,7 +2781,7 @@ public class OreSiResourcesTest { } @Test - @Tag("HAUTE_FREQUENCE_TEST") + @Tag("app.haute_frequence") @Disabled public void addApplicationHauteFrequence() throws Throwable { addUserRightCreateApplication(authUserId, "hautefrequence"); @@ -2803,7 +2812,7 @@ public class OreSiResourcesTest { } @Test - @Tag("OTHERS_TEST") + @Tag("domain.model") @Disabled public void addDuplicatedTest() throws Throwable { addUserRightCreateApplication(authUserId, "duplicated"); @@ -3056,7 +3065,7 @@ on test le dépôt d'un fichier récursif } @Test - @Tag("OTHERS_TEST") + @Tag("app.olac") @Disabled public void addApplicationOLAC() throws Exception { addUserRightCreateApplication(authUserId, "olac"); @@ -3151,7 +3160,7 @@ on test le dépôt d'un fichier récursif } @Test - @Tag("OTHERS_TEST") + @Tag("app.foret") @Disabled public void addApplicationFORET_essai() throws Exception { addUserRightCreateApplication(authUserId, "foret"); @@ -3201,7 +3210,7 @@ on test le dépôt d'un fichier récursif } @Test - @Tag("OTHERS_TEST") + @Tag("app.foret") @Disabled public void addApplicationFORET() throws Exception { addUserRightCreateApplication(authUserId, "foret"); @@ -3236,6 +3245,7 @@ on test le dépôt d'un fichier récursif @Test @Disabled("utile comme benchmark, ne vérifie rien") + @Tag("integration.persistence") public void benchmarkImportData() throws Exception { addApplicationAcbb(); try (final InputStream in = fixtures.openSwcDataResourceName(false)) { @@ -3252,6 +3262,7 @@ on test le dépôt d'un fichier récursif @Test @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) @Disabled + @Tag("integration.rest") public void testGetUploadBundle() throws Exception { URL resource = getClass().getResource(Fixtures.getMonsoreApplicationConfigurationWithRepositoryResourceName()); try (final InputStream in = Objects.requireNonNull(resource).openStream()) { diff --git a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java index 31cb2f2..2147929 100644 --- a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java +++ b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java @@ -4,8 +4,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.jayway.jsonpath.JsonPath; import fr.inra.oresing.OreSiNg; import fr.inra.oresing.TestDatabaseConfig; +import fr.inra.oresing.persistence.AuthenticationFailure; import fr.inra.oresing.persistence.AuthenticationService; import fr.inra.oresing.persistence.JsonRowMapper; +import fr.inra.oresing.rest.model.authorization.LoginAdminResult; import lombok.extern.slf4j.Slf4j; import org.hamcrest.Matchers; import org.hamcrest.core.IsEqual; @@ -13,10 +15,7 @@ import org.hamcrest.core.IsNull; import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; import org.skyscreamer.jsonassert.JSONAssert; import org.skyscreamer.jsonassert.JSONCompareMode; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +29,6 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.transaction.annotation.Transactional; @@ -57,6 +55,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureMockMvc(print = MockMvcPrint.NONE) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) @Slf4j +@Tag("domain.model") public class TestReferencesErrors { public static final Map<String, String> responses = new HashMap<>(); @@ -73,7 +72,8 @@ public class TestReferencesErrors { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; private Cookie authCookie; - + private static CreateUserResult authUser = null; + private static UUID userId; @AfterAll public static void registerErrors() throws IOException { String errorsAsString = new ObjectMapper().writeValueAsString(responses); @@ -86,10 +86,22 @@ public class TestReferencesErrors { @BeforeEach public void createUser() throws Exception { - CreateUserResult authUser = authenticationService.createUser("poussin", "xxxxxxxx", "poussin@inrae.fr"); - final UUID userId = authUser.userId(); - setToActive(userId); - final CreateUserResult lambdaUser = authenticationService.createUser("lambda", "xxxxxxxx", "lamnda@inrae.fr"); + try { + authUser = authenticationService.createUser("poussin", "xxxxxxxx", "poussin@inrae.fr"); + userId = authUser.userId(); + setToActive(authUser.userId()); + } catch (AuthenticationFailure e) { + LoginAdminResult login = authenticationService.login("poussin", "xxxxxxxx"); + authUser = CreateUserResult.of(authenticationService.getByIdOrLogin(login.id().toString())); + userId = authUser.userId(); + setToActive(authUser.userId()); + log.info("L'utilisateur existe déjà .... login"); + } + try { + authenticationService.createUser("lambda", "xxxxxxxx", "lamnda@inrae.fr"); + } catch (AuthenticationFailure e) { + log.info("L'utilisateur existe déjà .... login"); + } authCookie = mockMvc.perform(post("/api/v1/login") .param("login", "poussin") .param("password", "xxxxxxxx")) @@ -120,17 +132,6 @@ public class TestReferencesErrors { namedParameterJdbcTemplate.update(sql, Map.of("id", userId)); } - @Transactional - void setToActive(final String login) { - String sql = """ - UPDATE public.oresiuser - SET accountstate = 'active' - WHERE login = :login - """; - - namedParameterJdbcTemplate.update(sql, Map.of("login", login)); - } - @Test public void testRecursivity() throws Exception { diff --git a/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java b/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java index 6be15e1..e1d4cc4 100644 --- a/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java +++ b/src/test/java/fr/inra/oresing/rest/model/authorization/CreateAuthorizationRequestTest.java @@ -16,7 +16,6 @@ import fr.inra.oresing.persistence.JsonRowMapper; import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import fr.inra.oresing.rest.model.authorization.exception.AuthorizationRequestError; import fr.inra.oresing.rest.model.authorization.request.AuthorizationRequestBuilder; -import lombok.SneakyThrows; import org.json.JSONException; import org.junit.jupiter.api.*; import org.mockito.Mockito; @@ -29,7 +28,6 @@ import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; class CreateAuthorizationRequestTest { static String createAuthorization; @@ -41,7 +39,7 @@ class CreateAuthorizationRequestTest { } @Test - @Tag("SUITE") + @Tag("core.auth") void toAuthorizationRequest() throws IOException { CreateAuthorizationRequest createAuthorizationRequest1 = new CreateAuthorizationRequest( UUID.fromString("e7570009-35fb-489d-ad3b-5bb335e7c5d5"), diff --git a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java index 85b4ec4..64f74c4 100644 --- a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java +++ b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryAdvancedSearchTest.java @@ -16,7 +16,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; -@Tag("MODEL_REQUEST_TEST") +@Tag("integration.persistence\n") class DownloadDatasetQueryAdvancedSearchTest { public static JsonRowMapper mapper; public static final Set<String> rowIds = Set.of("addf3698-88f2-43f9-8926-0b64a86f3678", "0aef7ed1-1df9-4fbf-a676-1932e87ced9d", "2c527cbe-3ed7-4883-b7d1-8f29eff99eb1"); diff --git a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java index 883e74b..a2356a2 100644 --- a/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java +++ b/src/test/java/fr/inra/oresing/rest/model/data/DownloadDatasetQueryTest.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; -@Tag("MODEL_REQUEST_TEST") +@Tag("integration.persistence\n") @Disabled class DownloadDatasetQueryTest { final String simpleSearchJson = """ diff --git a/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java b/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java index a7dfa5b..77d9c78 100644 --- a/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java +++ b/src/test/java/fr/inra/oresing/rest/services/RelationalServiceTest.java @@ -8,6 +8,7 @@ import fr.inra.oresing.rest.OreSiResourcesTest; import fr.inra.oresing.rest.ViewStrategy; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -66,6 +67,7 @@ public class RelationalServiceTest { @Test @Disabled + @Tag("integration.persistence\n") public void testCreateViews() { // request.setRequestClient(applicationCreatorRequestClient); final ImmutableSet<Fixtures.Application> applications = ImmutableSet -- GitLab