offeringId); self::assertSame('Your level?', $question->label); self::assertSame(Question::FIELD_TEXT, $question->fieldType); self::assertNull($question->options); self::assertFalse($question->isRequired); self::assertSame(0, $question->sortOrder); self::assertTrue($question->isActive); self::assertNull($question->id); } public function testFromRowDecodesOptionsJson(): void { $row = (object) [ 'id' => '3', 'offering_id' => '7', 'label' => 'Pick a level', 'field_type' => Question::FIELD_SELECT, 'options' => '["Beginner","Advanced"]', 'is_required' => '1', 'sort_order' => '2', 'is_active' => '1', ]; $question = Question::fromRow($row); self::assertSame(3, $question->id); self::assertSame(Question::FIELD_SELECT, $question->fieldType); self::assertSame(['Beginner', 'Advanced'], $question->options); self::assertTrue($question->isRequired); self::assertSame(2, $question->sortOrder); } public function testFromRowHandlesNullOptions(): void { $row = (object) [ 'id' => '4', 'offering_id' => '7', 'label' => 'Notes', 'field_type' => Question::FIELD_TEXTAREA, 'options' => null, 'is_required' => '0', 'sort_order' => '0', 'is_active' => '0', ]; $question = Question::fromRow($row); self::assertNull($question->options); self::assertFalse($question->isActive); } public function testToArrayContainsExpectedKeys(): void { $question = new Question(7, 'Label', Question::FIELD_TEXT, id: 9); $arr = $question->toArray(); foreach (['id', 'offering_id', 'label', 'field_type', 'options', 'is_required', 'sort_order', 'is_active'] as $key) { self::assertArrayHasKey($key, $arr); } } public function testValidFieldTypeConstants(): void { self::assertContains(Question::FIELD_TEXT, Question::VALID_FIELD_TYPES); self::assertContains(Question::FIELD_TEXTAREA, Question::VALID_FIELD_TYPES); self::assertContains(Question::FIELD_SELECT, Question::VALID_FIELD_TYPES); self::assertContains(Question::FIELD_CHECKBOX, Question::VALID_FIELD_TYPES); } }