diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/NicknameTest.php | 111 | ||||
-rw-r--r-- | tests/oEmbedTest.php | 140 |
2 files changed, 251 insertions, 0 deletions
diff --git a/tests/NicknameTest.php b/tests/NicknameTest.php new file mode 100644 index 000000000..f49aeba60 --- /dev/null +++ b/tests/NicknameTest.php @@ -0,0 +1,111 @@ +<?php + +if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { + print "This script must be run from the command line\n"; + exit(); +} + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); +define('STATUSNET', true); +define('LACONICA', true); + +require_once INSTALLDIR . '/lib/common.php'; + +/** + * Test cases for nickname validity and normalization. + */ +class NicknameTest extends PHPUnit_Framework_TestCase +{ + /** + * Basic test using Nickname::normalize() + * + * @dataProvider provider + */ + public function testBasic($input, $expected, $expectedException=null) + { + $exception = null; + $normalized = false; + try { + $normalized = Nickname::normalize($input); + } catch (NicknameException $e) { + $exception = $e; + } + + if ($expected === false) { + if ($expectedException) { + $this->assertTrue($exception && $exception instanceof $expectedException, + "invalid input '$input' expected to fail with $expectedException, " . + "got " . get_class($exception) . ': ' . $exception->getMessage()); + } else { + $this->assertTrue($normalized == false, + "invalid input '$input' expected to fail"); + } + } else { + $msg = "normalized input nickname '$input' expected to normalize to '$expected', got "; + if ($exception) { + $msg .= get_class($exception) . ': ' . $exception->getMessage(); + } else { + $msg .= "'$normalized'"; + } + $this->assertEquals($expected, $normalized, $msg); + } + } + + /** + * Test on the regex matching used in common_find_mentions + * (testing on the full notice rendering is difficult as it needs + * to be able to pull from global state) + * + * @dataProvider provider + */ + public function testAtReply($input, $expected, $expectedException=null) + { + if ($expected == false) { + // nothing to do + } else { + $text = "@{$input} awesome! :)"; + $matches = common_find_mentions_raw($text); + $this->assertEquals(1, count($matches)); + $this->assertEquals($expected, Nickname::normalize($matches[0][0])); + } + } + + static public function provider() + { + return array( + array('evan', 'evan'), + + // Case and underscore variants + array('Evan', 'evan'), + array('EVAN', 'evan'), + array('ev_an', 'evan'), + array('E__V_an', 'evan'), + array('evan1', 'evan1'), + array('evan_1', 'evan1'), + array('0x20', '0x20'), + array('1234', '1234'), // should this be allowed though? :) + array('12__34', '1234'), + + // Some (currently) invalid chars... + array('^#@&^#@', false, 'NicknameInvalidException'), // all invalid :D + array('ev.an', false, 'NicknameInvalidException'), + array('ev/an', false, 'NicknameInvalidException'), + array('ev an', false, 'NicknameInvalidException'), + array('ev-an', false, 'NicknameInvalidException'), + + // Non-ASCII letters; currently not allowed, in future + // we'll add them at least with conversion to ASCII. + // Not much use until we have storage of display names, + // though. + array('évan', false, 'NicknameInvalidException'), // so far... + array('Évan', false, 'NicknameInvalidException'), // so far... + + // Length checks + array('', false, 'NicknameEmptyException'), + array('___', false, 'NicknameEmptyException'), + array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'), // 64 chars + array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_', 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'), // the _ will be trimmed off, remaining valid + array('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', false, 'NicknameTooLongException'), // 65 chars -- too long + ); + } +} diff --git a/tests/oEmbedTest.php b/tests/oEmbedTest.php new file mode 100644 index 000000000..b5e441c42 --- /dev/null +++ b/tests/oEmbedTest.php @@ -0,0 +1,140 @@ +<?php + +if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { + print "This script must be run from the command line\n"; + exit(); +} + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); +define('STATUSNET', true); + +require_once INSTALLDIR . '/lib/common.php'; + +class oEmbedTest extends PHPUnit_Framework_TestCase +{ + + public function setup() + { + $this->old_oohembed = common_config('oohembed', 'endpoint'); + } + + public function tearDown() + { + $GLOBALS['config']['oohembed']['endpoint'] = $this->old_oohembed; + } + + /** + * Test with oohembed DISABLED. + * + * @dataProvider discoverableSources + */ + public function testoEmbed($url, $expectedType) + { + $GLOBALS['config']['oohembed']['endpoint'] = false; + $this->_doTest($url, $expectedType); + } + + /** + * Test with oohembed ENABLED. + * + * @dataProvider fallbackSources + */ + public function testoohEmbed($url, $expectedType) + { + $GLOBALS['config']['oohembed']['endpoint'] = $this->_endpoint(); + $this->_doTest($url, $expectedType); + } + + /** + * Get default oohembed endpoint. + * + * @return string + */ + function _endpoint() + { + $default = array(); + $_server = 'localhost'; $_path = ''; + require INSTALLDIR . '/lib/default.php'; + return $default['oohembed']['endpoint']; + } + + /** + * Actually run an individual test. + * + * @param string $url + * @param string $expectedType + */ + function _doTest($url, $expectedType) + { + try { + $data = oEmbedHelper::getObject($url); + $this->assertEquals($expectedType, $data->type); + if ($data->type == 'photo') { + $this->assertTrue(!empty($data->url), 'Photo must have a URL.'); + $this->assertTrue(!empty($data->width), 'Photo must have a width.'); + $this->assertTrue(!empty($data->height), 'Photo must have a height.'); + } else if ($data->type == 'video') { + $this->assertTrue(!empty($data->html), 'Video must have embedding HTML.'); + $this->assertTrue(!empty($data->thumbnail_url), 'Video should have a thumbnail.'); + } + if (!empty($data->thumbnail_url)) { + $this->assertTrue(!empty($data->thumbnail_width), 'Thumbnail must list a width.'); + $this->assertTrue(!empty($data->thumbnail_height), 'Thumbnail must list a height.'); + } + } catch (Exception $e) { + if ($expectedType == 'none') { + $this->assertEquals($expectedType, 'none', 'Should not have data for this URL.'); + } else { + throw $e; + } + } + } + + /** + * Sample oEmbed targets for sites we know ourselves... + * @return array + */ + static public function knownSources() + { + $sources = array( + array('http://www.flickr.com/photos/brionv/5172500179/', 'photo'), + array('http://yfrog.com/fy42747177j', 'photo'), + array('http://twitpic.com/36adw6', 'photo'), + ); + return $sources; + } + + /** + * Sample oEmbed targets that can be found via discovery. + * Includes also knownSources() output. + * + * @return array + */ + static public function discoverableSources() + { + $sources = array( + array('http://identi.ca/attachment/34437400', 'photo'), + + array('http://www.youtube.com/watch?v=eUgLR232Cnw', 'video'), + array('http://vimeo.com/9283184', 'video'), + + // Will fail discovery: + array('http://leuksman.com/log/2010/10/29/statusnet-0-9-6-release/', 'none'), + ); + return array_merge(self::knownSources(), $sources); + } + + /** + * Sample oEmbed targets that can be found via oohembed.com. + * Includes also discoverableSources() output. + * + * @return array + */ + static public function fallbackSources() + { + $sources = array( + array('http://en.wikipedia.org/wiki/File:Wiki.png', 'link'), // @fixme in future there may be a native provider -- will change to 'photo' + ); + return array_merge(self::discoverableSources(), $sources); + } +} |