Allow dependent questions to depend on multiple values (#1336)

This commit is contained in:
Raphael Michel
2019-07-11 13:32:45 +02:00
committed by GitHub
parent d994fc674a
commit 53a0d62d93
17 changed files with 214 additions and 74 deletions

View File

@@ -1651,6 +1651,7 @@ TEST_QUESTION_RES = {
"position": 0,
"dependency_question": None,
"dependency_value": None,
"dependency_values": [],
"options": [
{
"id": 0,
@@ -1883,6 +1884,49 @@ def test_question_delete(token_client, organizer, event, question):
assert not event.questions.filter(pk=question.id).exists()
@pytest.mark.django_db
def test_question_update_dependency_values(token_client, organizer, event, question):
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
{
"dependency_values": ["a", "b"]
},
format='json'
)
assert resp.status_code == 200
question.refresh_from_db()
assert question.dependency_values == ["a", "b"]
@pytest.mark.django_db
def test_question_update_dependency_value_legacy(token_client, organizer, event, question):
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
{
"dependency_value": "a"
},
format='json'
)
assert resp.status_code == 200
question.refresh_from_db()
assert question.dependency_values == ["a"]
@pytest.mark.django_db
def test_question_update_dependency_value_legacy_conflict(token_client, organizer, event, question):
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
{
"dependency_values": ["a", "b"],
"dependency_value": "a"
},
format='json'
)
assert resp.status_code == 200
question.refresh_from_db()
assert question.dependency_values == ["a"]
TEST_OPTIONS_RES = {
"identifier": "LVETRWVU",
"answer": {"en": "XL"},

View File

@@ -245,24 +245,24 @@ class QuestionsTest(ItemFormTest):
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['items'] = self.item1.id
form_data['dependency_question'] = q1.pk
form_data['dependency_value'] = o1.identifier
form_data['dependency_values'] = o1.identifier
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id),
form_data)
assert doc.select(".alert-success")
q2.refresh_from_db()
assert q2.dependency_question == q1
assert q2.dependency_value == o1.identifier
assert q2.dependency_values == [o1.identifier]
def test_set_dependency_circular(self):
with scopes_disabled():
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
o1 = q1.options.create(answer='Germany')
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="C", required=True,
dependency_question=q1, dependency_value=o1.identifier)
dependency_question=q1, dependency_values=[o1.identifier])
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q1.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['dependency_question'] = q2.pk
form_data['dependency_value'] = '1'
form_data['dependency_values'] = '1'
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q1.id),
form_data)
assert not doc.select(".alert-success")
@@ -274,7 +274,7 @@ class QuestionsTest(ItemFormTest):
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['dependency_question'] = q1.pk
form_data['dependency_value'] = '1'
form_data['dependency_values'] = '1'
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id),
form_data)
assert not doc.select(".alert-success")

View File

@@ -2123,32 +2123,33 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
)
self.q1.options.create(answer='Tech', identifier='TECH')
self.q1.options.create(answer='Health', identifier='HEALTH')
self.q1.options.create(answer='IT', identifier='IT')
self.q2a = self.event.questions.create(
event=self.event, question='What is your occupation?', type=Question.TYPE_CHOICE_MULTIPLE,
required=False, dependency_question=self.q1, dependency_value='TECH'
required=False, dependency_question=self.q1, dependency_values=['TECH', 'IT']
)
self.q2a.options.create(answer='Software developer', identifier='DEV')
self.q2a.options.create(answer='System administrator', identifier='ADMIN')
self.q2b = self.event.questions.create(
event=self.event, question='What is your occupation?', type=Question.TYPE_CHOICE_MULTIPLE,
required=True, dependency_question=self.q1, dependency_value='HEALTH'
required=True, dependency_question=self.q1, dependency_values=['HEALTH']
)
self.q2b.options.create(answer='Doctor', identifier='DOC')
self.q2b.options.create(answer='Nurse', identifier='NURSE')
self.q3 = self.event.questions.create(
event=self.event, question='Do you like Python?', type=Question.TYPE_BOOLEAN,
required=False, dependency_question=self.q2a, dependency_value='DEV'
required=False, dependency_question=self.q2a, dependency_values=['DEV']
)
self.q4a = self.event.questions.create(
event=self.event, question='Why?', type=Question.TYPE_TEXT,
required=True, dependency_question=self.q3, dependency_value='True'
required=True, dependency_question=self.q3, dependency_values=['True']
)
self.q4b = self.event.questions.create(
event=self.event, question='Why not?', type=Question.TYPE_TEXT,
required=True, dependency_question=self.q3, dependency_value='False'
required=True, dependency_question=self.q3, dependency_values=['False']
)
self.ticket.questions.add(self.q1)
self.ticket.questions.add(self.q2a)
@@ -2188,6 +2189,15 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
self.q4a: 'No curly braces!'
}, should_fail=False)
def test_question_dependencies_second_path_alterative(self):
self._setup_dependency_questions()
self._test_question_input({
self.q1: 'IT',
self.q2a: 'DEV',
self.q3: 'True',
self.q4a: 'No curly braces!'
}, should_fail=False)
def test_question_dependencies_subitem_required(self):
self._setup_dependency_questions()
self._test_question_input({
@@ -2202,6 +2212,14 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
self.q3: 'True',
}, should_fail=True)
def test_question_dependencies_subsubitem_required_alternative(self):
self._setup_dependency_questions()
self._test_question_input({
self.q1: 'IT',
self.q2a: 'DEV',
self.q3: 'True',
}, should_fail=True)
def test_question_dependencies_parent_not_required(self):
self._setup_dependency_questions()
self._test_question_input({