Merge pull request #9745 from jmcclelland/CRM-19937
[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('table.civicrm_column_name desc,other_column, another_column desc', 'MysqlOrderBy', 'table.civicrm_column_name desc,other_column, another_column desc'),
73 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'),
74 array('a string', 'String', 'a string'),
75 );
76 }
77
78 /**
79 * @dataProvider escapeDataProvider
80 * @param $inputData
81 * @param $inputType
82 * @param $expectedResult
83 */
84 public function testEscape($inputData, $inputType, $expectedResult) {
85 $this->assertTrue($expectedResult === CRM_Utils_Type::escape($inputData, $inputType, FALSE));
86 }
87
88 /**
89 * @return array
90 */
91 public function escapeDataProvider() {
92 return array(
93 array(10, 'Int', 10),
94 array('145E+3', 'Int', NULL),
95 array('10', 'Integer', 10),
96 array(-10, 'Int', -10),
97 array(array(), 'Integer', NULL),
98 array('-10foo', 'Int', NULL),
99 array(10, 'Positive', 10),
100 array('145.0E+3', 'Positive', NULL),
101 array('10', 'Positive', 10),
102 array(-10, 'Positive', NULL),
103 array('-10', 'Positive', NULL),
104 array('-10foo', 'Positive', NULL),
105 array(array('10', 20), 'Country', array('10', 20)),
106 array(array('10', '-10foo'), 'Country', NULL),
107 array('', 'Timestamp', ''),
108 array('', 'ContactReference', ''),
109 array('3', 'ContactReference', 3),
110 array('-3', 'ContactReference', NULL),
111 // Escape function is meant for sql, not xss
112 array('<p onclick="alert(\'xss\');">Hello</p>', 'Memo', '<p onclick=\\"alert(\\\'xss\\\');\\">Hello</p>'),
113 array('civicrm_column_name', 'MysqlColumnNameOrAlias', '`civicrm_column_name`'),
114 array('table.civicrm_column_name', 'MysqlColumnNameOrAlias', '`table`.`civicrm_column_name`'),
115 array('table.civicrm_column_name.toomanydots', 'MysqlColumnNameOrAlias', NULL),
116 array('Home-street_address', 'MysqlColumnNameOrAlias', '`Home-street_address`'),
117 array('`Home-street_address`', 'MysqlColumnNameOrAlias', '`Home-street_address`'),
118 array('`Home-street_address', 'MysqlColumnNameOrAlias', NULL),
119 array('column_name, sleep(5)', 'MysqlColumnNameOrAlias', NULL),
120 array('asc', 'MysqlOrderByDirection', 'asc'),
121 array('DESC', 'MysqlOrderByDirection', 'desc'),
122 array('DESCc', 'MysqlOrderByDirection', NULL),
123 array('table.civicrm_column_name desc', 'MysqlOrderBy', '`table`.`civicrm_column_name` desc'),
124 array('table.civicrm_column_name desc,other_column,another_column desc', 'MysqlOrderBy', '`table`.`civicrm_column_name` desc, `other_column`, `another_column` desc'),
125 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`'),
126 );
127 }
128
129 }