Merge pull request #13324 from agileware/CIVICRM-947
[civicrm-core.git] / tests / phpunit / CRM / Utils / TypeTest.php
1 <?php
2
3 /**
4 * Class CRM_Utils_TypeTest
5 * @package CiviCRM
6 * @subpackage CRM_Utils_Type
7 * @group headless
8 */
9 class CRM_Utils_TypeTest extends CiviUnitTestCase {
10
11 public function setUp() {
12 parent::setUp();
13 }
14
15 /**
16 * @dataProvider validateDataProvider
17 * @param $inputData
18 * @param $inputType
19 * @param $expectedResult
20 */
21 public function testValidate($inputData, $inputType, $expectedResult) {
22 $this->assertTrue($expectedResult === CRM_Utils_Type::validate($inputData, $inputType, FALSE));
23 }
24
25 /**
26 * @return array
27 */
28 public function validateDataProvider() {
29 return array(
30 array(10, 'Int', 10),
31 array('145E+3', 'Int', NULL),
32 array('10', 'Integer', 10),
33 array(-10, 'Int', -10),
34 array('-10', 'Integer', -10),
35 array('-10foo', 'Int', NULL),
36 array(10, 'Positive', 10),
37 array('145.0E+3', 'Positive', NULL),
38 array('10', 'Positive', 10),
39 array(-10, 'Positive', NULL),
40 array('-10', 'Positive', NULL),
41 array('-10foo', 'Positive', NULL),
42 array('civicrm_column_name', 'MysqlColumnNameOrAlias', 'civicrm_column_name'),
43 array('table.civicrm_column_name', 'MysqlColumnNameOrAlias', 'table.civicrm_column_name'),
44 array('table.civicrm_column_name.toomanydots', 'MysqlColumnNameOrAlias', NULL),
45 array('Home-street_address', 'MysqlColumnNameOrAlias', 'Home-street_address'),
46 array('`Home-street_address`', 'MysqlColumnNameOrAlias', '`Home-street_address`'),
47 array('`Home-street_address', 'MysqlColumnNameOrAlias', NULL),
48 array('table.`Home-street_address`', 'MysqlColumnNameOrAlias', 'table.`Home-street_address`'),
49 array('`table-alias`.`Home-street_address`', 'MysqlColumnNameOrAlias', '`table-alias`.`Home-street_address`'),
50 array('`table-alias`.column', 'MysqlColumnNameOrAlias', '`table-alias`.column'),
51 // Spaces also permitted, only when enclosed in backticks.
52 array('`column alias`', 'MysqlColumnNameOrAlias', '`column alias`'),
53 array('`table alias`.column', 'MysqlColumnNameOrAlias', '`table alias`.column'),
54 array('`table alias`.`column alias`', 'MysqlColumnNameOrAlias', '`table alias`.`column alias`'),
55 array('table alias.column alias', 'MysqlColumnNameOrAlias', NULL),
56 array('table alias.column_alias', 'MysqlColumnNameOrAlias', NULL),
57 array('table_alias.column alias', 'MysqlColumnNameOrAlias', NULL),
58 // Functions are not permitted.
59 array('column_name, sleep(5)', 'MysqlColumnNameOrAlias', NULL),
60 // Length checking permits only 64 chars.
61 array(str_repeat('a', 64), 'MysqlColumnNameOrAlias', str_repeat('a', 64)),
62 array(str_repeat('a', 65), 'MysqlColumnNameOrAlias', NULL),
63 array(str_repeat('a', 64) . '.' . str_repeat('a', 64), 'MysqlColumnNameOrAlias', str_repeat('a', 64) . '.' . str_repeat('a', 64)),
64 array('`' . str_repeat('a', 64) . '`.`' . str_repeat('b', 64) . '`', 'MysqlColumnNameOrAlias', '`' . str_repeat('a', 64) . '`.`' . str_repeat('b', 64) . '`'),
65 array(str_repeat('a', 64) . '.' . str_repeat('a', 65), 'MysqlColumnNameOrAlias', NULL),
66 array(str_repeat('a', 65) . '.' . str_repeat('a', 64), 'MysqlColumnNameOrAlias', NULL),
67 // ORDER BY can be ASC or DESC, case not significant.
68 array('asc', 'MysqlOrderByDirection', 'asc'),
69 array('DESC', 'MysqlOrderByDirection', 'desc'),
70 array('DESCc', 'MysqlOrderByDirection', NULL),
71 array('table.civicrm_column_name desc', 'MysqlOrderBy', 'table.civicrm_column_name desc'),
72 array('field(civicrm_column_name,4,5,6)', 'MysqlOrderBy', 'field(civicrm_column_name,4,5,6)'),
73 array('field(table.civicrm_column_name,4,5,6)', 'MysqlOrderBy', 'field(table.civicrm_column_name,4,5,6)'),
74 array('table.civicrm_column_name desc,other_column, another_column desc', 'MysqlOrderBy', 'table.civicrm_column_name desc,other_column, another_column desc'),
75 array('table.`Home-street_address` asc, `table-alias`.`Home-street_address` desc,`table-alias`.column', 'MysqlOrderBy', 'table.`Home-street_address` asc, `table-alias`.`Home-street_address` desc,`table-alias`.column'),
76 // Lab issue dev/core#93 allow for 3 column orderby
77 array('contact_id.gender_id.label', 'MysqlOrderBy', 'contact_id.gender_id.label'),
78 array('a string', 'String', 'a string'),
79 array('{"contact":{"contact_id":205}}', 'Json', '{"contact":{"contact_id":205}}'),
80 array('{"contact":{"contact_id":!n†rude®}}', 'Json', NULL),
81 );
82 }
83
84 /**
85 * @dataProvider escapeDataProvider
86 * @param $inputData
87 * @param $inputType
88 * @param $expectedResult
89 */
90 public function testEscape($inputData, $inputType, $expectedResult) {
91 $this->assertTrue($expectedResult === CRM_Utils_Type::escape($inputData, $inputType, FALSE));
92 }
93
94 /**
95 * @return array
96 */
97 public function escapeDataProvider() {
98 return array(
99 array(10, 'Int', 10),
100 array('145E+3', 'Int', NULL),
101 array('10', 'Integer', 10),
102 array(-10, 'Int', -10),
103 array(array(), 'Integer', NULL),
104 array('-10foo', 'Int', NULL),
105 array(10, 'Positive', 10),
106 array('145.0E+3', 'Positive', NULL),
107 array('10', 'Positive', 10),
108 array(-10, 'Positive', NULL),
109 array('-10', 'Positive', NULL),
110 array('-10foo', 'Positive', NULL),
111 array(array('10', 20), 'Country', array('10', 20)),
112 array(array('10', '-10foo'), 'Country', NULL),
113 array('', 'Timestamp', ''),
114 array('', 'ContactReference', ''),
115 array('3', 'ContactReference', 3),
116 array('-3', 'ContactReference', NULL),
117 // Escape function is meant for sql, not xss
118 array('<p onclick="alert(\'xss\');">Hello</p>', 'Memo', '<p onclick=\\"alert(\\\'xss\\\');\\">Hello</p>'),
119 array('civicrm_column_name', 'MysqlColumnNameOrAlias', '`civicrm_column_name`'),
120 array('table.civicrm_column_name', 'MysqlColumnNameOrAlias', '`table`.`civicrm_column_name`'),
121 array('table.civicrm_column_name.toomanydots', 'MysqlColumnNameOrAlias', NULL),
122 array('Home-street_address', 'MysqlColumnNameOrAlias', '`Home-street_address`'),
123 array('`Home-street_address`', 'MysqlColumnNameOrAlias', '`Home-street_address`'),
124 array('`Home-street_address', 'MysqlColumnNameOrAlias', NULL),
125 array('column_name, sleep(5)', 'MysqlColumnNameOrAlias', NULL),
126 array('asc', 'MysqlOrderByDirection', 'asc'),
127 array('DESC', 'MysqlOrderByDirection', 'desc'),
128 array('DESCc', 'MysqlOrderByDirection', NULL),
129 array('table.civicrm_column_name desc', 'MysqlOrderBy', '`table`.`civicrm_column_name` desc'),
130 array('field(contribution_status_id,4,5,6) asc', 'MysqlOrderBy', 'field(`contribution_status_id`,4,5,6) asc'),
131 array('field(contribution_status_id,4,5,6) asc, contact_id asc', 'MysqlOrderBy', 'field(`contribution_status_id`,4,5,6) asc, `contact_id` asc'),
132 array('table.civicrm_column_name desc,other_column,another_column desc', 'MysqlOrderBy', '`table`.`civicrm_column_name` desc, `other_column`, `another_column` desc'),
133 array('table.`Home-street_address` asc, `table-alias`.`Home-street_address` desc,`table-alias`.column', 'MysqlOrderBy', '`table`.`Home-street_address` asc, `table-alias`.`Home-street_address` desc, `table-alias`.`column`'),
134 );
135 }
136
137 }