File size: 3,687 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php

declare(strict_types=1);

namespace Mautic\FormBundle\Tests\Event\Service;

use Mautic\FormBundle\Entity\Field;
use Mautic\FormBundle\Entity\Form;
use Mautic\FormBundle\Entity\Submission;
use Mautic\FormBundle\Event\Service\FieldValueTransformer;
use Mautic\FormBundle\Event\SubmissionEvent;
use PHPUnit\Framework\Assert;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Router;

final class FieldValueTransformerTest extends \PHPUnit\Framework\TestCase
{
    public function testTransformValuesAfterSubmitWithNoFieldsNoMatchesAndNoTokens(): void
    {
        $router = new class() extends Router {
            public function __construct()
            {
            }
        };
        $transformer     = new FieldValueTransformer($router);
        $submission      = new Submission();
        $form            = new Form();
        $request         = new Request();
        $submissionEvent = new SubmissionEvent($submission, [], [], $request);
        $submission->setForm($form);
        $transformer->transformValuesAfterSubmit($submissionEvent);

        Assert::assertSame([], $submissionEvent->getTokens());
        Assert::assertSame([], $submissionEvent->getContactFieldMatches());
    }

    public function testTransformValuesAfterSubmitWithFileFieldMatchesAndTokens(): void
    {
        $router                                   = new class() extends Router {
            public int $generateMethodCallCounter = 0;

            public function __construct()
            {
            }

            public function generate(string $name, mixed $parameters = [], int $referenceType = self::ABSOLUTE_PATH)
            {
                Assert::assertSame('mautic_form_file_download', $name);
                Assert::assertSame([
                    'submissionId' => 456,
                    'field'        => 'file_field_1',
                ], $parameters);
                Assert::assertSame(self::ABSOLUTE_URL, $referenceType);
                ++$this->generateMethodCallCounter;

                return 'generated/route';
            }
        };
        $transformer = new FieldValueTransformer($router);
        $submission  = new class() extends Submission {
            public function getId(): int
            {
                return 456;
            }
        };
        $form            = new Form();
        $field           = new Field();
        $request         = new Request();
        $submissionEvent = new SubmissionEvent($submission, [], [], $request);
        $field->setType('file');
        $field->setAlias('file_field_1');
        $field->setMappedField('contact_field_1');
        $field->setMappedObject('contact');
        $form->addField('123', $field);
        $submission->setForm($form);
        $submissionEvent->setTokens(['{formfield=file_field_1}' => 'original/route']);
        $submissionEvent->setContactFieldMatches(['contact_field_1' => 'original/route']);
        $transformer->transformValuesAfterSubmit($submissionEvent);

        Assert::assertSame(['{formfield=file_field_1}' => 'generated/route'], $submissionEvent->getTokens());
        Assert::assertSame(['{formfield=file_field_1}' => 'generated/route'], $transformer->getTokensToUpdate());
        Assert::assertSame(['contact_field_1' => 'generated/route'], $submissionEvent->getContactFieldMatches());
        Assert::assertSame(['contact_field_1' => 'generated/route'], $transformer->getContactFieldsToUpdate());

        // Calling it for the second time to ensure it's executed only once.
        $transformer->transformValuesAfterSubmit($submissionEvent);
        Assert::assertSame(1, $router->generateMethodCallCounter);
    }
}