From 2adb2577fd769ffe9b1d9dec7759a8b6ca447a67 Mon Sep 17 00:00:00 2001 From: lindsay stevens Date: Fri, 5 May 2023 17:14:12 +1000 Subject: [PATCH] fix: tests for new itemset output for selects, add xls2json type hints - yes_or_no_question and xml_tests updated for new itemset output for selects. The default_survey_sheet test expected no default_form_name. - add type hints to workbook_to_json and parse_file_to_json. --- pyxform/xls2json.py | 30 +++++++------- .../yes_or_no_question.json | 19 ++++++++- tests/xform_test_case/xlsform_spec_test.py | 18 ++++++--- tests/xform_test_case/xml_tests.py | 39 +++++++++++-------- 4 files changed, 71 insertions(+), 35 deletions(-) diff --git a/pyxform/xls2json.py b/pyxform/xls2json.py index 172efc65c..9ed046ddc 100644 --- a/pyxform/xls2json.py +++ b/pyxform/xls2json.py @@ -8,7 +8,7 @@ import re import sys from collections import Counter -from typing import Any, Dict, List +from typing import IO, Any, Dict, List, Optional from pyxform import aliases, constants from pyxform.constants import ( @@ -386,11 +386,11 @@ def add_choices_info_to_question( def workbook_to_json( workbook_dict, - form_name=None, - fallback_form_name=None, - default_language=constants.DEFAULT_LANGUAGE_VALUE, - warnings=None, -) -> "Dict[str, Any]": + form_name: Optional[str] = None, + fallback_form_name: Optional[str] = None, + default_language: str = constants.DEFAULT_LANGUAGE_VALUE, + warnings: Optional[List[str]] = None, +) -> Dict[str, Any]: """ workbook_dict -- nested dictionaries representing a spreadsheet. should be similar to those returned by xls_to_dict @@ -1500,12 +1500,12 @@ def get_filename(path): def parse_file_to_json( - path, - default_name="data", - default_language=constants.DEFAULT_LANGUAGE_VALUE, - warnings=None, - file_object=None, -): + path: str, + default_name: str = "data", + default_language: str = constants.DEFAULT_LANGUAGE_VALUE, + warnings: Optional[List[str]] = None, + file_object: Optional[IO] = None, +) -> Dict[str, Any]: """ A wrapper for workbook_to_json """ @@ -1514,7 +1514,11 @@ def parse_file_to_json( workbook_dict = parse_file_to_workbook_dict(path, file_object) fallback_form_name = str(get_filename(path)) return workbook_to_json( - workbook_dict, default_name, fallback_form_name, default_language, warnings + workbook_dict=workbook_dict, + form_name=default_name, + fallback_form_name=fallback_form_name, + default_language=default_language, + warnings=warnings, ) diff --git a/tests/test_expected_output/yes_or_no_question.json b/tests/test_expected_output/yes_or_no_question.json index a3f4d6d0e..14b280680 100644 --- a/tests/test_expected_output/yes_or_no_question.json +++ b/tests/test_expected_output/yes_or_no_question.json @@ -23,6 +23,7 @@ ], "type": "select one", "name": "good_day", + "itemset": "yes_or_no", "list_name": "yes_or_no", "parameters": {}, "label": { @@ -46,5 +47,21 @@ } ] } - ] + ], + "choices": { + "yes_or_no": [ + { + "label": { + "english": "yes" + }, + "name": "yes" + }, + { + "label": { + "english": "no" + }, + "name": "no" + } + ] + } } \ No newline at end of file diff --git a/tests/xform_test_case/xlsform_spec_test.py b/tests/xform_test_case/xlsform_spec_test.py index cb0d86b50..09ebf3a58 100644 --- a/tests/xform_test_case/xlsform_spec_test.py +++ b/tests/xform_test_case/xlsform_spec_test.py @@ -14,16 +14,24 @@ class TestXFormConversion(XFormTestCase): maxDiff = None - def compare_xform(self, file_name: str): + def compare_xform(self, file_name: str, set_default_name: bool = True): self.get_file_path(file_name) expected_output_path = os.path.join( test_expected_output.PATH, self.root_filename + ".xml" ) # Do the conversion: warnings = [] - json_survey = xls2json.parse_file_to_json( - self.path_to_excel_file, default_name=self.root_filename, warnings=warnings - ) + if set_default_name: + json_survey = xls2json.parse_file_to_json( + self.path_to_excel_file, + default_name=self.root_filename, + warnings=warnings, + ) + else: + json_survey = xls2json.parse_file_to_json( + self.path_to_excel_file, + warnings=warnings, + ) survey = builder.create_survey_element_from_dict(json_survey) survey.print_xform_to_file(self.output_path, warnings=warnings) # Compare with the expected output: @@ -48,7 +56,7 @@ def test_search_and_select(self): self.compare_xform(file_name="search_and_select.xlsx") def test_default_survey_sheet(self): - self.compare_xform(file_name="survey_no_name.xlsx") + self.compare_xform(file_name="survey_no_name.xlsx", set_default_name=False) class TestCalculateWithoutCalculation(TestCase): diff --git a/tests/xform_test_case/xml_tests.py b/tests/xform_test_case/xml_tests.py index 0a89dd09a..5908aa861 100644 --- a/tests/xform_test_case/xml_tests.py +++ b/tests/xform_test_case/xml_tests.py @@ -2,7 +2,6 @@ """ Test XForm XML syntax. """ -import re from unittest import TestCase from xml.dom.minidom import getDOMImplementation @@ -13,6 +12,8 @@ class XMLTests(XFormTestCase): + maxDiff = None + def setUp(self): self.survey = create_survey_from_xls( path_to_text_fixture("yes_or_no_question.xls"), "yes_or_no_question" @@ -35,22 +36,34 @@ def test_to_xml(self): have you had a good day today? - - no - - + yes + + no + - + + + + + yes_or_no-0 + yes + + + yes_or_no-1 + no + + + """ - xml_str = re.sub(r"yes_or_no_question_2011_04_22", self.survey.id_string, xml_str) - self.maxDiff = None self.assertXFormEqual(xml_str, self.survey.to_xml())