diff options
| author | Max Nanis | 2026-03-06 16:49:46 -0500 |
|---|---|---|
| committer | Max Nanis | 2026-03-06 16:49:46 -0500 |
| commit | 91d040211a4ed6e4157896256a762d3854777b5e (patch) | |
| tree | cd95922ea4257dc8d3f4e4cbe8534474709a20dc /tests/models/spectrum/test_question.py | |
| download | generalresearch-91d040211a4ed6e4157896256a762d3854777b5e.tar.gz generalresearch-91d040211a4ed6e4157896256a762d3854777b5e.zip | |
Initial commitv3.3.4
Diffstat (limited to 'tests/models/spectrum/test_question.py')
| -rw-r--r-- | tests/models/spectrum/test_question.py | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/tests/models/spectrum/test_question.py b/tests/models/spectrum/test_question.py new file mode 100644 index 0000000..ba118d7 --- /dev/null +++ b/tests/models/spectrum/test_question.py @@ -0,0 +1,216 @@ +from datetime import datetime, timezone + +from generalresearch.models import Source +from generalresearch.models.spectrum.question import ( + SpectrumQuestionOption, + SpectrumQuestion, + SpectrumQuestionType, + SpectrumQuestionClass, +) +from generalresearch.models.thl.profiling.upk_question import ( + UpkQuestion, + UpkQuestionSelectorMC, + UpkQuestionType, + UpkQuestionChoice, +) + + +class TestSpectrumQuestion: + + def test_parse_from_api_1(self): + + example_1 = { + "qualification_code": 213, + "text": "My household earns approximately $%%213%% per year", + "cat": None, + "desc": "Income", + "type": 5, + "class": 1, + "condition_codes": [], + "format": {"min": 0, "max": 999999, "regex": "/^([0-9]{1,6})$/i"}, + "crtd_on": 1502869927688, + "mod_on": 1706557247467, + } + q = SpectrumQuestion.from_api(example_1, "us", "eng") + + expected_q = SpectrumQuestion( + question_id="213", + country_iso="us", + language_iso="eng", + question_name="Income", + question_text="My household earns approximately $___ per year", + question_type=SpectrumQuestionType.TEXT_ENTRY, + tags=None, + options=None, + class_num=SpectrumQuestionClass.CORE, + created=datetime(2017, 8, 16, 7, 52, 7, 688000, tzinfo=timezone.utc), + is_live=True, + source=Source.SPECTRUM, + category_id=None, + ) + assert "My household earns approximately $___ per year" == q.question_text + assert "213" == q.question_id + assert expected_q == q + q.to_upk_question() + assert "s:213" == q.external_id + + def test_parse_from_api_2(self): + + example_2 = { + "qualification_code": 211, + "text": "I'm a %%211%%", + "cat": None, + "desc": "Gender", + "type": 1, + "class": 1, + "condition_codes": [ + {"id": "111", "text": "Male"}, + {"id": "112", "text": "Female"}, + ], + "format": {"min": None, "max": None, "regex": ""}, + "crtd_on": 1502869927688, + "mod_on": 1706557249817, + } + q = SpectrumQuestion.from_api(example_2, "us", "eng") + expected_q = SpectrumQuestion( + question_id="211", + country_iso="us", + language_iso="eng", + question_name="Gender", + question_text="I'm a", + question_type=SpectrumQuestionType.SINGLE_SELECT, + tags=None, + options=[ + SpectrumQuestionOption(id="111", text="Male", order=0), + SpectrumQuestionOption(id="112", text="Female", order=1), + ], + class_num=SpectrumQuestionClass.CORE, + created=datetime(2017, 8, 16, 7, 52, 7, 688000, tzinfo=timezone.utc), + is_live=True, + source=Source.SPECTRUM, + category_id=None, + ) + assert expected_q == q + q.to_upk_question() + + def test_parse_from_api_3(self): + + example_3 = { + "qualification_code": 220, + "text": "My child is a %%230%% %%221%% old %%220%%", + "cat": None, + "desc": "Child Dependent", + "type": 6, + "class": 4, + "condition_codes": [ + {"id": "111", "text": "Boy"}, + {"id": "112", "text": "Girl"}, + ], + "format": {"min": None, "max": None, "regex": ""}, + "crtd_on": 1502869927688, + "mod_on": 1706556781278, + } + q = SpectrumQuestion.from_api(example_3, "us", "eng") + # This fails because the text has variables from other questions in it + assert q is None + + def test_parse_from_api_4(self): + + example_4 = { + "qualification_code": 1039, + "text": "Do you suffer from any of the following ailments or medical conditions? (Select all that apply) " + " %%1039%%", + "cat": "Ailments, Illness", + "desc": "Standard Ailments", + "type": 3, + "class": 2, + "condition_codes": [ + {"id": "111", "text": "Allergies (Food, Nut, Skin)"}, + {"id": "999", "text": "None of the above"}, + {"id": "130", "text": "Other"}, + { + "id": "129", + "text": "Women's Health Conditions (Reproductive Issues)", + }, + ], + "format": {"min": None, "max": None, "regex": ""}, + "crtd_on": 1502869927688, + "mod_on": 1706557241693, + } + q = SpectrumQuestion.from_api(example_4, "us", "eng") + expected_q = SpectrumQuestion( + question_id="1039", + country_iso="us", + language_iso="eng", + question_name="Standard Ailments", + question_text="Do you suffer from any of the following ailments or medical conditions? (Select all that " + "apply)", + question_type=SpectrumQuestionType.MULTI_SELECT, + tags="Ailments, Illness", + options=[ + SpectrumQuestionOption( + id="111", text="Allergies (Food, Nut, Skin)", order=0 + ), + SpectrumQuestionOption( + id="129", + text="Women's Health Conditions (Reproductive Issues)", + order=1, + ), + SpectrumQuestionOption(id="130", text="Other", order=2), + SpectrumQuestionOption(id="999", text="None of the above", order=3), + ], + class_num=SpectrumQuestionClass.EXTENDED, + created=datetime(2017, 8, 16, 7, 52, 7, 688000, tzinfo=timezone.utc), + is_live=True, + source=Source.SPECTRUM, + category_id=None, + ) + assert expected_q == q + + # todo: we should have something that infers that if the choice text is "None of the above", + # then the choice is exclusive + u = UpkQuestion( + id=None, + ext_question_id="s:1039", + type=UpkQuestionType.MULTIPLE_CHOICE, + selector=UpkQuestionSelectorMC.MULTIPLE_ANSWER, + country_iso="us", + language_iso="eng", + text="Do you suffer from any of the following ailments or medical conditions? (Select all " + "that apply)", + choices=[ + UpkQuestionChoice( + id="111", + text="Allergies (Food, Nut, Skin)", + order=0, + group=None, + exclusive=False, + importance=None, + ), + UpkQuestionChoice( + id="129", + text="Women's Health Conditions (Reproductive Issues)", + order=1, + group=None, + exclusive=False, + importance=None, + ), + UpkQuestionChoice( + id="130", + text="Other", + order=2, + group=None, + exclusive=False, + importance=None, + ), + UpkQuestionChoice( + id="999", + text="None of the above", + order=3, + group=None, + exclusive=False, + importance=None, + ), + ], + ) + assert u == q.to_upk_question() |
