'',
NULL => NULL,
'civicrm' => 'civicrm',
'civicrm/dashboard' => 'civicrm/dashboard',
'civicrm/contribute/transact' => 'civicrm/contribute/transact',
'civicrm/attempt' => 'civicrm/_hack_attempt_/hack_',
'civicrm dashboard & force = 1,;' => 'civicrm_dashboard___force___1__',
];
foreach ($testSet as $in => $expected) {
$out = CRM_Utils_String::stripPathChars($in);
$this->assertEquals($out, $expected, "Output does not match");
}
}
public function testExtractName() {
$cases = [
[
'full_name' => 'Alan',
'first_name' => 'Alan',
],
[
'full_name' => 'Alan Arkin',
'first_name' => 'Alan',
'last_name' => 'Arkin',
],
[
'full_name' => '"Alan Arkin"',
'first_name' => 'Alan',
'last_name' => 'Arkin',
],
[
'full_name' => 'Alan A Arkin',
'first_name' => 'Alan',
'middle_name' => 'A',
'last_name' => 'Arkin',
],
[
'full_name' => 'Adams, Amy',
'first_name' => 'Amy',
'last_name' => 'Adams',
],
[
'full_name' => 'Adams, Amy A',
'first_name' => 'Amy',
'middle_name' => 'A',
'last_name' => 'Adams',
],
[
'full_name' => '"Adams, Amy A"',
'first_name' => 'Amy',
'middle_name' => 'A',
'last_name' => 'Adams',
],
];
foreach ($cases as $case) {
$actual = [];
CRM_Utils_String::extractName($case['full_name'], $actual);
$this->assertEquals($actual['first_name'], $case['first_name']);
$this->assertEquals(CRM_Utils_Array::value('last_name', $actual), CRM_Utils_Array::value('last_name', $case));
$this->assertEquals(CRM_Utils_Array::value('middle_name', $actual), CRM_Utils_Array::value('middle_name', $case));
}
}
public function testEllipsify() {
$maxLen = 5;
$cases = [
'1' => '1',
'12345' => '12345',
'123456' => '12...',
];
foreach ($cases as $input => $expected) {
$this->assertEquals($expected, CRM_Utils_String::ellipsify($input, $maxLen));
}
// test utf-8 string, CRM-18997
$input = 'Registro de eventos on-line: Taller: "Onboarding - Cómo integrar exitosamente a los nuevos talentos dentro de su organización - Formación práctica."';
$maxLen = 128;
$this->assertEquals(TRUE, mb_check_encoding(CRM_Utils_String::ellipsify($input, $maxLen), 'UTF-8'));
}
public function testRandom() {
for ($i = 0; $i < 4; $i++) {
$actual = CRM_Utils_String::createRandom(4, 'abc');
$this->assertEquals(4, strlen($actual));
$this->assertRegExp('/^[abc]+$/', $actual);
$actual = CRM_Utils_String::createRandom(6, '12345678');
$this->assertEquals(6, strlen($actual));
$this->assertRegExp('/^[12345678]+$/', $actual);
}
}
/**
* @return array
*/
public function parsePrefixData() {
$cases = [];
$cases[] = ['administer CiviCRM', NULL, [NULL, 'administer CiviCRM']];
$cases[] = ['administer CiviCRM', 'com_civicrm', ['com_civicrm', 'administer CiviCRM']];
$cases[] = ['Drupal:access user profiles', NULL, ['Drupal', 'access user profiles']];
$cases[] = ['Joomla:component:perm', NULL, ['Joomla', 'component:perm']];
return $cases;
}
/**
* @dataProvider parsePrefixData
* @param $input
* @param $defaultPrefix
* @param $expected
*/
public function testParsePrefix($input, $defaultPrefix, $expected) {
$actual = CRM_Utils_String::parsePrefix(':', $input, $defaultPrefix);
$this->assertEquals($expected, $actual);
}
/**
* @return array
*/
public function booleanDataProvider() {
// array(0 => $input, 1 => $expectedOutput)
$cases = [];
$cases[] = [TRUE, TRUE];
$cases[] = [FALSE, FALSE];
$cases[] = [1, TRUE];
$cases[] = [0, FALSE];
$cases[] = ['1', TRUE];
$cases[] = ['0', FALSE];
$cases[] = [TRUE, TRUE];
$cases[] = [FALSE, FALSE];
$cases[] = ['Y', TRUE];
$cases[] = ['N', FALSE];
$cases[] = ['y', TRUE];
$cases[] = ['n', FALSE];
$cases[] = ['Yes', TRUE];
$cases[] = ['No', FALSE];
$cases[] = ['True', TRUE];
$cases[] = ['False', FALSE];
$cases[] = ['yEs', TRUE];
$cases[] = ['nO', FALSE];
$cases[] = ['tRuE', TRUE];
$cases[] = ['FaLsE', FALSE];
return $cases;
}
/**
* @param $input
* @param bool $expected
* * @dataProvider booleanDataProvider
*/
public function testStrToBool($input, $expected) {
$actual = CRM_Utils_String::strtobool($input);
$this->assertTrue($expected === $actual);
}
public function startEndCases() {
$cases = [];
$cases[] = ['startsWith', 'foo', '', TRUE];
$cases[] = ['startsWith', 'foo', 'f', TRUE];
$cases[] = ['startsWith', 'foo', 'fo', TRUE];
$cases[] = ['startsWith', 'foo', 'foo', TRUE];
$cases[] = ['startsWith', 'foo', 'fooo', FALSE];
$cases[] = ['startsWith', 'foo', 'o', FALSE];
$cases[] = ['endsWith', 'foo', 'f', FALSE];
$cases[] = ['endsWith', 'foo', '', TRUE];
$cases[] = ['endsWith', 'foo', 'o', TRUE];
$cases[] = ['endsWith', 'foo', 'oo', TRUE];
$cases[] = ['endsWith', 'foo', 'foo', TRUE];
$cases[] = ['endsWith', 'foo', 'fooo', FALSE];
$cases[] = ['endsWith', 'foo*', '*', TRUE];
return $cases;
}
/**
* @param string $func
* One of: 'startsWith' or 'endsWith'.
* @param $string
* @param $fragment
* @param $expectedResult
* @dataProvider startEndCases
*/
public function testStartEndWith($func, $string, $fragment, $expectedResult) {
$actualResult = \CRM_Utils_String::$func($string, $fragment);
$this->assertEquals($expectedResult, $actualResult, "Checking $func($string,$fragment)");
}
public function wildcardCases() {
$cases = [];
$cases[] = ['*', ['foo.bar.1', 'foo.bar.2', 'foo.whiz', 'bang.bang']];
$cases[] = ['foo.*', ['foo.bar.1', 'foo.bar.2', 'foo.whiz']];
$cases[] = ['foo.bar.*', ['foo.bar.1', 'foo.bar.2']];
$cases[] = [['foo.bar.*', 'foo.bar.2'], ['foo.bar.1', 'foo.bar.2']];
$cases[] = [['foo.bar.2', 'foo.w*'], ['foo.bar.2', 'foo.whiz']];
return $cases;
}
/**
* @param $patterns
* @param $expectedResults
* @dataProvider wildcardCases
*/
public function testFilterByWildCards($patterns, $expectedResults) {
$data = ['foo.bar.1', 'foo.bar.2', 'foo.whiz', 'bang.bang'];
$actualResults = CRM_Utils_String::filterByWildcards($patterns, $data);
$this->assertEquals($expectedResults, $actualResults);
$patterns = (array) $patterns;
$patterns[] = 'noise';
$actualResults = CRM_Utils_String::filterByWildcards($patterns, $data, FALSE);
$this->assertEquals($expectedResults, $actualResults);
$actualResults = CRM_Utils_String::filterByWildcards($patterns, $data, TRUE);
$this->assertEquals(array_merge($expectedResults, ['noise']), $actualResults);
}
/**
* CRM-20821
* CRM-14283
*
* @param string $imageURL
* @param book $forceHttps
* @param string $expected
*
* @dataProvider simplifyURLProvider
*/
public function testSimplifyURL($imageURL, $forceHttps, $expected) {
$this->assertEquals(
$expected,
CRM_Utils_String::simplifyURL($imageURL, $forceHttps)
);
}
/**
* Used for testNormalizeImageURL above
*
* @return array
*/
public function simplifyURLProvider() {
$config = CRM_Core_Config::singleton();
$urlParts = CRM_Utils_String::simpleParseUrl($config->userFrameworkBaseURL);
$localDomain = $urlParts['host+port'];
if (empty($localDomain)) {
throw new \Exception("Failed to determine local base URL");
}
$externalDomain = 'example.org';
// Ensure that $externalDomain really is different from $localDomain
if ($externalDomain == $localDomain) {
$externalDomain = 'example.net';
}
return [
'prototypical example' => [
"https://$localDomain/sites/default/files/coffee-mug.jpg",
FALSE,
'/sites/default/files/coffee-mug.jpg',
],
'external domain with https' => [
"https://$externalDomain/sites/default/files/coffee-mug.jpg",
FALSE,
"https://$externalDomain/sites/default/files/coffee-mug.jpg",
],
'external domain with http forced to https' => [
"http://$externalDomain/sites/default/files/coffee-mug.jpg",
TRUE,
"https://$externalDomain/sites/default/files/coffee-mug.jpg",
],
'external domain with http not forced' => [
"http://$externalDomain/sites/default/files/coffee-mug.jpg",
FALSE,
"http://$externalDomain/sites/default/files/coffee-mug.jpg",
],
'local URL' => [
"/sites/default/files/coffee-mug.jpg",
FALSE,
"/sites/default/files/coffee-mug.jpg",
],
'local URL without a forward slash' => [
"sites/default/files/coffee-mug.jpg",
FALSE,
"/sites/default/files/coffee-mug.jpg",
],
'empty input' => [
'',
FALSE,
'',
],
];
}
/**
* @param string $url
* @param array $expected
*
* @dataProvider parseURLProvider
*/
public function testSimpleParseUrl($url, $expected) {
$this->assertEquals(
$expected,
CRM_Utils_String::simpleParseUrl($url)
);
}
/**
* Used for testSimpleParseUrl above
*
* @return array
*/
public function parseURLProvider() {
return [
"prototypical example" => [
"https://example.com:8000/foo/bar/?id=1#fragment",
[
'host+port' => "example.com:8000",
'path+query' => "/foo/bar/?id=1",
],
],
"default port example" => [
"https://example.com/foo/bar/?id=1#fragment",
[
'host+port' => "example.com",
'path+query' => "/foo/bar/?id=1",
],
],
"empty" => [
"",
[
'host+port' => "",
'path+query' => "",
],
],
"path only" => [
"/foo/bar/image.png",
[
'host+port' => "",
'path+query' => "/foo/bar/image.png",
],
],
];
}
public function purifyHTMLProvider() {
$tests = [];
$tests[] = ['HOVER', 'HOVER'];
$tests[] = ['hello', 'hello'];
return $tests;
}
/**
* Test ouput of purifyHTML
* @param string $testString
* @param string $expectedString
* @dataProvider purifyHTMLProvider
*/
public function testPurifyHTML($testString, $expectedString) {
$this->assertEquals($expectedString, CRM_Utils_String::purifyHTML($testString));
}
public function getGoodSerializeExamples() {
$strs = [];
$strs[] = ['a:1:{s:1:"a";s:1:"b";}'];
$strs[] = ['d:1.2;'];
$strs[] = ['s:3:"abc";'];
$strs[] = ['N;'];
$strs[] = ['a:7:{i:0;N;i:1;s:3:"abc";i:2;i:1;i:3;d:2.3;i:4;b:1;i:5;b:0;i:6;i:0;}'];
return $strs;
}
/**
* @param string $str
* A safe serialized value.
* @dataProvider getGoodSerializeExamples
*/
public function testGoodSerialize($str) {
$this->assertEquals(unserialize($str), CRM_Utils_String::unserialize($str));
}
public function getBadSerializeExamples() {
$strs = [];
$strs[] = ['O:8:"stdClass":0:{}'];
$strs[] = ['O:9:"Exception":7:{s:10:"*message";s:3:"abc";s:17:"Exceptionstring";s:0:"";s:7:"*code";i:0;s:7:"*file";s:17:"Command line code";s:7:"*line";i:1;s:16:"Exceptiontrace";a:0:{}s:19:"Exceptionprevious";N;}'];
return $strs;
}
/**
* @param string $str
* An unsafe serialized value.
* @dataProvider getBadSerializeExamples
*/
public function testBadSerializeExamples($str) {
$this->assertFalse(CRM_Utils_String::unserialize($str));
}
}