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