BuildFormPlainTest.php 29.6 KB
Newer Older
1
<?php
2
3
4
/**
 * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
 */
5
6

require_once(__DIR__ . '/AbstractDatabaseTest.php');
7
8
9
require_once(__DIR__ . '/../../qfq/database/Database.php');
require_once(__DIR__ . '/../../qfq/exceptions/DbException.php');
require_once(__DIR__ . '/../../qfq/QuickFormQuery.php');
10
11
12

class BuildFormPlainTest extends AbstractDatabaseTest {

13
14
15
    /**
     *
     */
16
17
18
19
20
21
22
    public function testGetProcessFilter() {

        $build = new \qfq\BuildFormPlain(array(), array(), array());

        $this->assertEquals(FORM_ELEMENTS_NATIVE, $build->getProcessFilter());
    }

23
24
25
26
27
28
29
30
31
32
33
34
35
36
    /**
     *
     */
    public function testGetFormId() {
        $build = new \qfq\BuildFormPlain(array(), array(), array());

        $formId1 = $build->getFormId();
        $this->assertRegExp('/qfq-form-[0-9a-f]{13}/', $formId1);

        $formId2 = $build->getFormId();
        $this->assertEquals($formId1, $formId2);

    }

37
38
39
    /**
     *
     */
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    public function testWrapItem() {
        $build = new \qfq\BuildFormPlain(array(), array(), array());

        $result = $build->wrapItem(WRAP_SETUP_ELEMENT, 'Hello World', false);
        $this->assertEquals('<p>Hello World</p>', $result);

        $result = $build->wrapItem(WRAP_SETUP_ELEMENT, 'Hello World', true);
        $this->assertEquals('<p>Hello World</p>', $result);

        $result = $build->wrapItem(WRAP_SETUP_ELEMENT, '', false);
        $this->assertEquals('<p></p>', $result);

        $result = $build->wrapItem(WRAP_SETUP_ELEMENT, '', true);
        $this->assertEquals('', $result);
    }

56
57
58
    /**
     *
     */
59
60
61
62
    public function testBuildLabel() {
        $build = new \qfq\BuildFormPlain(array(), array(), array());

        $result = $build->buildLabel('myLabel:123', "Hello World");
63
        $this->assertEquals('<label for="myLabel:123" class="control-label" >Hello World</label>', $result);
64
65
    }

66
67
68
    /**
     *
     */
69
70
71
    public function testBuildInput() {
        $form = array();
        $formElement = array();
Carsten  Rose's avatar
Carsten Rose committed
72
        $json = array();
73

74
        $this->templateFormNFormElement($form, $formElement);
75
76
77

        $build = new \qfq\BuildFormPlain($form, array(), [$formElement]);

78
        $label['123-l'][API_ELEMENT_CONTENT] = '<label for="name:1" class="control-label" >Name</label>';
Carsten  Rose's avatar
Carsten Rose committed
79
        $label['123-r'][API_ELEMENT_ATTRIBUTE] = ['class' => ''];
80

Carsten  Rose's avatar
Carsten Rose committed
81
        $result = $build->buildInput($formElement, 'name:1', '', $json);
82
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
83
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
84
85

        // CheckType
86
87
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_MIN_MAX;
        $formElement[FE_CHECK_PATTERN] = '1|10';
Carsten  Rose's avatar
Carsten Rose committed
88
        $result = $build->buildInput($formElement, 'name:1', '', $json);
89
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" min="1" max="10" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
90
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
91

92
93
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_PATTERN;
        $formElement[FE_CHECK_PATTERN] = '^[a-z]*$';
Carsten  Rose's avatar
Carsten Rose committed
94
        $result = $build->buildInput($formElement, 'name:1', '', $json);
95
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="^[a-z]*$" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
96
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
97

98
99
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_DIGIT;
        $formElement[FE_CHECK_PATTERN] = '';
Carsten  Rose's avatar
Carsten Rose committed
100
        $result = $build->buildInput($formElement, 'name:1', '', $json);
101
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="^[\d]*$" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
102
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
103

104
105
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_EMAIL;
        $formElement[FE_CHECK_PATTERN] = '';
Carsten  Rose's avatar
Carsten Rose committed
106
        $result = $build->buildInput($formElement, 'name:1', '', $json);
107
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
108
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
109

110
111
        $formElement[FE_CHECK_TYPE] = '';
        $formElement[FE_CHECK_PATTERN] = '';
112
113
114
115
116


        // Explizit size
        $formElement['size'] = 40;
        $formElement['maxLength'] = 40;
Carsten  Rose's avatar
Carsten Rose committed
117
        $result = $build->buildInput($formElement, 'name:1', '', $json);
118
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="40" type="input" size="40" value="" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
119
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
120
121
122

        // maxlength bigger than physical spec:
        $formElement['maxLength'] = 1000;
Carsten  Rose's avatar
Carsten Rose committed
123
        $result = $build->buildInput($formElement, 'name:1', '', $json);
124
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" size="40" value="" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
125
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
126

127
128
129
130
131
132
        // no size, no maxlength and column not in primary table
        $formElement2 = $formElement;
        $formElement2['maxLength'] = '';
        $formElement2['size'] = '';
        $formElement2['name'] = 'specialname';
        $result = $build->buildInput($formElement2, 'specialname:1', '', $json);
133
        $this->assertEquals('<input id="123" name="specialname:1" class="form-control" type="input" value="" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
134
135
136
137

        // no size,  given maxlength and column not in primary table
        $formElement2['maxLength'] = '10';
        $result = $build->buildInput($formElement2, 'specialname:1', '', $json);
138
        $this->assertEquals('<input id="123" name="specialname:1" class="form-control" maxlength="10" type="input" value="" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
139
140
141
142
143

        // size given, no maxlength and column not in primary table
        $formElement2['maxLength'] = '';
        $formElement2['size'] = '10';
        $result = $build->buildInput($formElement2, 'specialname:1', '', $json);
144
        $this->assertEquals('<input id="123" name="specialname:1" class="form-control" type="input" size="10" value="" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
145
146
147
148
149

        // size given, maxlength given and column not in primary table
        $formElement2['maxLength'] = '20';
        $formElement2['size'] = '10';
        $result = $build->buildInput($formElement2, 'specialname:1', '', $json);
150
        $this->assertEquals('<input id="123" name="specialname:1" class="form-control" maxlength="20" type="input" size="10" value="" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
151
152


153
154
155
        // Explicit: further
        $formElement['tooltip'] = 'Nice Tooltip';
        $formElement['placeholder'] = 'Please type a name';
Carsten  Rose's avatar
Carsten Rose committed
156
        $result = $build->buildInput($formElement, 'name:1', 'Hello World', $json);
157
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" size="40" value="Hello World" placeholder="Please type a name" title="Nice Tooltip" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
158
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => 'Hello World', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
159
160
161

        // textarea
        $formElement['size'] = '40,10';
Carsten  Rose's avatar
Carsten Rose committed
162
        $result = $build->buildInput($formElement, 'name:1', 'Hello World', $json);
163
        $this->assertEquals('<textarea id="123" name="name:1" class="form-control" maxlength="255" cols="40" rows="10" placeholder="Please type a name" title="Nice Tooltip" data-hidden="no" data-required="no" >Hello World</textarea><div class="help-block with-errors hidden"></div>', $result);
164

Carsten  Rose's avatar
Carsten Rose committed
165
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => 'Hello World', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
166
167

        $formElement['size'] = ' 40     , 10 ';
Carsten  Rose's avatar
Carsten Rose committed
168
        $result = $build->buildInput($formElement, 'name:1', 'Hello World', $json);
169
        $this->assertEquals('<textarea id="123" name="name:1" class="form-control" maxlength="255" cols="40" rows="10" placeholder="Please type a name" title="Nice Tooltip" data-hidden="no" data-required="no" >Hello World</textarea><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
170
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => 'Hello World', 'disabled' => false, API_ELEMENT_UPDATE => $label], $json);
171
172
173
    }

    /**
174
     * @expectedException \qfq\UserFormException
175
176
177
178
179
     *
     */
    public function testBuildInputException() {
        $form = array();
        $formElement = array();
Carsten  Rose's avatar
Carsten Rose committed
180
        $json = array();
181

182
        $this->templateFormNFormElement($form, $formElement);
183
184
185

        $build = new \qfq\BuildFormPlain($form, array(), [$formElement]);

186
187
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_MIN_MAX;
        $formElement[FE_CHECK_PATTERN] = '';
Carsten  Rose's avatar
Carsten Rose committed
188
        $result = $build->buildInput($formElement, 'name:1', '', $json);
189
190
    }

191
192
193
    /**
     *
     */
194
195
196
197
    public function testGetKeyValueListFromSqlEnumSpec() {
        $form = array();
        $formElement = array();

198
        $this->templateFormNFormElement($form, $formElement);
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
        $formElement['name'] = 'deleted';

        $build = new \qfq\BuildFormPlain($form, array(), [$formElement]);

        $keys = array();
        $values = array();

        // Spec Enum
        $expect = ['yes', 'no'];
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // Spec Enum + emptyItemAtStart
        $expect = ['', 'yes', 'no'];
214
        $formElement[FE_EMPTY_ITEM_AT_START] = '';
215
216
217
218
219
220
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // Spec Enum + emptyItemAtEnd
        $expect = ['', 'yes', 'no', ''];
221
        $formElement[FE_EMPTY_ITEM_AT_END] = '';
222
223
224
225
226
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // clean
227
228
        unset($formElement[FE_EMPTY_ITEM_AT_START]);
        unset($formElement[FE_EMPTY_ITEM_AT_END]);
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255

        // listItem: only value
        $expect = ['a', 'b', 'c'];
        $formElement['itemList'] = 'a,b,c';
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // listItem: key/value
        $expectKeys = ['A', 'B', 'C'];
        $expectValues = ['a', 'b', 'c'];
        $formElement['itemList'] = 'A:a,B:b,C:c';
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expectKeys, $keys);
        $this->assertEquals($expectValues, $values);

        // listItem: key/value + emptyItemAtEnd
        $formElement['emptyItemAtEnd'] = '';
        $expectKeys = ['A', 'B', 'C', ''];
        $expectValues = ['a', 'b', 'c', ''];
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expectKeys, $keys);
        $this->assertEquals($expectValues, $values);
        unset($formElement['emptyItemAtEnd']);

        // SQL
        $formElement['sql1'] = $this->db->sql('SELECT name FROM Form AS f ORDER BY f.id LIMIT 3');
Carsten  Rose's avatar
Carsten Rose committed
256
257
//        $expect = ['form', 'formElement', 'phpunit_person'];
        $expect = ['form', 'formElement', 'copyForm'];
258
259
260
261
262
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // SQL (one column, no keyword) + emptyItemAtStart
263
        $formElement[FE_EMPTY_ITEM_AT_START] = '';
264
        $formElement['sql1'] = $this->db->sql('SELECT name FROM Form AS f ORDER BY f.id LIMIT 3');
Carsten  Rose's avatar
Carsten Rose committed
265
266
//        $expect = ['', 'form', 'formElement', 'phpunit_person'];
        $expect = ['', 'form', 'formElement', 'copyForm'];
267
268
269
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);
Carsten  Rose's avatar
Carsten Rose committed
270
        unset($formElement[FE_EMPTY_ITEM_AT_START]);
271
272
273

        // SQL (4 columns, none 'id' nor 'label') - Take the first two columns
        $expectKeys = ['10', '20', '30'];
274
        $expectValues = ['basic', 'access', 'various'];
275
276
277
278
279
280
281
        $formElement['sql1'] = $this->db->sql('SELECT ord, name, created, modified  FROM FormElement AS fe ORDER BY fe.id LIMIT 3');
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expectKeys, $keys);
        $this->assertEquals($expectValues, $values);

        // SQL (4 columns, none 'id', one 'label' ) - Take the first and the fourth two columns
        $expectKeys = ['10', '20', '30'];
282
        $expectValues = ['basic', 'access', 'various'];
283
284
285
286
287
288
289
        $formElement['sql1'] = $this->db->sql('SELECT ord, created, modified, name AS label FROM FormElement AS fe ORDER BY fe.id LIMIT 3');
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expectKeys, $keys);
        $this->assertEquals($expectValues, $values);

        // SQL (4 columns, none 'id', one 'label' ) - Take the first and the fourth two columns
        $expectKeys = ['1', '2', '3'];
290
        $expectValues = ['basic', 'access', 'various'];
291
292
293
294
295
296
297
        $formElement['sql1'] = $this->db->sql('SELECT ord, created, modified, name AS label, id FROM FormElement AS fe ORDER BY fe.id LIMIT 3');
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expectKeys, $keys);
        $this->assertEquals($expectValues, $values);
    }

    /**
298
     * @expectedException \qfq\UserFormException
299
300
301
302
303
304
     *
     */
    public function testGetKeyValueListFromSqlEnumSpecException() {
        $form = array();
        $formElement = array();

305
        $this->templateFormNFormElement($form, $formElement);
306
307
308
309

        $build = new \qfq\BuildFormPlain($form, array(), [$formElement]);

        $formElement['name'] = 'noteInternal';
310
311
        $keys = array();
        $values = array();
312
313
314
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
    }

315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330

    /**
     *
     */
    public function testBuildSubrecord() {
        $form = array();
        $formElement = array();
        $json = array();

        $this->templateFormNFormElement($form, $formElement);
        // CheckType
        $build = new \qfq\BuildFormPlain($form, array(), [$formElement]);

        // id: 1, firstName: John, name: Doe
        $formElement['sql1'] = $this->db->sql('SELECT id, name, firstName FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
331
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>id</th><th>name</th><th>firstName</th></tr></thead><tr class="record" ><td>1</td><td>Doe</td><td>John</td></tr><tr class="record" ><td>2</td><td>Smith</td><td>Jane</td></tr></table>', $result);
332
333
334
335

        // _id: 1, name: Doe,
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
336
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>name</th></tr></thead><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></table>', $result);
337

338
339
340
        // _id: 1, name: Doe,title=''
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name AS "title=" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
341
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th></th></tr></thead><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></table>', $result);
342
343
344
345

        // _id: 1, name: Doe, column: _Person
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name AS "unused|width=2|title=_Person", firstName  FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
346
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>firstName</th></tr></thead><tr class="record" ><td>John</td></tr><tr class="record" ><td>Jane</td></tr></table>', $result);
347

348
349
350
        // _id: 1, name: Doe, title: PERSON
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name AS "PERSON" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
351
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>PERSON</th></tr></thead><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></table>', $result);
352
353
354
355

        // _id: 1, "This is a much longer text than necessary": Default max:20
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", "This is a much longer text than necessary" FROM Person ORDER BY id LIMIT 1');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
356
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>This is a much longe</th></tr></thead><tr class="record" ><td>This is a much longe</td></tr></table>', $result);
357
358
359
360

        // _id: 1, name: Jo (width:2)
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name AS "2" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
361
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th></th></tr></thead><tr class="record" ><td>Do</td></tr><tr class="record" ><td>Sm</td></tr></table>', $result);
362
363
364
365

        // _id: 1, name: Jo (width:2)
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name AS "2|PERSON" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
366
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>PE</th></tr></thead><tr class="record" ><td>Do</td></tr><tr class="record" ><td>Sm</td></tr></table>', $result);
367
368
369
370

        // _id: 1, name: Doe ('width':3)
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name AS "Name|width=3" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
371
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>Nam</th></tr></thead><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smi</td></tr></table>', $result);
372
373
374
375

        // _id: 1, name: Doe (width:3, title:PERSON)
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name AS "3|title=PERSON" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
376
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>PER</th></tr></thead><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smi</td></tr></table>', $result);
377
378
379
380

        // _id: 1, name: <b>Doe</b>
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", CONCAT("<b>", name, "</b>") AS "Name" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
381
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>Name</th></tr></thead><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></table>', $result);
382

383
384
385
        // _id: 1, name: <b>Doe</b>, width=2
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", CONCAT("<b>", name, "</b>") AS "Name|2" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
386
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>Na</th></tr></thead><tr class="record" ><td>Do</td></tr><tr class="record" ><td>Sm</td></tr></table>', $result);
387

388
389
390
        // _id: 1, name: <b>Doe</b> , nostrip
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", CONCAT("<b>", name, "</b>") AS "Name|nostrip" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
391
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>Name</th></tr></thead><tr class="record" ><td><b>Doe</b></td></tr><tr class="record" ><td><b>Smith</b></td></tr></table>', $result);
392
393
394
395

        // _id: 1, icon: bullet-green.gif
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", "bullet-green.gif" AS "Status|icon" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
396
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>Status</th></tr></thead><tr class="record" ><td><image src=\'typo3conf/ext/qfq/Resources/Public/icons/bullet-green.gif\'></td></tr><tr class="record" ><td><image src=\'typo3conf/ext/qfq/Resources/Public/icons/bullet-green.gif\'></td></tr></table>', $result);
397
398
399
400

        // _id: 1, mailto: john@doe.com
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", "john@doe.com" AS "EMail|mailto" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
401
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>EMail</th></tr></thead><tr class="record" ><td><a href="mailto:john@doe.com" >john@doe.com</a></td></tr><tr class="record" ><td><a href="mailto:john@doe.com" >john@doe.com</a></td></tr></table>', $result);
402
403
404
405

        // _id: 1, url: www.uzh.ch
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", "www.uzh.ch" AS "URL|url" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
406
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>URL</th></tr></thead><tr class="record" ><td><a href="www.uzh.ch" >www.uzh.ch</a></td></tr><tr class="record" ><td><a href="www.uzh.ch" >www.uzh.ch</a></td></tr></table>', $result);
407
408
409
410

        // _id: 1, name: Doe, _rowclass (text)
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name, IF(id=1,"text-warning", "text-danger") AS _rowClass FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
411
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>name</th></tr></thead><tr class="record text-warning" ><td>Doe</td></tr><tr class="record text-danger" ><td>Smith</td></tr></table>', $result);
412
413
414
415

        // _id: 1, name: Doe, _rowClass (text & background)
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name, IF(id=1,"text-warning active", "text-danger success") AS _rowClass FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
416
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>name</th></tr></thead><tr class="record text-warning active" ><td>Doe</td></tr><tr class="record text-danger success" ><td>Smith</td></tr></table>', $result);
417
418
419
420

        // _id: 1, name: Doe, _rowTitle
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name, firstName AS _rowTitle FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
421
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>name</th></tr></thead><tr class="record" title="John" ><td>Doe</td></tr><tr class="record" title="Jane" ><td>Smith</td></tr></table>', $result);
422
423

        // _id: 1, name: Doe, title, width, nostrip
424
425
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name, "<b>This again is a very long text</b>" AS "title=Important|width=10|nostrip" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
426
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>name</th><th>Important</th></tr></thead><tr class="record" ><td>Doe</td><td><b>This again is a very long text</b></td></tr><tr class="record" ><td>Smith</td><td><b>This again is a very long text</b></td></tr></table>', $result);
427
428
429
430

        // _id: 1, name: Doe, link
        $formElement['sql1'] = $this->db->sql('SELECT id AS "_id", name, CONCAT("s:1|p:form&form=person&r=" , id , "|t:", name) AS "link" FROM Person ORDER BY id LIMIT 2');
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
431
        $this->assertEquals('<table class=\'table table-hover\'><thead><tr><th>name</th><th></th></tr></thead><tr class="record" ><td>Doe</td><td><a href="index.php?id=form&s=badcaffee1234" class="internal" >Doe</a></td></tr><tr class="record" ><td>Smith</td><td><a href="index.php?id=form&s=badcaffee1234" class="internal" >Smith</a></td></tr></table>', $result);
432
433
    }

434
435
436
437
438
    /**
     *
     */
    private function templateFormNFormElement(array &$form, array &$formElement) {
        $form = [
Carsten  Rose's avatar
Carsten Rose committed
439
440
441
442
443
444
445
            'id'              => '1',
            'name'            => 'form',
            'title'           => 'Form Editor: {{SELECT id, " / ", title FROM Form WHERE id => {{recordId:S0}}}}',
            'noteInternal'    => 'Please secure the form',
            'tableName'       => 'Form',
            'permitNew'       => 'always',
            'permitEdit'      => 'always',
446
            'permitUrlParameter' => '',
Carsten  Rose's avatar
Carsten Rose committed
447
448
449
            'render'          => 'bootstrap',
            'multiMode'       => 'none',
            'multiSql'        => '',
450
451
            'multiDetailForm' => '',
            'multiDetailFormParameter' => '',
Carsten  Rose's avatar
Carsten Rose committed
452
453
454
455
456
457
458
            F_FORWARD_MODE    => 'auto',
            F_FORWARD_PAGE    => '',
            'bsLabelColumns'  => '',
            'bsInputColumns'  => '',
            'bsNoteColumns'   => '',
            'parameter'       => 'maxVisiblePill=>3',
            'deleted'         => 'no',
459
460
461
        ];

        $formElement = [
Carsten  Rose's avatar
Carsten Rose committed
462
463
            'id'            => 123,
            FE_ID           => 1,
464
465
            FE_ID_CONTAINER => 0,
            FE_DYNAMIC_UPDATE => 'no',
Carsten  Rose's avatar
Carsten Rose committed
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
            'enabled'       => 'yes',
            FE_NAME         => 'name',
            FE_LABEL        => 'Name',
            FE_MODE         => 'show',
            'class'         => 'native',
            FE_TYPE         => 'input',
            'value'         => '',
            'sql1'          => '',
            'parameter'     => '',
            'debug'         => 'no',
            'deleted'       => 'no',
            'size'          => '',
            'maxLength'     => '255',
            'tooltip'       => '',
            'placeholder'   => '',
            FE_CHECK_TYPE   => '',
482
            FE_CHECK_PATTERN => '',
Carsten  Rose's avatar
Carsten Rose committed
483
484
            FE_HTML_ID      => '123',
            FE_HIDE_ZERO    => '0',
485

Carsten  Rose's avatar
Carsten Rose committed
486
            'tabindex'      => 0,
487
488
489
490
491
492
493
494
495
496
497
498
499
        ];

    }

//    /**
//     * @throws Exception
//     */
//    protected function setUp() {
//        parent::setUp();
//
//        $this->executeSQLFile(__DIR__ . '/fixtures/Generic.sql', true);
//    }

500
501
502
503
504
505
506
507
    /**
     * @throws Exception
     */
    protected function setUp() {
        $_GET['form'] = 'phpunit_person';

        parent::setUp();

508
509
510
511
512
        // Use always the latest (production) FormEditor: played during QuickFormQuery()
        $this->db->sql("DROP TABLE IF EXISTS `Form`");
        $this->db->sql("DROP TABLE IF EXISTS `FormElement`");
        $this->executeSQLFile(__DIR__ . '/../../sql/formEditor.sql', true);

513
        $this->store->unsetStore(STORE_ADDITIONAL_FORM_ELEMENTS);
514
        $this->executeSQLFile(__DIR__ . '/fixtures/Generic.sql', true);
515
        $this->executeSQLFile(__DIR__ . '/fixtures/TestForm.sql', true);
516
517
518
519
520

        // Defaults
        $this->store->setVar('name', 'varchar(255)', STORE_TABLE_COLUMN_TYPES, true);
        $this->store->setVar('deleted', "enum('yes','no')", STORE_TABLE_COLUMN_TYPES, true);

521
        $GLOBALS["TSFE"] = new FakeTSFEBuildPlain();
522

Carsten  Rose's avatar
Carsten Rose committed
523
524
        $form = new \qfq\QuickFormQuery(['bodytext' => "form=form\nr=3", 'uid' => 1234], true);

525
526
        // After instantiating QuickFormQuery, the latest updates will be played. The SIP is by default activated which breaks current tests.
        $this->db->sql("UPDATE Form SET permitNew='always', permitEdit='always' WHERE name='form' ");
Carsten  Rose's avatar
Carsten Rose committed
527
        $form->process();
528
529
    }
}
530

531
class FakeTSFEBuildPlain {
532
    public $id = 1;
533
534
    public $type = 1;
    public $sys_language_uid = 1;
535
536
}

537

538