Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\FormBundle\Tests\Entity; | |
| use Mautic\CoreBundle\Helper\InputHelper; | |
| use Mautic\FormBundle\Entity\Field; | |
| use Mautic\FormBundle\Entity\Form; | |
| use Mautic\LeadBundle\Entity\Lead; | |
| use PHPUnit\Framework\Assert; | |
| final class FieldTest extends \PHPUnit\Framework\TestCase | |
| { | |
| public function testShowForConditionalFieldWithNoParent(): void | |
| { | |
| $field = new Field(); | |
| $this->assertTrue($field->showForConditionalField([])); | |
| } | |
| public function testShowForConditionalFieldWithParentButNoAlias(): void | |
| { | |
| $parentFieldId = '55'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $this->assertFalse($field->showForConditionalField([])); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasAndNotInConditionAndBadValue(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => 'notIn', 'values' => []]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => 'value A']; | |
| $this->assertTrue($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasWith0ValueAndNotInConditionAndBadValue(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => 'notIn', 'values' => [1]]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => 0]; | |
| $this->assertTrue($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasAndNotInConditionAndMatchingValue(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => 'notIn', 'values' => ['value A']]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => 'value A']; | |
| $this->assertFalse($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasAndAnyValue(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => '', 'any' => true, 'values' => ['value A']]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => 'value A']; | |
| $this->assertTrue($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentValue0AndAliasAndAnyValue(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => '', 'any' => true, 'values' => [1]]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => 0]; | |
| $this->assertTrue($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasAndInValueMatches(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => 'in', 'values' => ['value A']]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => ['value A']]; | |
| $this->assertTrue($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasAndInValueDoesNotMatch(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => 'in', 'values' => ['value B']]); | |
| $parentField->method('getId')->willReturn(55); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => ['value A']]; | |
| $this->assertFalse($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasAndInValueMatchesWithDifferentTypes(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $field->setConditions(['expr' => 'in', 'values' => ['0']]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => [0]]; | |
| $this->assertTrue($field->showForConditionalField($data)); | |
| } | |
| public function testShowForConditionalFieldWithParentAndAliasAndInValueMatchesSpecialCharacters(): void | |
| { | |
| $parentFieldId = '55'; | |
| $parentFieldAlias = 'field_a'; | |
| $field = new Field(); | |
| $parentField = $this->createMock(Field::class); | |
| $form = new Form(); | |
| $form->addField(0, $parentField); | |
| $field->setForm($form); | |
| $field->setParent($parentFieldId); | |
| $specialValue = 'čé+äà>&"\'è'; | |
| $field->setConditions(['expr' => 'in', 'values' => [InputHelper::clean($specialValue)]]); | |
| $parentField->method('getId')->willReturn($parentFieldId); | |
| $parentField->method('getAlias')->willReturn($parentFieldAlias); | |
| $data = [$parentFieldAlias => [$specialValue]]; | |
| $this->assertTrue($field->showForConditionalField($data)); | |
| } | |
| public function testShowForContactIfFormIsNull(): void | |
| { | |
| $field = new Field(); | |
| Assert::assertTrue($field->showForContact()); | |
| } | |
| public function testShowForContactIfInKioskMode(): void | |
| { | |
| $field = new Field(); | |
| $form = new Form(); | |
| $form->setInKioskMode(true); | |
| Assert::assertTrue($field->showForContact(null, null, $form)); | |
| } | |
| public function testShowForContactIfShowWhenValueExistsIsTrue(): void | |
| { | |
| $field = new Field(); | |
| $form = new Form(); | |
| $form->setInKioskMode(false); | |
| $field->setShowWhenValueExists(true); | |
| Assert::assertTrue($field->showForContact(null, null, $form)); | |
| } | |
| public function testShowForContactIfShowWhenValueExistsIsFalseAndSubmissionExists(): void | |
| { | |
| $field = new Field(); | |
| $form = new Form(); | |
| $submissions = [['field_a' => 'Value A']]; | |
| $form->setInKioskMode(false); | |
| $field->setShowWhenValueExists(false); | |
| $field->setIsAutoFill(false); | |
| $field->setAlias('field_a'); | |
| Assert::assertFalse($field->showForContact($submissions, null, $form)); | |
| } | |
| public function testShowForContactIfShowWhenValueExistsIsFalseAndSubmissionDoesNotExist(): void | |
| { | |
| $field = new Field(); | |
| $form = new Form(); | |
| $submissions = [['field_a' => 'Value A']]; | |
| $form->setInKioskMode(false); | |
| $field->setShowWhenValueExists(false); | |
| $field->setIsAutoFill(false); | |
| $field->setAlias('unicorn'); | |
| Assert::assertTrue($field->showForContact($submissions, null, $form)); | |
| } | |
| public function testShowForContactIfShowWhenValueExistsIsFalseAndMappedLeadFieldValueExists(): void | |
| { | |
| $field = new Field(); | |
| $form = new Form(); | |
| $contact = new class() extends Lead { | |
| public function getFieldValue($field, $group = null) | |
| { | |
| Assert::assertSame('field_a', $field); | |
| return 'Value A'; | |
| } | |
| }; | |
| $form->setInKioskMode(false); | |
| $field->setShowWhenValueExists(false); | |
| $field->setMappedField('field_a'); | |
| $field->setMappedObject('contact'); | |
| $field->setIsAutoFill(false); | |
| Assert::assertFalse($field->showForContact(null, $contact, $form)); | |
| } | |
| public function testShowForContactIfShowWhenValueExistsIsFalseAndMappedLeadFieldValueDoesNotExist(): void | |
| { | |
| $field = new Field(); | |
| $form = new Form(); | |
| $contact = new class() extends Lead { | |
| public function getFieldValue($field, $group = null) | |
| { | |
| Assert::assertSame('field_a', $field); | |
| return null; | |
| } | |
| }; | |
| $form->setInKioskMode(false); | |
| $field->setShowWhenValueExists(false); | |
| $field->setMappedField('field_a'); | |
| $field->setMappedObject('contact'); | |
| $field->setIsAutoFill(false); | |
| Assert::assertTrue($field->showForContact(null, $contact, $form)); | |
| } | |
| public function testShowForContactIfShowWhenValueExistsIsFalseAndMappedNotLeadFieldValueExists(): void | |
| { | |
| $field = new Field(); | |
| $form = new Form(); | |
| $contact = new class() extends Lead { | |
| public function getFieldValue($field, $group = null) | |
| { | |
| Assert::assertSame('field_a', $field); | |
| return 'Value A'; | |
| } | |
| }; | |
| $form->setInKioskMode(false); | |
| $field->setShowWhenValueExists(false); | |
| $field->setMappedField('field_a'); | |
| $field->setMappedObject('unicorn_object'); | |
| $field->setIsAutoFill(false); | |
| Assert::assertTrue($field->showForContact(null, $contact, $form)); | |
| } | |
| /** | |
| * @dataProvider dataProvider | |
| * | |
| * @param array<string, int> $properties | |
| */ | |
| public function testHasChoices(string $type, array $properties, bool $result): void | |
| { | |
| $field = new Field(); | |
| $field->setProperties($properties); | |
| $field->setType($type); | |
| $this->assertEquals($result, $field->hasChoices()); | |
| } | |
| /** | |
| * @return array<int, mixed> | |
| */ | |
| public static function dataProvider(): iterable | |
| { | |
| yield ['string', [], false]; | |
| yield ['string', ['multiple' => 0], false]; | |
| yield ['string', ['multiple' => 1], true]; | |
| yield ['checkboxgrp', [], true]; | |
| yield ['checkboxgrp', ['multiple' => 0], true]; | |
| yield ['checkboxgrp', ['multiple' => 1], true]; | |
| } | |
| } | |