diff --git a/pom.xml b/pom.xml index b57ab87..7ef578a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ fr.insee.pogues pogues-model - 1.15.2 + 1.15.3 jar Pogues Model @@ -56,14 +56,14 @@ 2.6.0 2.21.0 2.0.17 - 5.14.2 + 5.14.3 1.5.3 2.11.0 2.25.3 - 3.5.4 + 3.5.5 2.5.0 - 3.4.0 + 3.5.0 1.12 diff --git a/src/main/resources/xsd/Questionnaire.xsd b/src/main/resources/xsd/Questionnaire.xsd index 1ffd9ab..45c6288 100644 --- a/src/main/resources/xsd/Questionnaire.xsd +++ b/src/main/resources/xsd/Questionnaire.xsd @@ -666,12 +666,11 @@ to a single response. - + - choiceType specifies whether the response options are defined by a static - code list (CODE_LIST) or dynamically generated from a collected variable - (VARIABLE). The default value is CODE_LIST. + 'choiceType' is a property for choice responses. It specifies whether the response options are defined by a + static code list (CODE_LIST) or dynamically generated from a collected variable (VARIABLE). diff --git a/src/test/java/fr/insee/pogues/model/SuggesterTest.java b/src/test/java/fr/insee/pogues/model/SuggesterTest.java new file mode 100644 index 0000000..99705f3 --- /dev/null +++ b/src/test/java/fr/insee/pogues/model/SuggesterTest.java @@ -0,0 +1,33 @@ +package fr.insee.pogues.model; + +import fr.insee.pogues.conversion.JSONDeserializer; +import org.junit.jupiter.api.Test; + +import javax.xml.bind.JAXBException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SuggesterTest { + + @Test + void deserializeSuggesterChoiceType() throws JAXBException { + String json = """ + { + "Child": [ + { + "type": "QuestionType", + "Response": [ + { + "choiceType": "SUGGESTER" + } + ] + } + ] + } + """; + Questionnaire questionnaire = new JSONDeserializer().deserializeString(json); + QuestionType question = (QuestionType) questionnaire.getChild().getFirst(); + assertEquals(ChoiceTypeEnum.SUGGESTER, question.getResponse().getFirst().getChoiceType()); + } + +} diff --git a/src/test/java/fr/insee/pogues/model/UniqueChoiceVariableOptionsTest.java b/src/test/java/fr/insee/pogues/model/UniqueChoiceVariableOptionsTest.java new file mode 100644 index 0000000..3921320 --- /dev/null +++ b/src/test/java/fr/insee/pogues/model/UniqueChoiceVariableOptionsTest.java @@ -0,0 +1,158 @@ +package fr.insee.pogues.model; + +import fr.insee.pogues.conversion.JSONDeserializer; +import fr.insee.pogues.conversion.JSONSerializer; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; +import org.skyscreamer.jsonassert.JSONCompareMode; + +import javax.xml.bind.JAXBException; +import java.io.UnsupportedEncodingException; + +import static org.junit.jupiter.api.Assertions.*; + +class UniqueChoiceVariableOptionsTest { + + @Test + void serializeUcqVariable_withFilter() throws JAXBException, UnsupportedEncodingException, JSONException { + // Given + QuestionType question = new QuestionType(); + question.setQuestionType(QuestionTypeEnum.SINGLE_CHOICE); + question.setOptionFilter("nvl($AGE$, 0) > 18"); + + ResponseType response = new ResponseType(); + response.setVariableReference("id-loop-variable"); + response.setChoiceType(ChoiceTypeEnum.VARIABLE); + + question.getResponse().add(response); + + Questionnaire questionnaire = new Questionnaire(); + questionnaire.getChild().add(question); + + // When + String json = new JSONSerializer(true).serialize(questionnaire); + + // Then + String expectedJson = """ + { + "Child": [ + { + "type": "QuestionType", + "questionType": "SINGLE_CHOICE", + "OptionFilter": "nvl($AGE$, 0) > 18", + "Response": [ + { + "VariableReference": "id-loop-variable", + "choiceType": "VARIABLE" + } + ] + } + ] + } + """; + JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.STRICT); + } + + private final JSONDeserializer jsonDeserializer = new JSONDeserializer(); + + @Test + void testChoiceTypeVariableResponses() throws JAXBException { + String json = """ + { + "Child": [ + { + "type": "QuestionType", + "Response": [ + { + "choiceType": "VARIABLE" + } + ] + } + ] + } + """; + JSONDeserializer deserializer = new JSONDeserializer(); + Questionnaire questionnaire = deserializer.deserializeString(json); + assertEquals(ChoiceTypeEnum.VARIABLE, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType()); + } + + @Test + void deserializeUcqVariable() throws JAXBException { + String json = """ + { + "Child": [ + { + "type": "QuestionType", + "questionType": "SINGLE_CHOICE", + "Response": { + "choiceType": "VARIABLE", + "VariableReference": "id-loop-variable" + } + } + ] + } + """; + + JSONDeserializer deserializer = new JSONDeserializer(); + Questionnaire questionnaire = deserializer.deserializeString(json); + + QuestionType question = (QuestionType) questionnaire.getChild().getFirst(); + assertEquals(QuestionTypeEnum.SINGLE_CHOICE, question.getQuestionType()); + assertEquals(ChoiceTypeEnum.VARIABLE, question.getResponse().getFirst().getChoiceType()); + assertNull(question.getOptionFilter()); + assertNotNull(question.getResponse()); + assertFalse(question.getResponse().isEmpty()) ; + assertEquals("id-loop-variable", question.getResponse().getFirst().getVariableReference()); + } + + @Test + void deserializeUcqVariable_withFilter() throws JAXBException { + String json = """ + { + "Child": [ + { + "type": "QuestionType", + "questionType": "SINGLE_CHOICE", + "OptionFilter": "nvl($AGE$, 0) > 18", + "Response": { + "choiceType": "VARIABLE", + "VariableReference": "id-loop-variable" + } + } + ] + } + """; + + JSONDeserializer deserializer = new JSONDeserializer(); + Questionnaire questionnaire = deserializer.deserializeString(json); + + QuestionType question = (QuestionType) questionnaire.getChild().getFirst(); + assertEquals(QuestionTypeEnum.SINGLE_CHOICE, question.getQuestionType()); + assertEquals(ChoiceTypeEnum.VARIABLE, question.getResponse().getFirst().getChoiceType()); + assertEquals("nvl($AGE$, 0) > 18", question.getOptionFilter()); + assertNotNull(question.getResponse()); + assertFalse(question.getResponse().isEmpty()) ; + assertEquals("id-loop-variable", question.getResponse().getFirst().getVariableReference()); + } + + /** The response object is the same for choice responses and other types of responses (text, numeric, date etc.). + * So the 'choiceType' property must be null is absent. */ + @Test + void responseWithoutChoiceType() throws JAXBException { + String json = """ + { + "Child": [ + { + "type": "QuestionType", + "Response": {} + } + ] + } + """; + Questionnaire questionnaire = jsonDeserializer.deserializeString(json); + QuestionType question = (QuestionType) questionnaire.getChild().getFirst(); + assertNull(question.getResponse().getFirst().getChoiceType()); + } + +} diff --git a/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java b/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java index a57275a..faae927 100644 --- a/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java +++ b/src/test/java/fr/insee/pogues/test/JSONDeserializerTest.java @@ -410,141 +410,6 @@ void testPairwiseSourceVariableReferences() throws JAXBException { assertEquals("var-age-id", pairwiseQuestion.getSourceVariableReferences().getAge()); } - @Test - void testChoiceTypeVariableResponses() throws JAXBException { - String json = """ - { - "Child": [ - { - "type": "QuestionType", - "Response": [ - { - "choiceType": "VARIABLE" - } - ] - } - ] - } - """; - JSONDeserializer deserializer = new JSONDeserializer(); - Questionnaire questionnaire = deserializer.deserializeString(json); - assertEquals(ChoiceTypeEnum.VARIABLE, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType()); - } - - @Test - void testChoiceTypeSuggester() throws JAXBException { - String json = """ - { - "Child": [ - { - "type": "QuestionType", - "Response": [ - { - "choiceType": "SUGGESTER" - } - ] - } - ] - } - """; - - JSONDeserializer deserializer = new JSONDeserializer(); - Questionnaire questionnaire = deserializer.deserializeString(json); - assertEquals(ChoiceTypeEnum.SUGGESTER, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType()); - } - - @Test - void testChoiceTypeDefaultValue() throws JAXBException { - String json = """ - { - "Child": [ - { - "type": "QuestionType", - "Response": [{}] - } - ] - } - """; - JSONDeserializer deserializer = new JSONDeserializer(); - Questionnaire questionnaire = deserializer.deserializeString(json); - assertEquals(ChoiceTypeEnum.CODE_LIST, ((QuestionType) questionnaire.getChild().getFirst()).getResponse().getFirst().getChoiceType()); - } - - @Test - void testOptionFilter() throws JAXBException { - String json = """ - { - "Child": [ - { - "type": "QuestionType", - "OptionFilter": "nvl($AGE$, 0) > 18" - } - ] - } - """; - JSONDeserializer deserializer = new JSONDeserializer(); - Questionnaire questionnaire = deserializer.deserializeString(json); - assertEquals("nvl($AGE$, 0) > 18", ((QuestionType) questionnaire.getChild().getFirst()).getOptionFilter()); - } - - @Test - void testVariableReferenceInResponse() throws JAXBException { - String json = """ - { - "Child": [ - { - "type": "QuestionType", - "Response": { - "VariableReference": "id-loop-variable" - } - } - ] - } - """; - JSONDeserializer deserializer = new JSONDeserializer(); - Questionnaire questionnaire = deserializer.deserializeString(json); - assertEquals( - "id-loop-variable", - ((QuestionType) questionnaire.getChild().getFirst()) - .getResponse().getFirst().getVariableReference()); - } - - @Test - void testVariableResponsesFullConfiguration() throws JAXBException { - String json = """ - { - "Child": [ - { - "type": "QuestionType", - "questionType": "SINGLE_CHOICE", - "OptionFilter": "nvl($AGE$, 0) > 18", - "Response": { - "choiceType": "VARIABLE", - "VariableReference": "id-loop-variable" - } - } - ] - } - """; - - JSONDeserializer deserializer = new JSONDeserializer(); - Questionnaire questionnaire = deserializer.deserializeString(json); - - QuestionType question = - (QuestionType) questionnaire.getChild().getFirst(); - - - assertEquals(QuestionTypeEnum.SINGLE_CHOICE, question.getQuestionType()); - assertEquals(ChoiceTypeEnum.VARIABLE, question.getResponse().getFirst().getChoiceType()); - assertEquals("nvl($AGE$, 0) > 18", question.getOptionFilter()); - assertNotNull(question.getResponse()); - assertFalse(question.getResponse().isEmpty()); - assertEquals( - "id-loop-variable", - question.getResponse().getFirst().getVariableReference() - ); - } - @Test void testDeserializeVariableReferenceInExternalVariable() throws JAXBException { diff --git a/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java b/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java index e49ea9c..4e60ac4 100644 --- a/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java +++ b/src/test/java/fr/insee/pogues/test/JSONSerializerTest.java @@ -676,45 +676,6 @@ void serializePairwiseSourceVariableReferences() throws JAXBException, Unsupport JSONAssert.assertEquals(expectedJson, result, JSONCompareMode.STRICT); } - @Test - void testSerializeVariableResponsesFullConfiguration() throws Exception { - QuestionType question = new QuestionType(); - question.setQuestionType(QuestionTypeEnum.SINGLE_CHOICE); - question.setOptionFilter("nvl($AGE$, 0) > 18"); - - ResponseType response = new ResponseType(); - response.setVariableReference("id-loop-variable"); - response.setChoiceType(ChoiceTypeEnum.VARIABLE); - - question.getResponse().add(response); - - Questionnaire questionnaire = new Questionnaire(); - questionnaire.getChild().add(question); - - JSONSerializer serializer = new JSONSerializer(true); - String json = serializer.serialize(questionnaire); - - String expectedJson = """ - { - "Child": [ - { - "type": "QuestionType", - "questionType": "SINGLE_CHOICE", - "OptionFilter": "nvl($AGE$, 0) > 18", - "Response": [ - { - "VariableReference": "id-loop-variable", - "choiceType": "VARIABLE" - } - ] - } - ] - } - """; - - JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.STRICT); - } - @Test void testSerializeVariableReferenceInExternalVariable() throws Exception {