enhanced submission handling with deccision trees
Some checks failed
PHPUnit / test (push) Has been cancelled

This commit is contained in:
2026-06-05 11:57:28 +02:00
parent 6883654d7c
commit c37940c9a9
4 changed files with 157 additions and 13 deletions

View File

@ -9,6 +9,94 @@ use Tests\Support\QdbTestCase;
final class AppSubmitExtendedTest extends QdbTestCase
{
public function testResubmitClearsOmittedOptionalAnswers(): void
{
$login = $this->api()->loginMobileAndGetToken(
DatabaseSeeder::COACH_USERNAME,
DatabaseSeeder::PASSWORD
);
$f = $this->fixture();
$this->assertApiOk($this->submitQuestionnaireAs($login['token'], $f->questionnaireId, $f->clientCode, [
['questionID' => $f->questionShortId, 'answerOptionKey' => 'yes'],
['questionID' => $f->freeTextShortId, 'freeTextValue' => 'Old notes'],
['questionID' => $f->glassSymptomKey, 'freeTextValue' => 'moderate'],
['questionID' => 'fatigue', 'freeTextValue' => 'severe'],
]));
$res = $this->submitQuestionnaireAs($login['token'], $f->questionnaireId, $f->clientCode, [
['questionID' => $f->questionShortId, 'answerOptionKey' => 'yes'],
]);
$this->assertApiOk($res);
[$pdo, $tmpDb, $lockFp] = qdb_open(false);
$ft = $pdo->prepare(
'SELECT freeTextValue FROM client_answer WHERE clientCode = :cc AND questionID = :qid'
);
$ft->execute([':cc' => $f->clientCode, ':qid' => $f->freeTextQuestionId]);
$this->assertFalse($ft->fetchColumn());
$glass = $pdo->prepare(
'SELECT freeTextValue FROM client_answer WHERE clientCode = :cc AND questionID = :qid'
);
$glass->execute([':cc' => $f->clientCode, ':qid' => $f->glassQuestionId]);
$this->assertFalse($glass->fetchColumn());
$sub = $pdo->prepare(
'SELECT submissionID FROM questionnaire_submission
WHERE clientCode = :cc AND questionnaireID = :qn ORDER BY version DESC LIMIT 1'
);
$sub->execute([':cc' => $f->clientCode, ':qn' => $f->questionnaireId]);
$submissionId = (string)$sub->fetchColumn();
$archived = $pdo->prepare(
'SELECT freeTextValue FROM client_answer_submission
WHERE submissionID = :sid AND questionID = :qid'
);
$archived->execute([':sid' => $submissionId, ':qid' => $f->freeTextQuestionId]);
$this->assertFalse($archived->fetchColumn());
$archivedGlass = $pdo->prepare(
'SELECT freeTextValue FROM client_answer_submission
WHERE submissionID = :sid AND questionID = :qid'
);
$archivedGlass->execute([':sid' => $submissionId, ':qid' => $f->glassQuestionId]);
$this->assertFalse($archivedGlass->fetchColumn());
qdb_discard($tmpDb, $lockFp);
}
public function testResubmitReplacesGlassSymptomsInsteadOfMerging(): void
{
$login = $this->api()->loginMobileAndGetToken(
DatabaseSeeder::COACH_USERNAME,
DatabaseSeeder::PASSWORD
);
$f = $this->fixture();
$this->assertApiOk($this->submitQuestionnaireAs($login['token'], $f->questionnaireId, $f->clientCode, [
['questionID' => $f->questionShortId, 'answerOptionKey' => 'yes'],
['questionID' => $f->glassSymptomKey, 'freeTextValue' => 'moderate'],
['questionID' => 'fatigue', 'freeTextValue' => 'severe'],
]));
$res = $this->submitQuestionnaireAs($login['token'], $f->questionnaireId, $f->clientCode, [
['questionID' => $f->questionShortId, 'answerOptionKey' => 'yes'],
['questionID' => $f->glassSymptomKey, 'freeTextValue' => 'mild'],
]);
$this->assertApiOk($res);
[$pdo, $tmpDb, $lockFp] = qdb_open(false);
$glass = $pdo->prepare(
'SELECT freeTextValue FROM client_answer WHERE clientCode = :cc AND questionID = :qid'
);
$glass->execute([':cc' => $f->clientCode, ':qid' => $f->glassQuestionId]);
$decoded = json_decode((string)$glass->fetchColumn(), true);
$this->assertSame(['pain' => 'mild'], $decoded);
qdb_discard($tmpDb, $lockFp);
}
public function testResubmitCreatesSecondSubmissionVersion(): void
{
$login = $this->api()->loginMobileAndGetToken(

View File

@ -30,6 +30,15 @@ final class AppAnswersTest extends TestCase
$this->assertSame(['one', 'two'], qdb_decode_multi_check_values('one, two'));
}
public function testBuildGlassSymptomJsonOmitsEmptyAndReturnsNullForNoSymptoms(): void
{
require_once dirname(__DIR__, 2) . '/lib/app_answers.php';
$this->assertNull(qdb_build_glass_symptom_json([]));
$this->assertNull(qdb_build_glass_symptom_json(['pain' => '']));
$json = qdb_build_glass_symptom_json(['pain' => 'mild', 'fatigue' => 'severe']);
$this->assertSame(['pain' => 'mild', 'fatigue' => 'severe'], json_decode((string)$json, true));
}
public function testGroupAppSubmitAnswersMergesMultiCheck(): void
{
$answers = [