Passed
Pull Request — 4 (#10177)
by
unknown
09:49
created

FormScaffolderTest   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 146
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 83
dl 0
loc 146
rs 10
c 0
b 0
f 0
wmc 6
1
<?php
2
3
namespace SilverStripe\Forms\Tests;
4
5
use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
6
use SilverStripe\Dev\SapphireTest;
7
use SilverStripe\Control\Controller;
8
use SilverStripe\Forms\FieldList;
9
use SilverStripe\Forms\Form;
10
use SilverStripe\Forms\Tests\FormScaffolderTest\Article;
11
use SilverStripe\Forms\Tests\FormScaffolderTest\ArticleExtension;
12
use SilverStripe\Forms\Tests\FormScaffolderTest\Author;
13
use SilverStripe\Forms\Tests\FormScaffolderTest\Tag;
14
15
/**
16
 * Tests for DataObject FormField scaffolding
17
 */
18
class FormScaffolderTest extends SapphireTest
19
{
20
21
    protected static $fixture_file = 'FormScaffolderTest.yml';
22
23
    protected static $required_extensions = [
24
        Article::class => [
25
            ArticleExtension::class
26
        ]
27
    ];
28
29
    protected static $extra_dataobjects = [
30
        Article::class,
31
        Tag::class,
32
        Author::class,
33
    ];
34
35
36
    public function testGetCMSFieldsSingleton()
37
    {
38
        $article = new Article;
39
        $fields = $article->getCMSFields();
40
        $form = new Form(null, 'TestForm', $fields, new FieldList());
41
        $form->loadDataFrom($article);
42
43
        $this->assertTrue(
44
            $fields->hasTabSet(),
45
            'getCMSFields() produces a TabSet'
46
        );
47
        $this->assertNotNull(
48
            $fields->dataFieldByName('Title'),
49
            'getCMSFields() includes db fields'
50
        );
51
        $this->assertNotNull(
52
            $fields->dataFieldByName('Content'),
53
            'getCMSFields() includes db fields'
54
        );
55
        $this->assertNotNull(
56
            $fields->dataFieldByName('AuthorID'),
57
            'getCMSFields() includes has_one fields on singletons'
58
        );
59
        $this->assertNull(
60
            $fields->dataFieldByName('Tags'),
61
            "getCMSFields() doesn't include many_many fields if no ID is present"
62
        );
63
    }
64
65
    public function testGetCMSFieldsInstance()
66
    {
67
        $article1 = $this->objFromFixture(Article::class, 'article1');
68
69
        $fields = $article1->getCMSFields();
70
        $form = new Form(null, 'TestForm', $fields, new FieldList());
71
        $form->loadDataFrom($article1);
72
73
        $this->assertNotNull(
74
            $fields->dataFieldByName('AuthorID'),
75
            'getCMSFields() includes has_one fields on instances'
76
        );
77
        $this->assertNotNull(
78
            $fields->dataFieldByName('Tags'),
79
            'getCMSFields() includes many_many fields if ID is present on instances'
80
        );
81
        $this->assertNotNull(
82
            $fields->dataFieldByName('SubjectOfArticles'),
83
            'getCMSFields() includes polymorphic has_many fields if ID is present on instances'
84
        );
85
        $this->assertNull(
86
            $fields->dataFieldByName('Subject'),
87
            "getCMSFields() doesn't include polymorphic has_one field"
88
        );
89
        $this->assertNull(
90
            $fields->dataFieldByName('SubjectID'),
91
            "getCMSFields() doesn't include polymorphic has_one id field"
92
        );
93
        $this->assertNull(
94
            $fields->dataFieldByName('SubjectClass'),
95
            "getCMSFields() doesn't include polymorphic has_one class field"
96
        );
97
    }
98
99
    public function testUpdateCMSFields()
100
    {
101
        $article1 = $this->objFromFixture(Article::class, 'article1');
102
103
        $fields = $article1->getCMSFields();
104
        $form = new Form(null, 'TestForm', $fields, new FieldList());
105
        $form->loadDataFrom($article1);
106
107
        $this->assertNotNull(
108
            $fields->dataFieldByName('AddedExtensionField'),
109
            'getCMSFields() includes extended fields'
110
        );
111
    }
112
113
    public function testRestrictCMSFields()
114
    {
115
        $article1 = $this->objFromFixture(Article::class, 'article1');
116
117
        $fields = $article1->scaffoldFormFields(
118
            [
119
            'restrictFields' => ['Title']
120
            ]
121
        );
122
        $form = new Form(null, 'TestForm', $fields, new FieldList());
123
        $form->loadDataFrom($article1);
124
125
        $this->assertNotNull(
126
            $fields->dataFieldByName('Title'),
127
            'scaffoldCMSFields() includes explicitly defined "restrictFields"'
128
        );
129
        $this->assertNull(
130
            $fields->dataFieldByName('Content'),
131
            'getCMSFields() doesn't include fields left out in a "restrictFields" definition'
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_STRING, expecting ',' or ')' on line 131 at column 34
Loading history...
132
        );
133
    }
134
135
    public function testFieldClassesOnGetCMSFields()
136
    {
137
        $article1 = $this->objFromFixture(Article::class, 'article1');
138
139
        $fields = $article1->scaffoldFormFields(
140
            [
141
            'fieldClasses' => ['Title' => 'SilverStripe\\Forms\\HTMLEditor\\HTMLEditorField']
142
            ]
143
        );
144
        $form = new Form(null, 'TestForm', $fields, new FieldList());
145
        $form->loadDataFrom($article1);
146
147
        $this->assertNotNull(
148
            $fields->dataFieldByName('Title')
149
        );
150
        $this->assertInstanceOf(
151
            HTMLEditorField::class,
152
            $fields->dataFieldByName('Title'),
153
            'getCMSFields() doesn't include fields left out in a "restrictFields" definition'
154
        );
155
    }
156
157
    public function testGetFormFields()
158
    {
159
        $fields = Article::singleton()->getFrontEndFields();
160
        $form = new Form(null, 'TestForm', $fields, new FieldList());
161
        $form->loadDataFrom(singleton(Article::class));
162
163
        $this->assertFalse($fields->hasTabSet(), 'getFrontEndFields() doesn't produce a TabSet by default');
164
    }
165
}
166