From d98d58ec160ff01271a0f3910f3189814e4beea0 Mon Sep 17 00:00:00 2001
From: Ritchie Nithoo <ritchie.nithoo@xelians.fr>
Date: Fri, 21 Aug 2020 16:38:25 +0200
Subject: [PATCH] [US FOX-264] Add method to get rule duration based on rule
 identifier

---
 .../vitam/api/administration/RuleService.java | 36 +++++++-
 .../api/administration/RuleServiceTest.java   | 89 +++++++++++++++++++
 2 files changed, 124 insertions(+), 1 deletion(-)
 create mode 100644 commons/commons-vitam/src/test/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleServiceTest.java

diff --git a/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java
index 4d62b6df..eeaecaed 100644
--- a/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java
+++ b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java
@@ -37,26 +37,40 @@
 package fr.gouv.vitamui.commons.vitam.api.administration;
 
 import java.io.InputStream;
+import java.util.Optional;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 import fr.gouv.vitam.access.external.client.AdminExternalClient;
 import fr.gouv.vitam.access.external.common.exception.AccessExternalClientException;
 import fr.gouv.vitam.common.client.VitamContext;
+import fr.gouv.vitam.common.database.builder.query.QueryHelper;
+import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException;
+import fr.gouv.vitam.common.database.builder.request.single.Select;
 import fr.gouv.vitam.common.exception.InvalidParseOperationException;
 import fr.gouv.vitam.common.exception.VitamClientException;
 import fr.gouv.vitam.common.model.RequestResponse;
 import fr.gouv.vitam.common.model.administration.FileRulesModel;
+import fr.gouv.vitamui.commons.api.exception.UnexpectedDataException;
+import fr.gouv.vitamui.commons.vitam.api.dto.RuleNodeResponseDto;
+import fr.gouv.vitamui.commons.vitam.api.model.RuleMeasurementEnum;
 
 public class RuleService {
 
     private final AdminExternalClient adminExternalClient;
-
+    
+    private ObjectMapper objectMapper;
+    
     @Autowired
     public RuleService(final AdminExternalClient adminExternalClient) {
         this.adminExternalClient = adminExternalClient;
+        objectMapper = new ObjectMapper();
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     }
 
     @SuppressWarnings("rawtypes")
@@ -68,4 +82,24 @@ public class RuleService {
     public RequestResponse<FileRulesModel> findRules(final VitamContext vitamContext, final JsonNode select) throws VitamClientException {
         return adminExternalClient.findRules(vitamContext, select);
     }
+    
+    public Optional<Long> findRulesDurationByRuleId(final VitamContext vitamContext, final String ruleId) 
+    		throws VitamClientException, InvalidCreateOperationException, JsonProcessingException {
+    	final Select select = new Select();
+		select.setQuery(QueryHelper.eq("RuleId", ruleId));
+		RequestResponse<FileRulesModel> rulesVitamResponse = 
+				this.findRules(vitamContext, select.getFinalSelect());
+		if (rulesVitamResponse.isOk()) {
+			RuleNodeResponseDto ruleNodeResponseDto = objectMapper
+					.treeToValue(rulesVitamResponse.toJsonNode(), RuleNodeResponseDto.class);
+			FileRulesModel rule = ruleNodeResponseDto.getResults().get(0);
+			if (RuleMeasurementEnum.YEAR.equals(RuleMeasurementEnum.getEnumFromType(rule.getRuleMeasurement()))) {
+				return Optional.of(Long.parseLong(rule.getRuleDuration()));
+			}
+			else {
+				throw new UnexpectedDataException("The rule duration measurement should be in years.");
+			}
+		}
+		return Optional.empty();
+    }
 }
diff --git a/commons/commons-vitam/src/test/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleServiceTest.java b/commons/commons-vitam/src/test/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleServiceTest.java
new file mode 100644
index 00000000..27820f43
--- /dev/null
+++ b/commons/commons-vitam/src/test/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleServiceTest.java
@@ -0,0 +1,89 @@
+package fr.gouv.vitamui.commons.vitam.api.administration;
+
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import fr.gouv.vitam.access.external.client.AdminExternalClient;
+import fr.gouv.vitam.common.client.VitamContext;
+import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException;
+import fr.gouv.vitam.common.exception.VitamClientException;
+import fr.gouv.vitam.common.model.RequestResponseOK;
+import fr.gouv.vitam.common.model.administration.FileRulesModel;
+import fr.gouv.vitamui.commons.api.exception.UnexpectedDataException;
+import fr.gouv.vitamui.commons.vitam.api.model.RuleMeasurementEnum;
+
+public class RuleServiceTest {
+
+	@Mock
+	private AdminExternalClient adminExternalClient;
+	
+	@InjectMocks
+	private RuleService ruleService;
+	
+	private static final String RULE_ID = "FC-1";
+	
+	private static final int TENANT_IDENTIFIER = 9;
+	
+	private static final Long RULE_DURATION = 10L;
+	
+	@Before
+	public void setUp() {
+		MockitoAnnotations.initMocks(this);
+	}
+	
+	@Test
+	public void testfindRulesDurationByRuleId() throws VitamClientException, JsonProcessingException, InvalidCreateOperationException {
+		// Prepare
+		final var fileRule = buildFileRuleModel(RuleMeasurementEnum.YEAR);
+        final var requestResponseOk = new RequestResponseOK<FileRulesModel>().addResult(fileRule);
+        when(adminExternalClient.findRules(Mockito.any(VitamContext.class), Mockito.any(JsonNode.class))).thenReturn(requestResponseOk);
+        // Do
+		Optional<Long> ruleDuration = ruleService.findRulesDurationByRuleId(new VitamContext(TENANT_IDENTIFIER), RULE_ID);
+		// Verify
+        Assertions.assertTrue(ruleDuration.isPresent(), "The rule duration should be present");
+        Assertions.assertEquals(RULE_DURATION, ruleDuration.get(), "The rule duration value should match the duration");
+	}
+	
+	@Test
+	public void testfindRulesDurationByRuleId_with_rule_duration_in_months() 
+			throws VitamClientException, JsonProcessingException, InvalidCreateOperationException {
+        // Prepare
+		final var fileRule = buildFileRuleModel(RuleMeasurementEnum.MONTH);
+        final var requestResponseOk = new RequestResponseOK<FileRulesModel>().addResult(fileRule);
+        when(adminExternalClient.findRules(Mockito.any(VitamContext.class), Mockito.any(JsonNode.class))).thenReturn(requestResponseOk);
+		// Do and Verify
+        var thrownException = Assertions.assertThrows(UnexpectedDataException.class, () -> {
+        	ruleService.findRulesDurationByRuleId(new VitamContext(TENANT_IDENTIFIER), RULE_ID);
+        });
+        Assertions.assertEquals("The rule duration measurement should be in years.", thrownException.getMessage(), 
+        		"The exception message should match");
+	}
+	
+	@After
+	public void destroy() {
+		ruleService = null;
+		adminExternalClient = null;
+	}
+	
+	private static FileRulesModel buildFileRuleModel(RuleMeasurementEnum ruleMeasurementEnum) {
+        final var rule = new FileRulesModel();
+        rule.setRuleId(RULE_ID);
+        rule.setRuleDuration(RULE_DURATION.toString());
+        rule.setRuleMeasurement(ruleMeasurementEnum.getType());
+        return rule;
+	}
+	
+}
-- 
GitLab