Skip to content

Commit

Permalink
fix(condition): questions conditions may lead to wring result in comp…
Browse files Browse the repository at this point in the history
…lex cases

fix #880
  • Loading branch information
btry committed Feb 6, 2018

Unverified

No user is associated with the committer email.
1 parent 66dd59a commit 42cb852
Showing 2 changed files with 113 additions and 9 deletions.
6 changes: 0 additions & 6 deletions inc/fields.class.php
Original file line number Diff line number Diff line change
@@ -181,14 +181,8 @@ public static function isVisible($id, $values) {
$nextLogic = 'OR';
}
if (!isset($values[$condition['field']])) {
//unset($evalQuestion[$id]);
//return false;
$values[$condition['field']] = '';
}
if (!self::isVisible($condition['field'], $values)) {
unset($evalQuestion[$id]);
return false;
}

switch ($condition['operator']) {
case '!=' :
116 changes: 113 additions & 3 deletions tests/0010_Integration/QuestionConditionTest.php
Original file line number Diff line number Diff line change
@@ -32,6 +32,10 @@ public static function setUpBeforeClass() {
'name' => 'other text question',
'fieldtype' => 'text',
],
[
'name' => 'third text question',
'fieldtype' => 'text',
],
],
],
];
@@ -173,10 +177,10 @@ public function testConditionForMultipleValue($condition) {
$question->updateConditions($condition);

//Run the condition
$currentValues = array(
"formcreator_field_$firstQuestionId" => array($condition['show_value'][0] . " and now for something completely different"),
$currentValues = [
"formcreator_field_$firstQuestionId" => [$condition['show_value'][0] . " and now for something completely different"],
"formcreator_field_$secondQuestionId" => '',
);
];
$visibility = PluginFormcreatorFields::updateVisibility($currentValues);

// Check the result
@@ -197,4 +201,110 @@ public function testConditionForMultipleValue($condition) {
// Check the result
$this->assertEquals(!$expected, $visibility["formcreator_field_$secondQuestionId"]);
}

public function testConditionForManyQuestions() {
$form = new PluginFormcreatorForm();
$form->add([
'entities_id' => 0,
'name' => 'a form',
'description' => 'form description',
'content' => 'a content',
'is_active' => 1,
'validation_required' => 0
]);

$section = new PluginFormcreatorSection();
$sectionId = $section->add([
'name' => 'section',
'plugin_formcreator_forms_id' => $form->getID(),
]);
$questions = [];
$questions[0] = new PluginFormcreatorQuestion();
$questions[1] = new PluginFormcreatorQuestion();
$questions[2] = new PluginFormcreatorQuestion();

// create questions
$firstQuestionId = $questions[0]->add([
'name' => 'text question 0',
'fieldtype' => 'text',
'plugin_formcreator_sections_id' => $sectionId,
]);
$secondQuestionId = $questions[1]->add([
'name' => 'text question 1',
'fieldtype' => 'text',
'plugin_formcreator_sections_id' => $sectionId,
'show_rule' => 'hidden',
]);
$thirdQuestionId = $questions[2]->add([
'name' => 'text question 2',
'fieldtype' => 'text',
'plugin_formcreator_sections_id' => $sectionId,
'show_rule' => 'hidden',
]);

// create conditions
$condition = new PluginFormcreatorQuestion_Condition();
$condition->add([
'plugin_formcreator_questions_id' => $secondQuestionId,
'show_field' => $firstQuestionId,
'show_condition' => '==',
'show_value' => 'a',
'show_logic' => 'OR',
]);
$condition->add([
'plugin_formcreator_questions_id' => $thirdQuestionId,
'show_field' => $firstQuestionId,
'show_condition' => '==',
'show_value' => 'c',
'show_logic' => 'OR',
]);
$condition->add([
'plugin_formcreator_questions_id' => $thirdQuestionId,
'show_field' => $secondQuestionId,
'show_condition' => '==',
'show_value' => 'c',
'show_logic' => 'OR',
]);

// test the conditions engine
$currentValues = [
"formcreator_field_$firstQuestionId" => '',
"formcreator_field_$secondQuestionId" => '',
"formcreator_field_$thirdQuestionId" => '',
];
$visibility = PluginFormcreatorFields::updateVisibility($currentValues);
$this->assertEquals(true, $visibility["formcreator_field_$firstQuestionId"]);
$this->assertEquals(false, $visibility["formcreator_field_$secondQuestionId"]);
$this->assertEquals(false, $visibility["formcreator_field_$thirdQuestionId"]);

$currentValues = [
"formcreator_field_$firstQuestionId" => 'a',
"formcreator_field_$secondQuestionId" => '',
"formcreator_field_$thirdQuestionId" => '',
];
$visibility = PluginFormcreatorFields::updateVisibility($currentValues);
$this->assertEquals(true, $visibility["formcreator_field_$firstQuestionId"]);
$this->assertEquals(true, $visibility["formcreator_field_$secondQuestionId"]);
$this->assertEquals(false, $visibility["formcreator_field_$thirdQuestionId"]);

$currentValues = [
"formcreator_field_$firstQuestionId" => 'a',
"formcreator_field_$secondQuestionId" => 'c',
"formcreator_field_$thirdQuestionId" => '',
];
$visibility = PluginFormcreatorFields::updateVisibility($currentValues);
$this->assertEquals(true, $visibility["formcreator_field_$firstQuestionId"]);
$this->assertEquals(true, $visibility["formcreator_field_$secondQuestionId"]);
$this->assertEquals(true, $visibility["formcreator_field_$thirdQuestionId"]);

$currentValues = [
"formcreator_field_$firstQuestionId" => '',
"formcreator_field_$secondQuestionId" => 'c',
"formcreator_field_$thirdQuestionId" => '',
];
$visibility = PluginFormcreatorFields::updateVisibility($currentValues);
$this->assertEquals(true, $visibility["formcreator_field_$firstQuestionId"]);
$this->assertEquals(false, $visibility["formcreator_field_$secondQuestionId"]);
$this->assertEquals(true, $visibility["formcreator_field_$thirdQuestionId"]);
}
}

0 comments on commit 42cb852

Please sign in to comment.