response(); $this->assertSame('sample', $response->getQuestionnaire()); $this->assertSame(1, $response->getVersion()); $this->assertSame(QuestionnaireResponseStatus::DRAFT, $response->getStatus()); $this->assertNull($response->getSubmittedAt()); } /** * The respondent switched "damage" back to "no" after writing a description; switching it to * "yes" again must bring the description back. */ public function testDraftKeepsAnswersToHiddenQuestions(): void { $response = $this->response()->saveDraft(['damage' => 'no', 'details' => 'Spiegel ab'], ['teamerName' => 'Kim']); $this->assertSame(['damage' => 'no', 'details' => 'Spiegel ab'], $response->getAnswers()); $this->assertSame(['teamerName' => 'Kim'], $response->getContext()); $this->assertFalse($response->isSubmitted()); } public function testSubmitDropsAnswersToHiddenQuestions(): void { $now = new \DateTimeImmutable('2026-03-01 12:00'); $response = $this->response()->submit($this->definition(), ['damage' => 'no', 'details' => 'Spiegel ab'], [], $now); $this->assertSame(['damage' => 'no'], $response->getAnswers()); $this->assertTrue($response->isSubmitted()); $this->assertSame($now, $response->getSubmittedAt()); } /** * A draft begun before the definition was bumped is submitted, and therefore rendered, under * the version it was completed in. */ public function testSubmitRecordsTheVersionAnsweredUnder(): void { $response = $this->response()->submit($this->definition(version: 2), ['damage' => 'no'], [], new \DateTimeImmutable()); $this->assertSame(2, $response->getVersion()); } public function testSubmittedResponseCannotBeChanged(): void { $response = $this->response()->submit($this->definition(), ['damage' => 'no'], [], new \DateTimeImmutable()); $this->expectException(\LogicException::class); $response->saveDraft(['damage' => 'yes'], []); } public function testResponseCannotBeSubmittedWithAnotherQuestionnaire(): void { $this->expectException(\LogicException::class); $this->response()->submit($this->definition(key: 'other'), [], [], new \DateTimeImmutable()); } private function response(): QuestionnaireResponse { $disposition = new Disposition(new Application(new Assignment(), new Teamer())); return QuestionnaireResponse::forDisposition($this->definition(), $disposition); } private function definition(string $key = 'sample', int $version = 1): Definition { return new Definition($key, $version, 'Beispiel', null, [ new Section('main', null, [ new Question('damage', 'Schäden?', QuestionType::CHOICE, options: [new Option('yes', 'Ja'), new Option('no', 'Nein')]), new Question('details', 'Was ist passiert?', QuestionType::TEXTAREA, showIf: new Condition('damage', ConditionOperator::EQUALS, 'yes')), ]), ]); } }