BuildFormPlainTest.php 46.4 KB
Newer Older
1
<?php
2
/**
3
 * @author Carsten Rose <carsten.rose@math.uzh.ch>
4
 */
5

6
7
8
namespace qfq;

require_once(__DIR__ . '/database/AbstractDatabaseTest.php');
9

10
11
12
/**
 * Class BuildFormPlainTest
 */
13
14
class BuildFormPlainTest extends AbstractDatabaseTest {

15
    /**
Carsten  Rose's avatar
Carsten Rose committed
16
17
18
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
19
     */
20
21
    public function testGetProcessFilter() {

Carsten  Rose's avatar
Carsten Rose committed
22
        $build = new BuildFormPlain([F_DB_INDEX => DB_INDEX_DEFAULT], array(), array(), $this->dbArray);
23
24
25
26

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

27
    /**
Carsten  Rose's avatar
Carsten Rose committed
28
29
30
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
31
32
     */
    public function testGetFormId() {
Carsten  Rose's avatar
Carsten Rose committed
33
        $build = new BuildFormPlain([F_DB_INDEX => DB_INDEX_DEFAULT], array(), array(), $this->dbArray);
34
35
36
37
38
39
40
41
42

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

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

    }

43
    /**
Carsten  Rose's avatar
Carsten Rose committed
44
45
46
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
47
     */
48
    public function testWrapItem() {
Carsten  Rose's avatar
Carsten Rose committed
49
        $build = new BuildFormPlain([F_DB_INDEX => DB_INDEX_DEFAULT], array(), array(), $this->dbArray);
50
51
52
53
54
55
56
57
58
59
60
61
62
63

        $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);
    }

64
    /**
Carsten  Rose's avatar
Carsten Rose committed
65
66
67
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
68
     */
69
    public function testBuildLabel() {
Carsten  Rose's avatar
Carsten Rose committed
70
        $build = new BuildFormPlain([F_DB_INDEX => DB_INDEX_DEFAULT], array(), array(), $this->dbArray);
71
72

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

76
    /**
Carsten  Rose's avatar
Carsten Rose committed
77
78
79
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
80
     */
81
82
83
    public function testBuildInput() {
        $form = array();
        $formElement = array();
Carsten  Rose's avatar
Carsten Rose committed
84
        $json = array();
85

86
        $this->templateFormNFormElement($form, $formElement);
87

88
        $build = new BuildFormPlain($form, array(), [$formElement], $this->dbArray);
Elias Villiger's avatar
Elias Villiger committed
89
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALL;
Carsten  Rose's avatar
Carsten Rose committed
90
        $formElement[FE_DECIMAL_FORMAT] = '';
91

92
        $label['123-l'][API_ELEMENT_CONTENT] = '<label for="name:1" class="control-label" >Name</label>';
Carsten  Rose's avatar
Carsten Rose committed
93
94
//        $label['123'][API_ELEMENT_ATTRIBUTE] = ['value' => ''];
        $label['123'][API_ELEMENT_ATTRIBUTE] = ['value' => '', 'required' => false, 'hidden' => false];
Carsten  Rose's avatar
Carsten Rose committed
95
        $label['123-r'][API_ELEMENT_ATTRIBUTE] = ['class' => ''];
96

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

101
        // Min/Max
102
103
        $formElement[FE_MIN] = '1';
        $formElement[FE_MAX] = '10';
Carsten  Rose's avatar
Carsten Rose committed
104
        $result = $build->buildInput($formElement, 'name:1', '', $json);
105
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="number" value="" data-error="Error" min="1" max="10" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
106
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
107

108
        $formElement[FE_MIN] = '1';
109
110
        $formElement[FE_MAX] = '';
        $result = $build->buildInput($formElement, 'name:1', '', $json);
111
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" data-error="Error" min="1" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
112
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
113
114

        $formElement[FE_MIN] = '';
115
        $formElement[FE_MAX] = '10';
116
        $result = $build->buildInput($formElement, 'name:1', '', $json);
117
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" data-error="Error" max="10" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
118
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
119
120
121
122

        $formElement[FE_MIN] = '0';
        $formElement[FE_MAX] = '10';
        $result = $build->buildInput($formElement, 'name:1', '', $json);
123
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" data-error="Error" min="0" max="10" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
124
125
126
127
128
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);

        $formElement[FE_MIN] = '-5';
        $formElement[FE_MAX] = '0';
        $result = $build->buildInput($formElement, 'name:1', '', $json);
129
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" data-error="Error" min="-5" max="0" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
130
131
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);

132
133
134
        // reset so they don't interfere with next tests
        $formElement[FE_MIN] = '';
        $formElement[FE_MAX] = '';
135

136
        // CheckType: custom pattern, standard data-pattern-error
137
138
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_PATTERN;
        $formElement[FE_CHECK_PATTERN] = '^[a-z]*$';
Carsten  Rose's avatar
Carsten Rose committed
139
        $result = $build->buildInput($formElement, 'name:1', '', $json);
140
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="^[a-z]*$" data-pattern-error="' . F_FE_DATA_PATTERN_ERROR_DEFAULT . '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
141
        $label['123'][API_ELEMENT_ATTRIBUTE]['pattern'] = '^[a-z]*$';
142
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
143

144
145
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_DIGIT;
        $formElement[FE_CHECK_PATTERN] = '';
Carsten  Rose's avatar
Carsten Rose committed
146
        $result = $build->buildInput($formElement, 'name:1', '', $json);
147
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="^[\d]*$" data-pattern-error="' . SANITIZE_ALLOW_DIGIT_MESSAGE . '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
148
149

        $label['123'][API_ELEMENT_ATTRIBUTE]['pattern'] = '^[\d]*$';
150
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
151

152
153
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_EMAIL;
        $formElement[FE_CHECK_PATTERN] = '';
Carsten  Rose's avatar
Carsten Rose committed
154
        $result = $build->buildInput($formElement, 'name:1', '', $json);
Marc Egger's avatar
Marc Egger committed
155
        $label['123'][API_ELEMENT_ATTRIBUTE]['pattern'] = '^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})?$';
Marc Egger's avatar
Marc Egger committed
156
        $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-pattern-error="' . SANITIZE_ALLOW_EMAIL_MESSAGE . '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
157
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
158

159
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALL;
160
        $formElement[FE_CHECK_PATTERN] = '';
161
162


163
164
165
        // Decimal format
        $formElement[FE_DECIMAL_FORMAT] = '5,2';
        $result = $build->buildInput($formElement, 'name:1', '', $json);
166
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="^-?[0-9]{0,3}(\.[0-9]{0,2})?$" data-pattern-error="Requested decimal format (mantis,decimal): 5,2" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
167
        $label['123'][API_ELEMENT_ATTRIBUTE]['pattern'] = '^-?[0-9]{0,3}(\.[0-9]{0,2})?$';
168
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
169
170
171
172
173

        $formElement[FE_DECIMAL_FORMAT] = '';


        // Explicit size
174
175
        $formElement['size'] = 40;
        $formElement['maxLength'] = 40;
Carsten  Rose's avatar
Carsten Rose committed
176
        $result = $build->buildInput($formElement, 'name:1', '', $json);
177
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="40" type="input" size="40" value="" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
Carsten  Rose's avatar
Carsten Rose committed
178
        unset($label['123'][API_ELEMENT_ATTRIBUTE]['pattern']);
179
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => '', API_ELEMENT_UPDATE => $label], $json);
180
181

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

187
188
189
190
191
192
        // 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);
193
        $this->assertEquals('<input id="123" name="specialname:1" class="form-control" type="input" value="" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
194
195
196
197

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

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

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

214
        // Explicit: further
215
216
217
        $formElement2['tooltip'] = 'Nice Tooltip';
        $formElement2['placeholder'] = 'Please type a name';
        $result = $build->buildInput($formElement2, 'name:1', 'Hello World', $json);
218
        $this->assertEquals('<input id="123" name="name:1" class="form-control" type="input" value="Hello World" placeholder="Please type a name" data-error="Error" 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
219
        $label['123'][API_ELEMENT_ATTRIBUTE] = ['value' => 'Hello World', 'required' => false, 'hidden' => false];
220
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => 'Hello World', API_ELEMENT_UPDATE => $label], $json);
221
222

        // textarea
223
224
        $formElement2['size'] = '40,10';
        $result = $build->buildInput($formElement2, 'name:1', 'Hello World', $json);
225
        $this->assertEquals('<textarea id="123" name="name:1" class="form-control" cols="40" rows="10" placeholder="Please type a name" data-error="Error" title="Nice Tooltip" data-hidden="no" data-required="no" >Hello World</textarea><div class="help-block with-errors hidden"></div>', $result);
226

227
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => 'Hello World', API_ELEMENT_UPDATE => $label], $json);
228

229
230
        $formElement2['size'] = ' 40     , 10 ';
        $result = $build->buildInput($formElement2, 'name:1', 'Hello World', $json);
231
        $this->assertEquals('<textarea id="123" name="name:1" class="form-control" cols="40" rows="10" placeholder="Please type a name" data-error="Error" title="Nice Tooltip" data-hidden="no" data-required="no" >Hello World</textarea><div class="help-block with-errors hidden"></div>', $result);
232
        $this->assertEquals(['disabled' => false, FE_MODE_REQUIRED => '', 'form-element' => 'name:1', 'value' => 'Hello World', API_ELEMENT_UPDATE => $label], $json);
233
234
    }

235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
    /**
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
     */
    public function testBuildInputPattern() {
        $form = array();
        $formElement = array();
        $json = array();

        $this->templateFormNFormElement($form, $formElement);

        $build = new BuildFormPlain($form, array(), [$formElement], $this->dbArray);
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALL;
        $formElement[FE_DECIMAL_FORMAT] = '';

        $label['123-l'][API_ELEMENT_CONTENT] = '<label for="name:1" class="control-label" >Name</label>';
        $label['123'][API_ELEMENT_ATTRIBUTE] = ['value' => '', 'required' => false, 'hidden' => false];
        $label['123-r'][API_ELEMENT_ATTRIBUTE] = ['class' => ''];

        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
257
258
259
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_ALNUMX .
            '" data-pattern-error="' . SANITIZE_ALLOW_ALNUMX_MESSAGE .
            '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
260
261
262

        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_DIGIT;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
263
264
265
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_DIGIT .
            '" data-pattern-error="' . SANITIZE_ALLOW_DIGIT_MESSAGE .
            '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
266
267
268

        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_NUMERICAL;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
269
270
271
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_NUMERICAL .
            '" data-pattern-error="' . SANITIZE_ALLOW_NUMERICAL_MESSAGE .
            '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
272
273
274

        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_EMAIL;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
275
276
277
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_EMAIL .
            '" data-pattern-error="' . SANITIZE_ALLOW_EMAIL_MESSAGE .
            '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
278
279
280

        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALLBUT;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
281
282
283
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_ALLBUT .
            '" data-pattern-error="' . SANITIZE_ALLOW_ALLBUT_MESSAGE .
            '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
284
285
286

        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALL;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
287
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
288
289
290
291

        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_PATTERN;
        $formElement[FE_CHECK_PATTERN] = '^[0-2]$';
        $result = $build->buildInput($formElement, 'name:1', '', $json);
292
293
294
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . $formElement[FE_CHECK_PATTERN] .
            '" data-pattern-error="' . F_FE_DATA_PATTERN_ERROR_DEFAULT .
            '" data-error="Error" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
295
296
297
298
299
300
301
    }

    /**
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
     */
Carsten  Rose's avatar
Carsten Rose committed
302
    public function testBuildInputSpecificErrorTextDefault() {
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
        $form = array();
        $formElement = array();
        $json = array();

        $this->templateFormNFormElement($form, $formElement);

        $build = new BuildFormPlain($form, array(), [$formElement], $this->dbArray);
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALL;
        $formElement[FE_DECIMAL_FORMAT] = '';

        $label['123-l'][API_ELEMENT_CONTENT] = '<label for="name:1" class="control-label" >Name</label>';
        $label['123'][API_ELEMENT_ATTRIBUTE] = ['value' => '', 'required' => false, 'hidden' => false];
        $label['123-r'][API_ELEMENT_ATTRIBUTE] = ['class' => ''];

        // Defaults data-pattern-error: ALNUMX
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_ALNUMX .
321
            '" data-pattern-error="' . SANITIZE_ALLOW_ALNUMX_MESSAGE .
322
323
            '" data-error="' . F_FE_DATA_ERROR_DEFAULT . '" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);

Carsten  Rose's avatar
Carsten Rose committed
324
325
326
327
328
329
        // Defaults data-pattern-error: DIGIT
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_DIGIT;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_DIGIT .
            '" data-pattern-error="' . SANITIZE_ALLOW_DIGIT_MESSAGE .
            '" data-error="' . F_FE_DATA_ERROR_DEFAULT . '" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
330

Carsten  Rose's avatar
Carsten Rose committed
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
        // Defaults data-pattern-error: NUMERICAL
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_NUMERICAL;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_NUMERICAL .
            '" data-pattern-error="' . SANITIZE_ALLOW_NUMERICAL_MESSAGE .
            '" data-error="' . F_FE_DATA_ERROR_DEFAULT . '" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);

        // Defaults data-pattern-error: EMAIL
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_EMAIL;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_EMAIL .
            '" data-pattern-error="' . SANITIZE_ALLOW_EMAIL_MESSAGE .
            '" data-error="' . F_FE_DATA_ERROR_DEFAULT . '" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);

        // Defaults data-pattern-error: ALLBUT
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALLBUT;
        $result = $build->buildInput($formElement, 'name:1', '', $json);
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_ALLBUT .
            '" data-pattern-error="' . SANITIZE_ALLOW_ALLBUT_MESSAGE .
            '" data-error="' . F_FE_DATA_ERROR_DEFAULT . '" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
    }

    /**
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
     */
    public function testBuildInputCustomErrorText() {
        $form = array();
        $formElement = array();
        $json = array();

        $this->templateFormNFormElement($form, $formElement);

        $build = new BuildFormPlain($form, array(), [$formElement], $this->dbArray);
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALL;
        $formElement[FE_DECIMAL_FORMAT] = '';

        $label['123-l'][API_ELEMENT_CONTENT] = '<label for="name:1" class="control-label" >Name</label>';
        $label['123'][API_ELEMENT_ATTRIBUTE] = ['value' => '', 'required' => false, 'hidden' => false];
        $label['123-r'][API_ELEMENT_ATTRIBUTE] = ['class' => ''];

        // Defaults data-error: ALNUMX
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX;
        $formElement[F_FE_DATA_ERROR] = 'custom data text';
        $formElement[F_FE_DATA_PATTERN_ERROR] = 'custom pattern text';
        $result = $build->buildInput($formElement, 'name:1', '', $json);
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="' . PATTERN_ALNUMX .
            '" data-pattern-error="' . $formElement[F_FE_DATA_PATTERN_ERROR] .
            '" data-error="' . $formElement[F_FE_DATA_ERROR] . '" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);

        // Defaults data-error: ALNUMX
        $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_PATTERN;
        $formElement[FE_CHECK_PATTERN] = '[0-4]';
        $formElement[F_FE_DATA_ERROR] = 'custom data text';
        $formElement[F_FE_DATA_PATTERN_ERROR] = 'custom pattern text';
        $result = $build->buildInput($formElement, 'name:1', '', $json);
        $this->assertEquals('<input id="123" name="name:1" class="form-control" maxlength="255" type="input" value="" pattern="[0-4]' .
            '" data-pattern-error="' . $formElement[F_FE_DATA_PATTERN_ERROR] .
            '" data-error="' . $formElement[F_FE_DATA_ERROR] . '" data-hidden="no" data-required="no" ><div class="help-block with-errors hidden"></div>', $result);
391
392
    }

393
    /**
Carsten  Rose's avatar
Carsten Rose committed
394
395
396
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
397
     */
398
399
400
401
    public function testGetKeyValueListFromSqlEnumSpec() {
        $form = array();
        $formElement = array();

402
        $this->templateFormNFormElement($form, $formElement);
403
404
        $formElement['name'] = 'deleted';

Carsten  Rose's avatar
Carsten Rose committed
405
        $build = new BuildFormPlain($form, array(), [$formElement], $this->dbArray);
406
407
408
409
410
411
412
413
414
415
416
417

        $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'];
418
        $formElement[FE_EMPTY_ITEM_AT_START] = '';
419
420
421
422
423
424
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // Spec Enum + emptyItemAtEnd
        $expect = ['', 'yes', 'no', ''];
425
        $formElement[FE_EMPTY_ITEM_AT_END] = '';
426
427
428
429
430
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // clean
431
432
        unset($formElement[FE_EMPTY_ITEM_AT_START]);
        unset($formElement[FE_EMPTY_ITEM_AT_END]);
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457

        // 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']);

458
        // SQL: any content is fine, but should always be the same to do checks
459
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT name FROM Form AS f ORDER BY f.id LIMIT 3');
Carsten  Rose's avatar
Carsten Rose committed
460
//        $expect = ['form', 'formElement', 'phpunit_person'];
461
        $expect = ['form', 'formElement', 'copyForm'];
462
463
464
465
466
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);

        // SQL (one column, no keyword) + emptyItemAtStart
467
        $formElement[FE_EMPTY_ITEM_AT_START] = '';
468
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT name FROM Form AS f ORDER BY f.id LIMIT 3');
Carsten  Rose's avatar
Carsten Rose committed
469
//        $expect = ['', 'form', 'formElement', 'phpunit_person'];
470
        $expect = ['', 'form', 'formElement', 'copyForm'];
471
472
473
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expect, $keys);
        $this->assertEquals($expect, $values);
Carsten  Rose's avatar
Carsten Rose committed
474
        unset($formElement[FE_EMPTY_ITEM_AT_START]);
475
476

        // SQL (4 columns, none 'id' nor 'label') - Take the first two columns
477
478
        $expectKeys = ['100', '200', '300'];
        $expectValues = ['basic', 'formelement', 'layout'];
479
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT ord, name, created, modified  FROM FormElement AS fe ORDER BY fe.id LIMIT 3');
480
481
482
483
484
        $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
485
        $expectKeys = ['100', '200', '300'];
486
        $expectValues = ['basic', 'formelement', 'layout'];
487
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT ord, created, modified, name AS label FROM FormElement AS fe ORDER BY fe.id LIMIT 3');
488
489
490
491
492
493
        $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'];
494
        $expectValues = ['basic', 'formelement', 'layout'];
495
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT ord, created, modified, name AS label, id FROM FormElement AS fe ORDER BY fe.id LIMIT 3');
496
497
498
499
500
501
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
        $this->assertEquals($expectKeys, $keys);
        $this->assertEquals($expectValues, $values);
    }

    /**
Carsten  Rose's avatar
Carsten Rose committed
502
     * @expectedException \qfq\UserFormException
503
     *
Carsten  Rose's avatar
Carsten Rose committed
504
505
506
     * @throws CodeException
     * @throws UserFormException
     * @throws UserReportException
507
508
509
510
511
     */
    public function testGetKeyValueListFromSqlEnumSpecException() {
        $form = array();
        $formElement = array();

512
        $this->templateFormNFormElement($form, $formElement);
513

Carsten  Rose's avatar
Carsten Rose committed
514
        $build = new BuildFormPlain($form, array(), [$formElement], $this->dbArray);
515
516

        $formElement['name'] = 'noteInternal';
517
518
        $keys = array();
        $values = array();
519
520
521
        $build->getKeyValueListFromSqlEnumSpec($formElement, $keys, $values);
    }

522
523

    /**
Carsten  Rose's avatar
Carsten Rose committed
524
525
526
527
     * @throws CodeException
     * @throws DbException
     * @throws UserFormException
     * @throws UserReportException
528
529
530
531
532
533
534
     */
    public function testBuildSubrecord() {
        $form = array();
        $formElement = array();
        $json = array();

        $this->templateFormNFormElement($form, $formElement);
Carsten  Rose's avatar
Carsten Rose committed
535
        $formElement = Support::setFeDefaults($formElement);
Carsten  Rose's avatar
Carsten Rose committed
536

537
        // CheckType
Carsten  Rose's avatar
Carsten Rose committed
538
        $build = new BuildFormPlain($form, array(), [$formElement], $this->dbArray);
539
540

        // id: 1, firstName: John, name: Doe
541
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id, name, firstName FROM Person ORDER BY id LIMIT 2');
Carsten  Rose's avatar
Carsten Rose committed
542
        $formElement[SUBRECORD_PARAMETER_FORM] = 'Person';
Carsten  Rose's avatar
Carsten Rose committed
543
        $formElement[FE_SUBRECORD_OPTION] = '';
Carsten  Rose's avatar
Carsten Rose committed
544

545
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
546
        $this->assertEquals('<table class="table table-hover qfq-subrecord-table" ><thead><tr><th>id</th><th>name</th><th>firstName</th></tr></thead><tbody ><tr class="record" ><td><span class="text-muted">1</span></td><td>Doe</td><td>John</td></tr><tr class="record" ><td><span class="text-muted">2</span></td><td>Smith</td><td>Jane</td></tr></tbody></table>', $result);
547
//        $this->assertEquals('Please save this record first.', $result);
548
549

        $this->store->setStore(['id' => 1], STORE_RECORD, true);
550
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
551
        $this->assertEquals('<table class="table table-hover qfq-subrecord-table" ><thead><tr><th>id</th><th>name</th><th>firstName</th></tr></thead><tbody ><tr class="record" ><td><span class="text-muted">1</span></td><td>Doe</td><td>John</td></tr><tr class="record" ><td><span class="text-muted">2</span></td><td>Smith</td><td>Jane</td></tr></tbody></table>', $result);
552
553

        // _id: 1, name: Doe,
554
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name FROM Person ORDER BY id LIMIT 2');
555
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
556
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>name</th></tr></thead><tbody ><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></tbody></table>', $result);
557

558
        // _id: 1, name: Doe,title=''
559
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name AS "title=" FROM Person ORDER BY id LIMIT 2');
560
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
561
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th></th></tr></thead><tbody ><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></tbody></table>', $result);
562
563

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

568
        // _id: 1, name: Doe, title: PERSON
569
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name AS "PERSON" FROM Person ORDER BY id LIMIT 2');
570
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
571
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>PERSON</th></tr></thead><tbody ><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></tbody></table>', $result);
572
573

        // _id: 1, "This is a much longer text than necessary": Default max:20
574
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", "This is a much longer text than necessary" FROM Person ORDER BY id LIMIT 1');
575
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
576
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>This is a much longe</th></tr></thead><tbody ><tr class="record" ><td>This is a much longe</td></tr></tbody></table>', $result);
577
578

        // _id: 1, name: Jo (width:2)
579
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name AS "2" FROM Person ORDER BY id LIMIT 2');
580
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
581
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th></th></tr></thead><tbody ><tr class="record" ><td>Do</td></tr><tr class="record" ><td>Sm</td></tr></tbody></table>', $result);
582
583

        // _id: 1, name: Jo (width:2)
584
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name AS "2|PERSON" FROM Person ORDER BY id LIMIT 2');
585
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
586
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>PE</th></tr></thead><tbody ><tr class="record" ><td>Do</td></tr><tr class="record" ><td>Sm</td></tr></tbody></table>', $result);
587
588

        // _id: 1, name: Doe ('width':3)
589
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name AS "Name|width=3" FROM Person ORDER BY id LIMIT 2');
590
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
591
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>Nam</th></tr></thead><tbody ><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smi</td></tr></tbody></table>', $result);
592
593

        // _id: 1, name: Doe (width:3, title:PERSON)
594
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name AS "3|title=PERSON" FROM Person ORDER BY id LIMIT 2');
595
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
596
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>PER</th></tr></thead><tbody ><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smi</td></tr></tbody></table>', $result);
597
598

        // _id: 1, name: <b>Doe</b>
599
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", CONCAT("<b>", name, "</b>") AS "Name" FROM Person ORDER BY id LIMIT 2');
600
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
601
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>Name</th></tr></thead><tbody ><tr class="record" ><td>Doe</td></tr><tr class="record" ><td>Smith</td></tr></tbody></table>', $result);
602

603
        // _id: 1, name: <b>Doe</b>, width=2
604
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", CONCAT("<b>", name, "</b>") AS "Name|2" FROM Person ORDER BY id LIMIT 2');
605
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
606
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>Na</th></tr></thead><tbody ><tr class="record" ><td>Do</td></tr><tr class="record" ><td>Sm</td></tr></tbody></table>', $result);
607

608
        // _id: 1, name: <b>Doe</b> , nostrip
609
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", CONCAT("<b>", name, "</b>") AS "Name|nostrip" FROM Person ORDER BY id LIMIT 2');
610
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
611
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>Name</th></tr></thead><tbody ><tr class="record" ><td><b>Doe</b></td></tr><tr class="record" ><td><b>Smith</b></td></tr></tbody></table>', $result);
612
613

        // _id: 1, icon: bullet-green.gif
614
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", "bullet-green.gif" AS "Status|icon" FROM Person ORDER BY id LIMIT 2');
615
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
616
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>Status</th></tr></thead><tbody ><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></tbody></table>', $result);
617
618

        // _id: 1, mailto: john@doe.com
619
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", "john@doe.com" AS "EMail|mailto" FROM Person ORDER BY id LIMIT 2');
620
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
621
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>EMail</th></tr></thead><tbody ><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></tbody></table>', $result);
622
623

        // _id: 1, url: www.uzh.ch
624
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", "www.uzh.ch" AS "URL|url" FROM Person ORDER BY id LIMIT 2');
625
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
626
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>URL</th></tr></thead><tbody ><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></tbody></table>', $result);
627
628

        // _id: 1, name: Doe, _rowclass (text)
629
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name, IF(id=1,"text-warning", "text-danger") AS _rowClass FROM Person ORDER BY id LIMIT 2');
630
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
631
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>name</th></tr></thead><tbody ><tr class="record text-warning" ><td>Doe</td></tr><tr class="record text-danger" ><td>Smith</td></tr></tbody></table>', $result);
632
633

        // _id: 1, name: Doe, _rowClass (text & background)
634
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name, IF(id=1,"text-warning active", "text-danger success") AS _rowClass FROM Person ORDER BY id LIMIT 2');
635
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
636
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>name</th></tr></thead><tbody ><tr class="record text-warning active" ><td>Doe</td></tr><tr class="record text-danger success" ><td>Smith</td></tr></tbody></table>', $result);
637
638

        // _id: 1, name: Doe, _rowTitle
639
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", name, firstName AS _rowTitle FROM Person ORDER BY id LIMIT 2');
640
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
641
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>name</th></tr></thead><tbody ><tr class="record" title="John" ><td>Doe</td></tr><tr class="record" title="Jane" ><td>Smith</td></tr></tbody></table>', $result);
642
643

        // _id: 1, name: Doe, title, width, nostrip
644
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->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');
645
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
646
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>name</th><th>Important</th></tr></thead><tbody ><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></tbody></table>', $result);
647
648

        // _id: 1, name: Doe, link
649
        $formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->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');
650
        $result = $build->buildSubrecord($formElement, 'name:1', '', $json);
Carsten  Rose's avatar
Carsten Rose committed
651
        $this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" ><thead><tr><th>name</th><th></th></tr></thead><tbody ><tr class="record" ><td>Doe</td><td><a href="index.php?id=form&s=badcaffee1234" >Doe</a></td></tr><tr class="record" ><td>Smith</td><td><a href="index.php?id=form&s=badcaffee1234" >Smith</a></td></tr></tbody></table>', $result);
652
653
    }

654
    /**
655
656
     * @param array $form
     * @param array $formElement
657
658
659
     */
    private function templateFormNFormElement(array &$form, array &$formElement) {
        $form = [
Carsten  Rose's avatar
Carsten Rose committed
660
661
662
663
664
665
666
            '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',
667
            'permitUrlParameter' => '',
Carsten  Rose's avatar
Carsten Rose committed
668
669
670
            'render' => 'bootstrap',
            'multiMode' => 'none',
            'multiSql' => '',
671
672
            'multiDetailForm' => '',
            'multiDetailFormParameter' => '',
Carsten  Rose's avatar
Carsten Rose committed
673
674
675
676
677
678
679
            F_FORWARD_MODE => 'auto',
            F_FORWARD_PAGE => '',
            'bsLabelColumns' => '',
            'bsInputColumns' => '',
            'bsNoteColumns' => '',
            'parameter' => 'maxVisiblePill=>3',
            'deleted' => 'no',
Carsten  Rose's avatar
Carsten Rose committed
680
            F_DB_INDEX => DB_INDEX_DEFAULT,
681
682
683
        ];

        $formElement = [
Carsten  Rose's avatar
Carsten Rose committed
684
            'id' => 123,
Carsten  Rose's avatar
Carsten Rose committed
685
            FE_FORM_ID => 1,
686
687
            FE_ID_CONTAINER => 0,
            FE_DYNAMIC_UPDATE => 'no',
Carsten  Rose's avatar
Carsten Rose committed
688
689
690
691
            'enabled' => 'yes',
            FE_NAME => 'name',
            FE_LABEL => 'Name',
            FE_MODE => 'show',
Carsten  Rose's avatar
Carsten Rose committed
692
            FE_MODE_SQL => '',
Carsten  Rose's avatar
Carsten Rose committed
693
694
695
696
697
698
699
700
701
702
703
704
            'class' => 'native',
            FE_TYPE => 'input',
            'value' => '',
            'sql1' => '',
            'parameter' => '',
            'debug' => 'no',
            'deleted' => 'no',
            'size' => '',
            'maxLength' => '255',
            'tooltip' => '',
            'placeholder' => '',
            FE_CHECK_TYPE => '',
705
            FE_CHECK_PATTERN => '',
Carsten  Rose's avatar
Carsten Rose committed
706
707
            FE_HTML_ID => '123',
            FE_HIDE_ZERO => '0',
Carsten  Rose's avatar
Carsten Rose committed
708
            FE_DATA_REFERENCE => '',
709

710
711
            F_FE_DATA_ERROR => F_FE_DATA_ERROR_DEFAULT,
            F_FE_DATA_PATTERN_ERROR => F_FE_DATA_PATTERN_ERROR_DEFAULT,
712
            F_FE_DATA_PATTERN_ERROR_SYSTEM => F_FE_DATA_PATTERN_ERROR_DEFAULT,
713

Carsten  Rose's avatar
Carsten Rose committed
714
            'tabindex' => 0,
715
716
717
718
719
720
721
722
723
724
725
726
727
        ];

    }

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

728
729
730
731
732
    /**
     */
    protected function setUp() {
        $_GET['form'] = 'phpunit_person';

733
734
        try {
            parent::setUp();
735

736
737
738
739
            // Use always the latest (production) FormEditor: played during QuickFormQuery()
            $this->dbArray[DB_INDEX_DEFAULT]->sql("DROP TABLE IF EXISTS `Form`");
            $this->dbArray[DB_INDEX_DEFAULT]->sql("DROP TABLE IF EXISTS `FormElement`");
            $this->executeSQLFile(__DIR__ . '/../../../Source/sql/formEditor.sql', true);
740

741
742
743
            $this->store->unsetStore(STORE_ADDITIONAL_FORM_ELEMENTS);
            $this->executeSQLFile(__DIR__ . '/database/fixtures/Generic.sql', true);
            $this->executeSQLFile(__DIR__ . '/database/fixtures/TestForm.sql', true);
744

745
746
747
            // Defaults
            $this->store->setVar('name', 'varchar(255)', STORE_TABLE_COLUMN_TYPES, true);
            $this->store->setVar('deleted', "enum('yes','no')", STORE_TABLE_COLUMN_TYPES, true);
748
749
750
//        $this->store->setVar(SYSTEM_DB_INDEX_DATA, DB_INDEX_DEFAULT, true);
//        $this->store->setVar(SYSTEM_DB_INDEX_QFQ, DB_INDEX_DEFAULT, true);

751

752
            $GLOBALS["TSFE"] = new FakeTSFEBuildPlain();
753

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

756
757
758
759
760
761
            // After instantiating QuickFormQuery, the latest updates will be played. The SIP is by default activated which breaks current tests.
            $this->dbArray[DB_INDEX_DEFAULT]->sql("UPDATE Form SET permitNew='always', permitEdit='always' WHERE name='form' ");
            $form->process();
        } catch (\Exception $e) {
            echo 'unhandled exception';
        }
762
763
    }
}
764

765
766
767
/**
 * Class FakeTSFEBuildPlain
 */
768
class FakeTSFEBuildPlain {
769
    public $id = 1;
770
771
    public $type = 1;
    public $sys_language_uid = 1;
772
773
}

774

775